2014-02-11 68 views
0

我遇到超級全局$_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錯誤?

任何人都可以幫忙嗎?

謝謝。

+1

是的,它始終可用。這並不意味着它會一直有你想要的確切內容。 –

+3

您只是將用戶從script2重定位到3,實際上並未發送有效的POST請求,對嗎? – kero

+0

執行重定向時,表單輸入不會被複制。 – Barmar

回答

2

header(...)行告訴瀏覽器導航離check.phpok.php。此時瀏覽器將發出GET請求,$_POST將不再可用。

要更好地理解發生了什麼,請查看瀏覽器Web檢查器中的「網絡」選項卡。


這就是說,給更多關閉您的問題,也許提供瞭解決方案,認爲:

如果您確實需要重定向(即需要調用header),並不能includerequire ,那麼你可以在會話中存儲var:$ _SESSION ['pd'] = $ _POST ['pd']。

HTTP協議沒有狀態,這就是爲什麼你有會話和cookie在你的處置。

+1

這是正確的答案,你不能重定向POST數據。您需要轉換髮布的數據以獲取並附加到您重定向到的URL或重構代碼,以便重定向不是必需的 – edmondscommerce

0

您不會將腳本2中的$_POST發送到腳本3。如果你從不使用它,你的$_SESSION也沒用。您可以將post變量放入一個會話中,然後在script3中進行訪問。

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

Script3 echo $_SESSION['pd'];

0

你在做什麼是:

  1. GET請求SCRIPT1
  2. POST請求通過形式
  3. 重定向響應SCRIPT2
  4. GET請求script3

形式POST到SCRIPT2,發佈數據僅在該請求是在$_POST可用,在SCRIPT2。該腳本對這些數據沒有太大作用,並且不會將其保存到任何位置,而是將客戶端重定向到另一個腳本。客戶端對腳本3發出全新的請求。 script3無權訪問發佈到以前腳本的POST數據,因爲這是一個全新的請求。

它與超全球無關。