使用$ _POST超全局时未定义的索引

时间:2014-02-11 11:56:25

标签: php

我对超全球$_POST存在概念性问题 它应该随时可用,无需任何声明。

我有三个简单的脚本:


脚本1 - home.php

<?php
SESSION_START();
?>
<html> <head> <title>Home</title> </head>
<body>
<!-- this form will pass $_POST["pd"] to check.php -->
<form name="input" action="check.php" method="post"> 
<input type="password" name="pd" size="15" maxlength="14">
<input type="submit" value="Submit">
</form>
</body> 
</html> 
?>

脚本2 - check.php

<?php
SESSION_START();
if ($_POST["pd"] == "hello") 
{    header( 'Location: http://127.0.0.1/PP/ok.php' ) ;  }
?>

脚本3 - ok.php

<?php
SESSION_START();
foreach($_POST as $key => $value) {
echo $key;
echo " = ";
echo $value;
}
echo "password = ".$_POST["pd"];
?>

<html> <head> <title>PasswordOK</title> </head>
 <body>
   Password OK
 </body>
</html>

脚本1:显示一个表单,我输入密码hello并将其提交给脚本2。

脚本2:检查超级全局$_POST["pd"] == "hello",因为它是正确的,它会将我发送到脚本3.它不会发出Undefined index错误。

脚本3:foreach循环应该访问$_POST["pd"]超全局并显示pd = hello。它没有显示任何内容 - 它没有给我Undefined index错误。

echo "password = ".$_POST["pd"];应显示password = hello。它会显示password =并显示Undefined index错误。

HTML块正常运行并显示日期和消息。


这是我的问题。

由于$_POST["pd"]是超全球,因此永远不会引起Undefined index错误 那么为什么呢? 你的许多答案都说我应该检查$_POST["pd"]是否确实存在 - 但我不必为脚本2做那个,所以我为什么要为脚本3做那个?

我错过了什么吗?

$_POST["pd"]是超全球还是不是?如果是,那为什么它会给出Undefined index错误?

有人可以帮忙吗?

感谢。

3 个答案:

答案 0 :(得分:2)

header(...)行告诉浏览器check.php 导航到ok.php。浏览器此时会发出GET个请求,$_POST将不再可用。

要更好地了解正在发生的事情,请查看浏览器Web检查器中的“网络”标签。


那就是说,为了更好地解决你的问题并提供解决方案,请考虑:

  

如果你绝对需要重定向(即需要调用header)而不能includerequire,那么你可以将var存储在会话中:$ _SESSION ['pd' ] = $ _POST ['pd']。

     

HTTP协议没有状态,这就是您可以使用会话和cookie的原因。

答案 1 :(得分:0)

您没有将脚本2中的$_POST发送到script3。如果你从不使用它,你的$_SESSION也没用。您可以将post变量放在会话中,然后可以在script3中访问它。

SCRIPT2: $_SESSION['pd'] = $_POST['pd'];

Script3 echo $_SESSION['pd'];

答案 2 :(得分:0)

您正在做的是:

  1. 获取script1
  2. 的请求
  3. 通过表单
  4. 向script2发出POST请求
  5. 重定向回复
  6. 获取对script3的请求
  7. 表单POST到脚本2,发布的数据仅在此请求的$_POST中可用,在script2中。该脚本对该数据没有太大作用,并且不会将其保存在任何地方,而是将客户端重定向到另一个脚本。客户端对script3执行了全新的请求。 script3无法访问POST到上一个脚本的POST数据,因为这是一个全新的请求。

    它与superglobals没有任何关系。