我正在執行一個PHP腳本,但不斷收到以下錯誤:
Notice: Undefined variable: my_variable_name in C:wampwwwmypathindex.php on line 10
Notice: Undefined index: my_index C:wampwwwmypathindex.php on line 11
Warning: Undefined array key "my_index" in C:wampwwwmypathindex.php on line 11
第10行和第11行看起來是這樣的:
echo "My variable value is: " . $my_variable_name; echo "My index value is: " . $my_array["my_index"];
這些錯誤訊息的意思是什麼?
為什麼它們會突然出現?我用這個腳本已經用了好幾年了,以前從來沒有出過任何問題。
如何修復這些錯誤?
P粉1166315912023-07-21 10:56:23
試一下這個
// recommended solution for recent PHP versions $user_name = $_SESSION['user_name'] ?? ''; // pre-7 PHP versions $user_name = ''; if (!empty($_SESSION['user_name'])) { $user_name = $_SESSION['user_name']; }
或者,有一個快速而簡單的解決方案:
// not the best solution, but works // in your php setting use, it helps hiding site wide notices error_reporting(E_ALL ^ E_NOTICE);
P粉7225212042023-07-21 09:48:50
這個錯誤訊息旨在幫助PHP程式設計師在存取不存在的變數(或陣列元素)時發現拼字錯誤或錯誤。因此,一個優秀的程式設計師應該:
儘管PHP不要求變數聲明,但建議進行聲明,以避免一些安全漏洞或錯誤,其中一個人可能會忘記給一個變數賦值,而這個變數稍後會在腳本中使用。在未宣告變數的情況下,PHP會發出一個E_WARNING等級的錯誤。
此警告可協助程式設計師發現拼字錯誤的變數名稱或類似的錯誤(例如,在條件求值為false時將變數賦值)。此外,未初始化變數可能存在其他可能的問題。正如PHP手冊中所述,
這表示變數可能從包含的檔案中取得一個值,而這個值將被用來取代在存取未初始化變數時所期望的null值,這可能導致不可預測的結果。為了避免這種情況,最好在使用之前對PHP檔案中的所有變數進行初始化。
處理這個問題的方法有以下幾種:
建議的方法是在使用之前宣告每個變數。這樣,只有在實際犯錯嘗試使用不存在的變數時,才會看到這個錯誤,這也是出現這個錯誤訊息的原因。
//Initializing a variable $value = ""; //Initialization value; 0 for int, [] for array, etc. echo $value; // no error echo $vaule; // an error pinpoints a misspelled variable name
一個特殊情況是當一個變數被定義但在函數中不可見。在PHP中,函數有自己的變數作用域,如果你需要在函數中使用外部的變量,它的值必須作為函數的參數傳遞進來:
function test($param) { return $param + 1; } $var = 0; echo test($var); // now $var's value is accessible inside through $param
使用空值合併運算子來抑制錯誤。但請記住,這樣PHP將無法通知您使用了錯誤的變數名稱。
// Null coalescing operator echo $value ?? '';
For the ancient PHP versions (< 7.0) isset() with ternary can be used
echo isset($value) ? $value : '';
請注意,儘管這本質上是一種錯誤抑制,但僅適用於特定的錯誤。因此,它可能會阻止PHP透過標記未初始化的變數來幫助您。
使用@運算子來抑制錯誤。這裡為了歷史原因而保留,但嚴肅地說,這種情況不應該發生。
注意:強烈建議只實作第一點。
當您(或PHP)嘗試存取陣列的未定義索引時,會出現此提示/警告。
在處理內部數組時,即在您的程式碼中定義的數組,應採取完全相同的態度:在使用之前初始化所有鍵。這樣,這個錯誤就能夠完成其預期的工作:通知程式設計師程式碼中的錯誤。因此,處理方法是相同的:
建議:宣告陣列元素:
//Initializing a variable $array['value'] = ""; //Initialization value; 0 for int, [] for array, etc. echo $array['value']; // no error echo $array['vaule']; // an error indicates a misspelled key
特殊情況是當某個函數傳回陣列或其他值(如null或false)時。在嘗試存取數組元素之前,必須進行測試,例如:
$row = $stmt->fetch(); if ($row) { // the record was found and can be worked with echo $row['name']; }
對於外部陣列(如$_POST / $_GET / $_SESSION或JSON輸入),情況有所不同,因為程式設計師無法控制這些陣列的內容。因此,檢查某個鍵是否存在,甚至為缺失的鍵分配預設值是合理的。
當一個PHP腳本包含一個HTML表單時,很自然地,在第一次載入時沒有表單內容。因此,這樣的腳本應該檢查是否提交了表單。
// for POST forms check the request method if ($_SERVER['REQUEST_METHOD'] === 'POST') { // process the form } // for GET forms / links check the important field if (isset($_GET['search'])) { // process the form }
一些HTML表單元素,例如複選框,如果未被選中,則不會傳送到伺服器。在這種情況下,使用空合併運算子分配預設值是合理的。
$agreed = $_POST['terms'] ?? false;
可選的查詢字串元素或cookie應該以相同的方式處理。
$limit = $_GET['limit'] ?? 20; $theme = $_COOKIE['theme'] ?? 'light';
但是賦值應該在腳本的最開始進行。驗證所有的輸入,將其賦值給本地變量,並在程式碼中一直使用它們。這樣,你要存取的每個變數都會有意地存在。