2011-05-03 59 views
0

我環顧四周(這裏在stackoverflow和谷歌),但我似乎無法弄清楚爲什麼我的形式值消失時,我倒退,然後在網絡上轉發調查。我正在試驗三頁。如果我通過調查回答每個問題,然後向後返回,則值保留。但是,如果我在第一頁上重新回答問題並按提交,我的第二頁和第三頁的值就不再填寫。然而,列在最上面的數組仍顯示出來。在用戶改變它們之前,表單中的PHP代碼不應該重新填充會話數組中的值?來回填充表單字段時網頁

我也知道我用於將所有POST值存儲到會話中的方法是危險的,但我打算只將它寫入一個普通的.txt文件。感謝您的任何幫助!

<?php 
// begin the session 
ini_set('session.cache_limiter', 'private'); 
session_start(); 
// Take each input name and create a variable for it 
foreach($_POST as $k=>$v) { 
$_SESSION[$k]=$v; 
} 
?> 
<html> 
<head> 
<title>This is a test</title> 
</head> 
<body> 
<form method="POST" name="Gender" action="page2.php"> 
<p>What is your gender?</p> 
<input type="radio" name="gender" value="male" id="male" <?php if (isset($_SESSION['male'])) { echo 'checked="checked"'; } else { echo $gender = ''; } ?>> <label for="male">Male</label> <br /> 
<input type="radio" name="gender" value="female" id="female" <?php if (isset($_SESSION['female'])) { echo 'checked="checked"'; } else { echo $gender = ''; }?>> <label for="female">Female</label><br /> 

<input type="submit"> 
</form> 
</body> 
</html> 

第2頁

<?php 
// begin the session 
ini_set('session.cache_limiter', 'private'); 
session_start(); 
// Take each input name and create a variable for it 
foreach($_POST as $k=>$v) { 
$_SESSION[$k]=$v; 
} 
// Prints out the session array 
print('<input type="hidden" name="' . $k . '" value="' . $v . '" />'); 
Print_r ($_SESSION); 
?> 
<html> 
<head> 
<title>This is a test</title> 
</head> 
<body> 
<form method="POST" name="lolz" action="page3.php"> 
<p>What is your lolz?</p> 
<input type="radio" name="lolz" value="YesLOLZ" id="YesLOLZ" <?php if (isset($_SESSION['YesLOLZ'])) { echo 'checked="checked"'; } else { echo $lolz = ''; } ?>> <label for="YesLOLZ">YesLOLZ</label> <br /> 
<input type="radio" name="lolz" value="NoLOLZ" id="NoLOLZ" <?php if (isset($_SESSION['NoLOLZ'])) { echo 'checked="checked"'; } else { echo $lolz = ''; } ?>> <label for="NoLOLZ">NoLOLZ</label><br /> 

<input type="submit"> 
</form> 
</body> 
</html> 

第3頁

<?php 
// begin the session 
ini_set('session.cache_limiter', 'private'); 
session_start(); 
// Take each input name and create a variable for it 
foreach($_POST as $k=>$v) { 
$_SESSION[$k]=$v; 
} 
// Prints out the session array 
print('<input type="hidden" name="' . $k . '" value="' . $v . '" />'); 
Print_r ($_SESSION); 
?> 
<html> 
<head> 
<title>This is a test</title> 
</head> 
<body> 
<form method="POST" name="lolz" action="page3.php"> 
<p>What is your roflz?</p> 
<input type="checkbox" name="roflz[]" value="Yesroflz" id="Yesroflz" <?php if (isset($_SESSION['Yesroflz'])) { echo 'checked="checked"'; } else { echo ''; } ?>> <label for="Yesroflz">Yesroflz</label> <br /> 
<input type="checkbox" name="roflz[]" value="Noroflz" id="Noroflz" <?php if (isset($_SESSION['Noroflz'])) { echo 'checked="checked"'; } else { echo ''; } ?>> <label for="Noroflz">Noroflz</label><br /> 

<input type="submit"> 
</form> 
</body> 
</html> 

回答

0

如果這不起作用,請截圖/複製並粘貼出現在響應於print_r($_SESSION); &的迴應中,即使它們只是通知級別,也會報告出現的任何PHP錯誤。

到目前爲止,您已經做了以下內容:

  • 啓動會話必須在頁面上的第一件事是成功的。你應該得到這個錯誤警告:session_start()[function.session-start]:不能發送會話cookie - 已經發送的頭文件...通過移動session_start(),這是固定的。
  • 您正在將$ _POST數組複製到每一頁上的$ _SESSION。
  • 您確保在檢查值時始終如一地使用$ _SESSION超全局而非$ _POST超全局。

現在你需要:

  • 確保您使用的是foreach環和相應的變量名輸出隱藏的輸入。您應該會看到一條錯誤消息:注意:未定義的變量:第9行中的k ...等等
  • 確保在檢查字段值時使用正確的數組鍵。 $ _POST(因此$ _SESSION)數組中的鍵將與inputname屬性匹配,而該值將與inputvalue屬性相匹配。

如果你還沒有得到任何這些錯誤的嘗試加入error_reporting(E_ALL); 5號線(session_start();後右)。此行只能在開發過程中使用,並在釋放代碼時取出。

<?php 
    // begin the session 
    ini_set('session.cache_limiter', 'private'); 
    session_start(); 
    // Take each input name and create a variable for it 
    foreach($_POST as $k=>$v) { 
     $_SESSION[$k]=$v; 
    } 
    // Prints out the session array 
    print_r($_SESSION); 
?> 
<html> 
<head> 
    <title>This is a test</title> 
</head> 
<body> 
    <form method="POST" name="Gender" action="page2.php"> 
     <p> 
      What is your gender? 
     </p> 
     <input type="radio" name="gender" value="male" id="male" <?php if (isset($_SESSION['gender']) && $_SESSION['gender'] == "male") { echo 'checked="checked"'; } ?>> 
     <label for="male"> 
      Male 
     </label> 
     <br /> 
     <input type="radio" name="gender" value="female" id="female" <?php if (isset($_SESSION['gender']) && $_SESSION['gender'] == "female") { echo 'checked="checked"'; } ?>> 
     <label for="female"> 
      Female 
     </label> 
     <br /> 
     <input type="submit"> 
    </form> 
</body> 
</html> 

頁2

<?php 
    // begin the session 
    ini_set('session.cache_limiter', 'private'); 
    session_start(); 
    // Take each input name and create a variable for it 
    foreach($_POST as $k=>$v) { 
     $_SESSION[$k]=$v; 
    } 
    // Prints out the session array 
    print_r($_SESSION); 
?> 
<html> 
<head> 
    <title>This is a test</title> 
</head> 
<body> 
    <form method="POST" name="lolz" action="page3.php"> 
     <?php 
      foreach($_SESSION as $k=>$v) { 
       echo '<input type="hidden" name="' . $k . '" value="' . $v . '" />'; 
      } 
     ?> 
     <p> 
      What is your lolz? 
     </p> 
     <input type="radio" name="lolz" value="YesLOLZ" id="YesLOLZ" <?php if (isset($_SESSION['lolz']) && $_SESSION['lolz'] == "YesLOLZ") { echo 'checked="checked"'; } ?>> 
     <label for="YesLOLZ"> 
      YesLOLZ 
     </label> 
     <br /> 
     <input type="radio" name="lolz" value="NoLOLZ" id="NoLOLZ" <?php if (isset($_SESSION['lolz']) && $_SESSION['lolz'] == "NoLOLZ") { echo 'checked="checked"'; } ?>> 
     <label for="NoLOLZ"> 
      NoLOLZ 
     </label> 
     <br /> 
     <input type="submit"> 
    </form> 
</body> 
</html> 

頁3

<?php 
    // begin the session 
    ini_set('session.cache_limiter', 'private'); 
    session_start(); 
    // Take each input name and create a variable for it 
    foreach($_POST as $k=>$v) { 
     $_SESSION[$k]=$v; 
    } 
    // Prints out the session array 
    print_r($_SESSION); 
?> 
<html> 
<head> 
    <title>This is a test</title> 
</head> 
<body> 
    <form method="POST" name="lolz" action="page3.php"> 
     <?php 
      foreach($_SESSION as $k=>$v) { 
       echo '<input type="hidden" name="' . $k . '" value="' . $v . '" />'; 
      } 
     ?> 
     <p> 
      What is your roflz? 
     </p> 
     <input type="checkbox" name="roflz" value="Yesroflz" id="Yesroflz" <?php if (isset($_SESSION['roflz']) && $_SESSION['lolz'] == "Yesroflz") { echo 'checked="checked"'; } ?>> 
     <label for="Yesroflz"> 
      Yesroflz 
     </label> 
     <br /> 
     <input type="checkbox" name="roflz" value="Noroflz" id="Noroflz" <?php if (isset($_SESSION['roflz']) && $_SESSION['lolz'] == "Noroflz") { echo 'checked="checked"'; } ?>> 
     <label for="Noroflz"> 
      Noroflz 
     </label> 
     <br /> 
     <input type="submit"> 
    </form> 
</body> 
</html> 
+0

謝謝,我試過了,還有jeroen的建議,我的數值仍然丟失。但是,如果我打印$ _SESSION,它有關係嗎?我最終會刪除它,但我使用它來查看值 – OneBigNewbie 2011-05-04 14:31:16

+0

哎呀,我沒有仔細閱讀,看到了錯誤的地方(這不是關於print/echo,即使$ _SESSION可能不是,$ _POST也是空的)嘗試我更新的答案,以取代行打印(...)。但我認爲你應該使用我的兩個代碼塊,除非我真的很困惑你想用無線電領域做什麼:-) – morewry 2011-05-04 15:32:37

+0

With無線電領域(和複選框)我試圖用來重新選擇所選答案,如果參與者已經回答了他們(通過從會議中檢索)。我已經嘗試過使用$ _SESSION而不是$ _POST,因爲$ _SESSION應該是持久的,但如果他們在page1.php上更改了他們的答案,它不會自動選擇page2.php上的響應。最終目標是減少使用此表單的人的負擔,因此如果他們只想更改一個答案,他們不必重新選擇所有答案。 – OneBigNewbie 2011-05-05 14:06:31

2

您的會話不工作,因爲頭已經被髮送。您在session_start聲明之前正在輸出html,如果要使用會話,則不能這樣做。

只需將您的html標記下移到第一個php塊下方,並確保在打開php標記之前沒有空格或換行符。

編輯:根據您的意見,我認爲你需要做以下的表格的所有PHP文件的開頭:

  1. 開始讀會話
  2. 閱讀$_POST值並在您的表單,您設置添加/覆蓋它們在你的$_SESSION變量
    (現在會話包含新發布的和以前發佈的信息)
  3. 使用$_SESSION代替$_POST變量值,所以:
    <?php if (isset($_SESSION['YesLOLZ'])) { echo 'checked="checked"'; }
    代替:
    <?php if (isset($_POST['YesLOLZ'])) { echo 'checked="checked"'; }

還要注意的是變量$k$v並不真正存在循環while之外;他們確實存在,但包含最後$_POST變量的信息,可能是發送按鈕,所以你不能真正使用它們。

+0

所以這樣? '<?php //開始會話 ini_set('session.cache_limiter','private'); session_start(); ?> ' 我試着在session_start語句後放置'ini_set('session.cache_limiter','private');'然後緩存刷新。它似乎沒有解決問題,但(我也實施了rhyaniwyn的建議)。 – OneBigNewbie 2011-05-04 14:27:21

+0

@OneBigNewbie你是否在'session_start()'之後嘗試了'var_dump($ _ SESSION)'? – jeroen 2011-05-04 15:07:23

+0

在我看來,我的問題可能措辭不佳(我很抱歉)。會話確實捕獲跨頁面的數據。我的問題是如何重新填充表單(例如選擇單選按鈕),如果用戶選擇了它們。目標是減少用戶的工作量,如果他們想要更改以前的一個答案,他們不必重新回答所有問題。 – OneBigNewbie 2011-05-05 14:16:56

0

問題是,您在會話中存儲答案,但是當您想要查看是否應該自動填寫某個輸入時不檢查答案。帖子值不是持續的,所以如果你回去並從第一頁重新開始測驗,那麼只有第一頁的值將在帖子變量中。當你提交第二頁時,你實際上已經失去了頁面1中POST的所有內容,但是因爲你將它存儲在會話中,你仍然可以訪問它。

+0

因此,如果我回顯會話變量,它理論上應該返回值?像這樣? ';?if(isset($ _ SESSION ['Yesroflz'])){echo'checked =「checked」'; } else {echo''; '?「。如果是這種情況,它不起作用。 :( – OneBigNewbie 2011-05-05 13:40:52