PHP无法通过干净网址上的问号传递

时间:2018-12-09 22:33:32

标签: php html

我需要一些帮助,因为我对if语句的get pass遇到了问题。当我在同一页面上时,我正在使用干净的URL创建类似create_newsletter.php?template=new的函数。

当我尝试这样做时:

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";
    }
}

它不会通过此行:

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

这是完整的代码:

<?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>

我不知道在使用header("Location:)时如何传递if语句。我也尝试过if ($template),但没有通过。

我想做的是连接到我的php页面create_newsletter.php。我想输入我的全名文本框messagename,然后在subject文本框中输入主题,然后单击一个按钮。当我单击按钮时,由于要在两个文本框控件create_newsletter.php?template=newmessagename上禁用,我想重定向到subject,然后添加iframe以允许我访问另一个PHP页面,这样我就可以在屏幕中间写新闻稿。

您能给我一个例子吗,当我单击一个提交按钮将我重定向到create_newsletter.php?template=new以便可以禁用这些控件和添加iframe?

谢谢。

3 个答案:

答案 0 :(得分:1)

您正在if(isset($_GET['template'])条件内检查if(isset($_POST['submit'])),但是重定向不会发送发布请求。

这应该有效:

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";
}

但是,如果您需要在重定向中发出POST请求,则需要打印<form>并在客户端提交,或者在下面的示例中使用$ _SESSION:

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";
}

答案 1 :(得分:0)

在检查if(isset($_POST['submit']))时,您正在重定向,然后才能到达if(isset($_GET['template'])

但是我假设您希望它能够运行,因为将设置$_GET['template']。尽管您的代码存在问题,但当您重定向时,将未设置$_POST['submit'],因此不会在if(isset($_POST['submit']))块中执行任何操作,包括{{1} }。

这是因为POST请求不是持久性的,并且如果您重新加载或重定向该请求将不会保留

您应该考虑以下内容:

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




在if(isset($ _ GET ['template'])


中访问$ messagename和$ subject 如果要访问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"; } ?> 中的$messagename$subject,则可以在URL中传递它们。因为当您重定向时,将不会设置if(isset($_GET['template'])变量,因此它们将消失。您可以这样做:

$_POST

答案 2 :(得分:0)

OP的代码中有两个错误,不幸的是,官方接受的答案也反映了这一错误。需要在使用sleep()的语句后附加分号,并在用于测试$ _GET ['template']的语句中附加括号。

实际上,不需要为了使$ _GET ['template']的值延迟而提交代码而将sleep()提供的信号处理复杂化。可以省略sleep()并稍微更改代码,如下所示:

<?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;
}


另外,除了使用$ _GET之外,还可以使用$ _SERVER ['QUERY_STRING'],如下所示:

<?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>


parse_url()的component参数启用此函数以返回查询字符串。也可以选择雇用parse_str(),如下所示:

<?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;
}
?>


注意:始终将POST或GET中的数据视为已污染,而不是直接将数据分配给变量并使用该变量,这一点非常重要。使用htmlentities()是尝试防止可能的安全问题的一种方法。