PHP$\u POST[]在重定向后未作废

PHP$\u POST[]在重定向后未作废,php,redirect,Php,Redirect,我正在向诚实的批评和建议敞开心扉 问题在于函数$\u POST[void]在重定向后有效。Quotes.add.php是一个表单,它指向Quotes.done.php,提交到mysql并重定向回Quotes.add.php,带有echo$msg并重置以再次填写。 是header();在这种情况下最好的方法是什么 quotes.done.php else{ include 'data.php'; $query = "INSERT INTO quotes (`id`, `quotes

我正在向诚实的批评和建议敞开心扉

问题在于函数$\u POST[void]在重定向后有效。Quotes.add.php是一个表单,它指向Quotes.done.php,提交到mysql并重定向回Quotes.add.php,带有echo$msg并重置以再次填写。
是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";      
}   

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


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

如果进行重定向,我认为您必须使用$\u会话。 我会:

然后

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

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

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

echo $_GET['message'];

这是清洁、正确和安全的方法:

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

基于header()的重定向会导致浏览器对重定向到的URL发出GET请求。重定向时不发送POST值。此外,对_POST数组所做的任何更改(如在成功消息中所做的更改)都不会粘贴到表单或重定向中。这是一个无用的操作。您是否正在使用某种框架来通过会话持久化$\u POST数组?你在其他地方访问它吗?颤抖。。。厌倦了解释此类代码的漏洞:/有点离题了,但您需要在mysql查询上设置一些安全性!当我只是为了理解php功能而进行个人操作时,似乎没有理由添加安全性。你可以从书本中学到的东西只有这么多。它是有效的,但你有一个额外的查询,他只需要传递一条消息。要添加到你的答案中,你需要
session\u start()
设置和阅读会话。为什么页面刷新$\u POST[]即使在未设置之后也可以为真,而$\u session[]保持为假?嗯,需要做研究。谢谢你的帮助!谢夫,我感谢你的耐心。您的评论已经被注意到了,希望我在以后的问题中不会再犯同样的错误。@crash\u cource:当然。我不想插嘴解释,因为代码有点“乱七八糟”,但我没有看到其他人注意到这些东西,所以我只好这么做。:)继续尝试和学习,但在部署某些东西之前,请您信任的有足够经验的人至少对安全问题进行一次快速审核。
<?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";      
}
?>