2013-09-28 61 views
1

我有這個問題與PHP,我猜最糟糕的部分是,它的工作正常我的開發環境(php v5.4 )但在Web服務器上的測試/活動網站(php v5.2)中斷。不能使用字符串偏移作爲數組在php5.2中破解,而不是在php5.4中

所以,當我的var_dump我的$ _ POST [「FORMDATA」]我得到一個數組,看起來像這樣:

array(42) { 
    [0] => array(2) { 
     ["name"] => string(2) "id"; 
     ["value"] => string(4) "3972"; 
    } 
    [1] => array(2) { 
     ["name"] => string(2) "action"; 
     ["value"] => string(4) "edit"; 
    } 
... 
} 

爲了區分這一點,我用這個(這個還是有一些變化):

for($i=0;$i<count($_POST["formData"]);$i++) { 
    $data[$_POST["formData"][$i]["name"]] = $_POST["formData"][$i]["value"]; 
} 

所以我最終能與訪問一切:

foreach($data as $key => $value) { 
    echo $key . " = " . $value . "<br />"; 
} 

,輸出:

id = 3972 
action = edit 
... 

因此,再次,這在我的開發服務器上工作得很好,但在實時網站上斷了。我在這裏四處看了一下,發現了很多示例,但似乎很多示例都使用了不完全相同的示例。

這是什麼造成的?它是否有一些設置?這是兩個版本之間的變化嗎?我已經嘗試過其他的一些東西,但是他們都沒有工作,這在測試服務器上有點痛苦(一次上傳一個文件......)。任何簡單的解決方案,或者我必須重建我的腳本?

+1

它是如何「打破」?你有錯誤嗎? PHP 5.2沒有任何語法錯誤。你不用5。4特定的語法,如數組解引用'function_call()['key']'例如... –

+0

是的,我得到「不能使用字符串偏移量作爲數組」錯誤 – MDWar

回答

2

該錯誤表明您使用的字符串就像它是一個數組。我會認爲這是你的for循環。我不完全確定,但$data可能被隱式初始化爲一個空字符串,然後您嘗試解除引用並分配給它。是否重寫它像這樣的幫助?

$data = array();  
foreach($_POST['formData'] as $kvp) { 
    $data[$kvp['name']] = $kvp['value']; 
} 

這段代碼也更快,因爲你不是要求在循環count()

+0

重新配置它,它仍然工作dev但不在測試服務器上。 – MDWar

+0

錯誤發生在哪條線上? –

+0

嗯,這是造成不同的錯誤:提供的foreach 無效的參數() – MDWar

1

事實證明這確實是PHP版本之間的差異,如demonstrated by this handy comparison tool

作爲參考,有些混亂錯誤出現約(PHP 5.4之前)從以下兩個步驟:

  1. 你把你認爲是一個數組變量,但實際上是一個字符串,你訪問它的一個「元素」,例如$foo[1]$foo['bar']。 PHP將此表示爲「獲取字符串的第N個字符」 - $foo[1]表示$foo的第二個字符,而$foo['bar']表示第一個字符,因爲bar轉換爲0
  2. 然後您訪問就好像它是一個數組。較新版本的PHP只需重複步驟1中的1個字符的字符串,但直到PHP 5.4導致了這個醜陋的錯誤。

所以在某些情況下,您的$_POST["formData"]不是一個數組,而是一個字符串。這可能在兩種環境中都會發生,但是錯誤處理的差異掩蓋了它在一個環境中而不是其他環境。

+0

其實只是想通了(我需要讓自己變成一隻橡皮鴨)。我的開發環境是使用serialize()對formData進行AJAX,但測試/活動服務器仍然使用serializeArray()對其進行AJAX,從而導致將數據解釋爲字符串而不是數組。 – MDWar

+0

好吧,無論如何,我通過研究這個東西學到了一些東西,因爲我以前不知道5.4中的這種變化。有一個關於這個答案的變化的解釋:http://stackoverflow.com/a/6588806/157957 – IMSoP

+0

是的,我正在閱讀一堆關於該錯誤的帖子,這就是爲什麼我打擾甚至發佈這個;它對我來說沒有任何意義,因爲我的腳本實際上在他們說不應該工作的地方工作。它沒有被屏蔽,因爲我現在沒有鼠標,所以這是一個痛苦增加了錯誤報告,並在這個瘋狂的8pt字體或任何此事顯示的軌跡板上滾動結果。 – MDWar

相關問題