使用 PHP 的'注意:未定義的變數”、'注意:未定義的索引”、'警告:未定義的數組鍵”和'注意:未定義的偏移量”
P粉851401475
P粉851401475 2023-08-23 11:45:50
0
2
442

我正在運行 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"];

這些錯誤訊息的意思是什麼?

為什麼他們會突然出現?我使用這個腳本很多年了,從來沒有遇到任何問題。

如何修復它們?


這是一個一般參考問題,人們可以連結到重複的問題,而不必一遍又一遍地解釋問題。我覺得這是必要的,因為這個問題的大多數現實答案都非常具體。

相關元討論:

  • 對於重複的問題該怎麼辦?
  • 「參考問題」有意義嗎?


P粉851401475
P粉851401475

全部回覆 (2)
P粉644981029

試試這些

// 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粉787934476

    此錯誤訊息旨在幫助PHP 程式設計師在存取不存在的變數(或陣列元素)時發現拼字錯誤或錯誤。所以一個好的程式設計師:

    1. 確保每個變數或陣列鍵在使用時都已定義。如果需要在函數內部使用變量,則必須將其作為參數傳遞給該函數。
    2. 注意此錯誤並繼續修復它,就像處理任何其他錯誤一樣。它可能表示存在拼字錯誤或某些過程未傳回應有的資料。
    3. 只有在極少數情況下,當事情不受程式設計師控制時,才可以添加程式碼來避免此錯誤。但這絕不應該是一種盲目的習慣。

    通知/警告:未定義的變數

    雖然 PHP 不需要變數聲明,但它確實建議這樣做,以避免一些安全漏洞或錯誤,即人們會忘記為稍後在腳本中使用的變數賦值。 PHP 在未宣告變數的情況下會發出E_WARNING等級的錯誤。

    此警告可協助程式設計師發現拼字錯誤的變數名稱或類似類型的錯誤(例如在評估為 false 的條件內為變數指派了值)。此外,未初始化的變數還可能存在其他問題。如 PHP 手冊中所述

    這表示變數可能會從包含的檔案中取得值,並且將使用該值而不是預期存取未初始化變數的null,這可能會導致不可預測的結果。為了避免這種情況,PHP 檔案中的所有變數最好在使用之前進行初始化。

    處理問題的方法:

    1. 建議:在使用之前聲明每個變數。這樣,只有當您確實犯了錯誤,嘗試使用不存在的變數時,您才會看到此錯誤 - 這正是此錯誤訊息存在的原因。

      //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
    1. 使用空合併運算子抑制錯誤。但請記住,這樣 PHP 將無法通知您使用了錯誤的變數名稱。

      // Null coalescing operator echo $value ?? '';

      對於古老的 PHP 版本(

      echo isset($value) ? $value : '';

      請注意,它本質上仍然是一種錯誤抑制,儘管只是針對一個特定錯誤。因此,它可能會阻止 PHP 透過標記統一變數來幫助您。

    2. 使用@運算子抑制錯誤。由於歷史原因而離開這裡,但認真地說,這是不應該發生的。

    注意:強烈建議只實現第 1 點。

    注意:未定義索引/未定義偏移量/警告:未定義陣列鍵

    當您(或 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

    一種特殊情況是某些函數會傳回陣列或其他值(例如nullfalse)。那麼在嘗試存取數組元素之前就必須要進行測試,例如

    $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;
    • 可選的 QUERY STRING 元素或 cookie 應以相同的方式處理

      $limit = $_GET['limit'] ?? 20; $theme = $_COOKIE['theme'] ?? 'light';

    但是分配應該在腳本的一開始就完成。驗證所有輸入,將其指派給局部變量,並在程式碼中始終使用它們。因此,您要存取的每個變數都會故意存在。

    相關:

    #
      最新下載
      更多>
      網站特效
      網站源碼
      網站素材
      前端模板
      關於我們 免責聲明 Sitemap
      PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!