重定向后PHP $ _POST []无效

时间:2011-06-23 16:12:58

标签: php redirect

我打开诚实的批评和建议。

问题是函数$ _POST [void]在重定向后有效。 Quotes.add.php是一个指向quotes.done.php的表单,提交给mysql并重定向回带引号$ msg的quotes.add.php并重置为再次填写。
是header();在这种情况下最好的方法?

quotes.done.php

else{
    include 'data.php';
    $query = "INSERT INTO quotes (`id`, `quotes`, `artist`, `date`) VALUES ('null', '$_POST[text]', '$_POST[artist]', 'null')"; 
    $result = mysql_query($query) or die (mysql_error());

    $_POST['void'] = "$_POST[artist] Was Added Successfully to database";   
    unset ($_POST['artist']);       

    //var_dump($_POST['void']);
    //exit;             
    header ("location: quotes.add.php");
    exit;   
} 

quotes.add.php

if (isset($_POST['void'])) {
    $msg = $_POST['void'];  
}else{
    $msg = "Please insert artist";      
}   

4 个答案:

答案 0 :(得分:1)

如果你进行重定向,我认为你必须使用$ _SESSION。 我会这样做:

session_start();
$_SESSION['msg'] =  "$_POST[artist] Was Added Successfully to database";
header ("location: quotes.add.php");
exit;  

然后

session_start();
if (isset($_SESSION['msg'])) {
    $msg = $_SESSION['msg'];  
    unset($_SESSION['msg'];
}else{
    $msg = "Please insert artist";      
}    

答案 1 :(得分:1)

这是干净,正确,安全的方式:

<强> quotes.done.php

<?php
else{
    include 'data.php';

    // escape the input, to avoid SQL injection
    $text   =   mysql_real_escape_string($_POST['text']);
    $artist =   mysql_real_escape_string($_POST['artist']);

    $query  = "INSERT INTO quotes (`id`, `quotes`, `artist`, `date`) VALUES ('null', '{$text}', '{$artist}', 'null')";
    $result = mysql_query($query);

    // always set your variables to a default value
    $success = false;

    // did the query execute successfully?
    if($result){
        $success = true;
    }

    header('Location: quotes.add.php?result=addedquote&amp;artist='.urlencode($_POST['artist']).'&amp;success='.urlencode($success));
    exit;
}
?>

<强> quotes.add.php

<?php
$msg = '';
if(isset($_GET['result']) && $_GET['result'] == 'addedquote') {
    $artist     =   htmlentities(urldecode($_GET['artist']), ENT_QUOTES, 'UTF-8', false);
    $success    =   (bool) urldecode($_GET['success']);
    if($success){
        $msg = "$artist Was Added Successfully to database";
    } else{
        $msg = "Failed to Add $artist to database";
    }
} else{
    $msg = "Please insert artist";      
}
?>

这里有几点需要注意:

  1. 如果您没有使用包装器来运行带有参数化语句的数据库查询,那么至少应使用mysql_real_escape_string()来删除讨厌的内容以防止SQL注入。

    < / LI>
  2. 如其他人header()所述,我们会执行GET请求,因此您无法在要重定向的页面上获取$_POST[void]。这就是为什么你会在你的网址上使用变量将它们转移到重定向的页面,然后用$_GET获取它们。

  3. $_POST[somename]$_POST['somename']是两回事。它们会工作,因为PHP会尝试查看是否有一个名为somename的常量,如果没有,你很幸运,但如果有一个,那么所有的天空都会掉下来。

    < / LI>

答案 2 :(得分:0)

如果要保留$ _POST变量,请不要重定向。重定向导致客户端的浏览器仅使用$ _GET参数重新请求页面。

将记录保存到数据库中。获取新记录ID,重定向到页面并传入ID。然后使用ID获取并显示记录。

答案 3 :(得分:0)

重定向不会将值发布到页面。你可以使用session或GET。

$message = urlencode("$_POST[artist] Was Added Successfully to database");
header ("location: quotes.add.php?message=" . $message);

在quotes.add.php页面上

echo $_GET['message'];