2010-06-03 104 views
1

我遇到了PHP在變量中丟失數據的問題。變量中有相當多的數據,因爲它基本上包含一個二進制文件,但我想知道這是否會導致它完全丟失它的信息。PHP丟失變量數據

從我的代碼片段,用來處理電子郵件附件展望:

var_dump($data); 
if (array_key_exists('filename', $params) || array_key_exists('name', $params)) { 
    var_dump($data); 
... 
} 

第一的var_dump給出了文件的所需的輸出:

"string(283155) " 
--Apple-Mail-5-930065543 ... etc 

而第二給出了一個輸出:

string(0) "" 
... 
string(0) "" 

任何想法爲什麼會發生這種情況?如果PHP真的很大,PHP是否會將數據放入變量中? (我不這麼認爲,因爲我以前從未遇到過這個問題)

如果是這樣,任何解決方法?

謝謝!

編輯:還值得一提的是,這些陳述之間沒有代碼缺失。我也只是用一個較短的字符串嘗試它,我得到正確的輸出爲這兩個var_dump調用

+1

如果$ data中有一個短字符串,會發生什麼?只是爲了看問題是否存在。 – Phliplip 2010-06-03 21:51:18

+0

您可以在if語句之後添加另一個var_dump來查看輸出是什麼? – mqchen 2010-06-03 22:06:14

+0

嘗試在$ data變量中創建一個短字符串,並從var_dumps中獲取輸出。嗯.. – 2010-06-04 01:22:37

回答

3

它永遠不會發生。 $ data在var_dumps之間的某處被淨化。很難說在沒有看到代碼的情況下$ data被更改的地方,但是當我使用包含過度使用的舊代碼時,我遇到了類似的問題。 例如,

$data = "my_data"; 
include "file1.php" // $data can be changed here ! 
print($data); // not "my_data" anymore. 
+0

這很接近我的問題......變量被用在我認爲正在使用的地方之外,這是造成問題的地方。謝謝 – 2010-06-04 01:36:22

3

不,PHP絕對不會刪除任意變量。有些原因可能會導致這種行爲:

  • 您使用的是var_dump()
  • 變量$data了兩個電話之間別的東西如果$data是全球性的,可能被另一個函數修改。
  • 你有另一個var_dump(),你認爲是一個印刷$data,但實際打印另一個變量
  • $data是(通過=&指定)一個reference和引用變量修改。
2

聞起來像之一:

  1. 你使用它的範圍之外$的數據。例如。它是全局的,但是你可以在函數()塊中使用它。在這種情況下,您必須在您的功能塊中聲明對此全局的訪問:globabl $ data。
  2. 您使用參考。您可能希望將其轉換爲普通變量語義,但您必須小心謹慎,假定引用語義的代碼已相應修復。 (PHP手冊有一個參考部分,值得一讀。)
0

可能的原因:

  • $params不是陣列 - 你以爲劇本本來是給它分配一個數組失敗 - 所以if表達式解析爲false。檢查您的錯誤報告級別,確保它包含E_ALL & E_NOTICE並查看日誌中是否顯示「不是陣列」錯誤。您還在$ data上(在您清空所有數組值之後)或其他某個變量上再次調用var_dump(),讓您認爲第二個var_dump()被調用。
  • $params一個數組,但它們中都不存在這些鍵,所以if表達式解析爲false。您也在var_dump()$data(在您清空所有數組值之後)或其他一些變量再次在您的腳本中再次下來,使您認爲第二個var_dump()被調用。
  • 您的PHP版本不是官方版本,幷包含var_dump()的附加功能,以通過引用接受該變量,並在保留密鑰的同時清空所有數組值。或者它可能會使if()更改範圍。這看起來不像增值功能,所以最好不要使用除官方版本之外的任何內容。
  • 您不正確地描述行爲或排除了可幫助解釋它的行之間的代碼。您在$ param中缺少分號和已知鍵的列表,因此可以認爲這不是真正的完整代碼。
0

奇怪我看到相同的行爲。但現在只有一個特定的值

// print "Entering getFieldVisibilityPermission(".$fld_module.",". $userid.",". $fieldname.") method ..."; 
// next line looses $userid only when it has value 12 for value 11 it has no problem 
// require('user_privileges/user_privileges_' .$userid. '.php'); -> results in user_privileges_.php 
// require('user_privileges/user_privileges_' .$userid. '12.php'); -> results in user_privileges_1212.php