2012-03-14 53 views
0

女士們,先生們,PHP會議似乎並沒有保持提交的表單值

我發現了一個很奇怪的行爲,我無法解釋:

假設你有

  • 多個表單元素的頁面,可能由php提供
  • 每個表單都有一個唯一名稱的輸入字段
  • 在該頁面的開始會話將開始
  • 你存儲在$ _SESSION變量

這樣每貼的輸入值:

<?php 
    session_start(); 
    $_SESSION["Test"] = "Hello"; 
    foreach ($_POST as $name => $value) { 
    //echo "_POST: " . $name . ":" . $value . "<br>"; 
    $_SESSION[$name] = $value; 
    //session_commit(); 
    } 
    for ($i = 0; $i < 10; $i++) { 
    echo "<form action=\"multiform.php\" method=\"post\">Value for input $i: <input type=\"text\" name=\"input".$i."\"></form>\n"; 
    } 
    print_r($_SESSION); 
?> 

如果使用上面的代碼中,只有「測試」 =「你好」會後的持續刷新頁面。無論哪個輸入值已由foreach發佈並存儲到會話中,它將在刷新後消失。

現在最有趣的部分:

如果名稱添加到這樣的形式...

echo "<form name=\"form$i\" action=\"multiform.php\" method=\"post\">Value for input $i: <input type=\"text\" name=\"input".$i."\"></form>\n"; 

...張貼的值將被保存即可。

但是爲什麼? 表單名稱與$ _SESSION的持久性有什麼關係?

編輯:如果輸入的名稱僅包含數字,這個問題似乎arraise:

<input type=\"text\" name=\"$i\"> 

感謝clarifyng這一點。 揚

EDIT2:

如果$ _SESSION數組存取密鑰僅包含數字,PHP顯然不堅持的價值觀,所以這樣的事情,也不會被保存:

<?php 
session_start(); 

for ($i = 1; $i < 10; $i++) 
{ 
    $_SESSION[$i] = "Hello $i"; 
} 
?> 

混亂的部分是,如果你只是在for循環,該宏將會做一個

print_r($_SESSION) 

升展1-10囉1..10 ...... 雖然,刷新之後就不見了......

+0

嗯。也許,它是以表單形式存儲值的瀏覽器。 'session_start'可以在每次重新加載時清除會話(不確定,從未使用會話)。嘗試在不同的瀏覽器中測試。 – kirilloid 2012-03-14 11:08:57

+0

我做到了。全部都一樣。 但我剛剛發現,如果輸入名稱只包含數字,它們將不會持續在會話中! – janhamburg 2012-03-14 11:15:47

+0

multiform.php中有什麼?我通過將表單直接發送回自我來測試它,並且它工作正常。 – budwiser 2012-03-14 11:18:27

回答

3

的$ _SESSION關聯數組中的鍵都受到同樣的限制,如PHP正變量名即它們不能以數字開始,並且必須以字母或下劃線開頭。

http://php.net/manual/en/session.examples.basic.php

+0

就是這樣!謝謝 – janhamburg 2012-03-14 12:03:49

+0

唯一令人困惑的是,在$ _SESSION上執行print_r之後,它打印出值! – janhamburg 2012-03-14 12:04:25

+0

這些值僅在腳本執行過程中位於$ _SESSION變量中。他們不存儲。 PHP試圖在$ _SESSION中寫入「refret」值時觸發'PHP Notice'。 – 2012-03-14 12:11:27

0

發現可能的問題是整數形式的名稱作爲您的編輯意見建議?如果使用PHP序列化一個表單,最終會得到一個名稱爲整數的變量,PHP的變量名稱不能是普通數字。如果您的問題沒有繼續使用命名約定(如<input type=\"text\" name=\"sometext_$i\">),則應停止將簡單數字用作表單元素名稱。

給表單域描述性名稱也是一個好主意。名爲「1」或「2」的表單字段並不真正告訴你關於包含值的任何信息。

0

這是正確的; you can not use a numeric-only key in $_SESSION。試圖與使用error_reporting上最高水平的display_errors設置爲true,將產生一個通知,這樣做:

PHP Notice: Unknown: Skipping numeric key 0 in Unknown on line 0 

它不會將其存儲在$ _SESSION數組中,但實際上沒有會話。儘管奇怪的行爲,通知足夠描述。例如,修復很簡單,只需在$_SESSION['numbers']中創建一個數組。

<?php 
session_start(); 

for ($i = 1; $i < 10; $i++) { 
    $_SESSION['numbers'][$i] = "Hello $i"; 
} 

var_dump($_SESSION['numbers']); 
+0

你的解釋好一點,但你是第二。抱歉。 – janhamburg 2012-03-14 12:03:29

+0

我不得不多寫;)不用擔心,交配。 – 2012-03-14 12:08:33