Robert Jones
Robert Jones

Reputation: 408

PHP cant get passed on question mark on clean url

I need some help with my code as I have got a problem with get pass on the if statement. I am working on the clean url to create a function like create_newsletter.php?template=new when I am on the same page.

When I try this:

if(isset($_POST['submit']))
{

    sleep(2)
    header("Location: http://example.com/newsletters/create_newsletter.php?template=new");

    if(isset($_GET['template'])
    {
        echo "hello robert now you are working on the template";
    }
}

It will not get pass on this line:

if(isset($_GET['template'])

Here is the full code:

<?php

$template = "";

if(isset($_GET['template']))
{
    $template = $_GET['template'];
}


if(isset($_POST['submit']))
{
    sleep(2)
    $messagename = $_POST['messagename'];
    $subject = $_POST['subject'];
    header("Location: http://example.com/newsletters/create_newsletter.php?template=new");

    if(isset($_GET['template'])
    {
        echo "hello robert now you are working on the template";
    }
}
?>

<form method="post">
    <input type="text" name="messagename" value="">
    <input type="text" name="subject" value="">

    <input type="submit" name="submit" name="submit" class="btn btn-primary" value="Next Step">
</form>

I have got no idea how I can get pass on the if statement when I am using header("Location:). I have also tried if ($template) but it doesn't get pass.

What I am trying to do is to connect to my php page create_newsletter.php. I want to input my full name the textbox called messagename and input the subject in the subject textbox then click on a button. When I click on a button, I want to redirect to create_newsletter.php?template=new as I want to disable on two textbox controls messagename and subjectthen add the iframe to allow me to get access to another php page so I could write the newsletter in the middle of the screen.

Can you please show me an example what is the best way forward that I could use to get pass on the if statement when I click on a submit button to redirect me to create_newsletter.php?template=new so I could disable these controls and add the iframe?

Thank you.

Upvotes: 0

Views: 89

Answers (3)

slevy1
slevy1

Reputation: 3820

There are two errors in the OP's code which unfortunately the officially accepted answer reflects as well. A semi-colon needs to be appended to the statement that uses sleep() and an extra parenthesis is needed in the statement that tests for $_GET['template'].

In truth, one does not need to complicate the code with signal processing offered by sleep() in order to delay submission of the POSTed data just to determine the value of $_GET['template']. One could omit sleep() and alter the the code slightly, as follows:

<?php
if( isset($_POST['submit']) )
{
    $mess = htmlentities($_POST['mess']);
    $subject = htmlentities($_POST['subject']);
    header("Location: http://localhost/exp/create_newsletter.php?template=new");
    exit;
}
else
if( isset( $_GET['template']))
{
    echo "hello robert now you are working on the template";
    exit;
}


Also, instead of using $_GET another alternative is to use $_SERVER['QUERY_STRING'], as follows:

<?php
$qs = parse_url($_SERVER['PHP_SELF'], PHP_URL_QUERY);

if( $qs == 'template=new' ){
    $template = split("=",$qs)[1];
    echo "hello robert now you are working on the template";
    exit;
}
else
if(isset($_POST['submit']))
{
    sleep(2);
    $mess = htmlentities($_POST['mess']);
    $subject = htmlentities($_POST['subject']);
    header("Location: http://localhost/exp/create_newsletter.php?template=new");
    exit;
}
?>
<html>
<head><title>test</title></head>
<body>
<form method="post" action="">
    <input type="text" name="mess" value="">
    <input type="text" name="subject" value="">
    <input type="submit" name="submit" class="btn btn-primary" value="Next Step">
</form>
</body>
</html>


The component parameter of parse_url() enables this function to return the query string. One may also opt instead to employ parse_str(), as follows:

<?php
$queries = "";
parse_str($_SERVER['QUERY_STRING'], $queries);

if( isset($queries['template']) && ($queries['template'] == 'new'))
{
    $template = $queries;
    echo "hello robert now you are working on the template";
    exit;
}
else
if(isset($_POST['submit']))
{
    sleep(2);
    $mess = htmlentities($_POST['mess']);
    $subject = htmlentities($_POST['subject']);
    header("Location: http://localhost/exp/create_newsletter.php?template=new");
    exit;
}
?>


Note: it is very important to always treat data from a POST or GET as tainted instead of directly assigning the data to a variable and using that variable. Using htmlentities() is one way to attempt to prevent possible security issues.

Upvotes: 0

Enrico Dias
Enrico Dias

Reputation: 1487

You are checking if(isset($_GET['template']) inside the if(isset($_POST['submit'])) condition, but the redirect doesn't send a post request.

This should work:

if(isset($_POST['submit']))
{
    sleep(2)
    $messagename = $_POST['messagename'];
    $subject = $_POST['subject'];
    header("Location: http://example.com/newsletters/create_newsletter.php?template=new");

}

if(isset($_GET['template'])
{
    echo "hello robert now you are working on the template";
}

But if you need to make a POST request in the redirect, you would need to print a <form> and submit it in the client side, or use $_SESSION in the example bellow:

session_start();
if(isset($_POST['submit']))
{
    sleep(2)
    $_SESSION['messagename'] = $_POST['messagename'];
    $_SESSION['subject'] = $_POST['subject'];
    header("Location: http://example.com/newsletters/create_newsletter.php?template=new");

}

if(isset($_GET['template'])
{
    // $_SESSION['messagename'] and $_SESSION['subject'] are available here
    echo "hello robert now you are working on the template";
}

Upvotes: 1

Chris
Chris

Reputation: 424

When you are checking if(isset($_POST['submit'])), you are redirecting before you can reach the if(isset($_GET['template']).

But I am assuming you would expect this to run because $_GET['template'] will be set. Although, the problem with your code is that when you redirect, $_POST['submit'] will not be set, therefor it will not execute anything in the if(isset($_POST['submit'])) block, including if(isset($_GET['template']).

This is because a POST request is not persistant, and will not remain if you reload, or redirect

You should consider the following:

if(isset($_POST['submit']))
{
    sleep(2)
    $messagename = $_POST['messagename'];
    $subject = $_POST['subject'];
    header("Location: http://example.com/newsletters/create_newsletter.php?template=new");

}

if(isset($_GET['template'])
{
    echo "hello robert now you are working on the template";
}
?>




Accessing the $messagename and $subject in the if(isset($_GET['template'])


If you want to access the $messagename and $subject in the if(isset($_GET['template']), you can pass them in the URL. Because when you redirect, no $_POST variables will be set, they will go away. You can accomplish this by doing:

if(isset($_POST['submit']))
{
    sleep(2)
    $messagename = $_POST['messagename'];
    $subject = $_POST['subject'];
    header("Location: http://example.com/newsletters/create_newsletter.php?template=new&messagename=".$messagename."&subject=".$subject);

}

if(isset($_GET['template'])
{
    $messagename = $_GET['messagename'];
    $subject = $_GET['subject'];
    echo "hello robert now you are working on the template";
}
?>

Upvotes: 0

Related Questions