我正在運行 PHP 腳本並繼續收到以下錯誤:
注意:未定義的變數:第 10 行 C:wampwwwmypathindex.php 中的 my_variable_name
注意:未定義索引:my_index C:wampwwwmypathindex.php 第 11 行
警告:第 11 行 C:wampwwwmypathindex.php 中未定義陣列鍵「my_index」
第 10 行與第 11 行如下:
echo "My variable value is: " . $my_variable_name; echo "My index value is: " . $my_array["my_index"];
這些錯誤訊息的意思是什麼?
為什麼他們會突然出現?我使用這個腳本很多年了,從來沒有遇到任何問題。
如何修復它們?
這是一個一般參考問題,人們可以連結到重複的問題,而不必一遍又一遍地解釋問題。我覺得這是必要的,因為這個問題的大多數現實答案都非常具體。
相關元討論:
- 對於重複的問題該怎麼辦?
- 「參考問題」有意義嗎?
試試這些
或者,作為一個快速但骯髒的解決方案:
關於會話的注意事項:
使用會話時,需要將
session_start();
放置在所有使用會話的檔案內。http://php.net/manual/en/features.sessions .php
此錯誤訊息旨在幫助PHP 程式設計師在存取不存在的變數(或陣列元素)時發現拼字錯誤或錯誤。所以一個好的程式設計師:
通知/警告:未定義的變數
雖然 PHP 不需要變數聲明,但它確實建議這樣做,以避免一些安全漏洞或錯誤,即人們會忘記為稍後在腳本中使用的變數賦值。 PHP 在未宣告變數的情況下會發出
E_WARNING
等級的錯誤。此警告可協助程式設計師發現拼字錯誤的變數名稱或類似類型的錯誤(例如在評估為 false 的條件內為變數指派了值)。此外,未初始化的變數還可能存在其他問題。如 PHP 手冊中所述,
這表示變數可能會從包含的檔案中取得值,並且將使用該值而不是預期存取未初始化變數的
null
,這可能會導致不可預測的結果。為了避免這種情況,PHP 檔案中的所有變數最好在使用之前進行初始化。處理問題的方法:
建議:在使用之前聲明每個變數。這樣,只有當您確實犯了錯誤,嘗試使用不存在的變數時,您才會看到此錯誤 - 這正是此錯誤訊息存在的原因。
變數已定義但在函數中不可見的特殊情況。 PHP 中的函數有自己的變數範圍,如果您需要在函數中使用外部變量,則其值必須作為函數的參數傳遞:
使用空合併運算子抑制錯誤。但請記住,這樣 PHP 將無法通知您使用了錯誤的變數名稱。
對於古老的 PHP 版本(
請注意,它本質上仍然是一種錯誤抑制,儘管只是針對一個特定錯誤。因此,它可能會阻止 PHP 透過標記統一變數來幫助您。
使用@運算子抑制錯誤。由於歷史原因而離開這裡,但認真地說,這是不應該發生的。
注意:強烈建議只實現第 1 點。
注意:未定義索引/未定義偏移量/警告:未定義陣列鍵
當您(或 PHP)嘗試存取陣列的未定義索引時,會出現此通知/警告。
內部陣列
在處理程式碼中定義的內部陣列時,態度應該完全相同:只需在使用前初始化所有鍵即可。這樣,該錯誤將完成其預期的工作:通知程式設計師其程式碼中的錯誤。所以方法是相同的:
推薦:宣告您的陣列元素:
一種特殊情況是某些函數會傳回陣列或其他值(例如
null
或false
)。那麼在嘗試存取數組元素之前就必須要進行測試,例如外部陣列
對於外部陣列(例如
$_POST
/$_GET
/$_SESSION
或JSON 輸入),情況有點不同,因為程式設計師無法控制此類數組的內容。因此,檢查某些鍵是否存在,甚至為遺失的鍵分配預設值都是合理的。當 PHP 腳本包含 HTML 表單時,第一次載入時很自然地沒有表單內容。因此,這樣的腳本應該檢查表單是否已提交
某些 HTML 表單元素(例如核取方塊)如果未選中,則不會傳送到伺服器。在這種情況下,有理由使用空合併運算子來指派預設值
可選的 QUERY STRING 元素或 cookie 應以相同的方式處理
但是分配應該在腳本的一開始就完成。驗證所有輸入,將其指派給局部變量,並在程式碼中始終使用它們。因此,您要存取的每個變數都會故意存在。
相關: