首頁  >  問答  >  主體

錯誤:“注意:未定義的變數”,“注意:未定義的索引”,“警告:未定義的數組鍵”,還有“注意:未定義的偏移量”使用 PHP

我正在執行一個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粉046878197P粉046878197478 天前851

全部回覆(2)我來回復

  • P粉116631591

    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);

    回覆
    0
  • P粉722521204

    P粉7225212042023-07-21 09:48:50

    這個錯誤訊息旨在幫助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 ?? '';

      For the ancient PHP versions (< 7.0) isset() with ternary can be used

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

      請注意,儘管這本質上是一種錯誤抑制,但僅適用於特定的錯誤。因此,它可能會阻止PHP透過標記未初始化的變數來幫助您。

    2. 使用@運算子來抑制錯誤。這裡為了歷史原因而保留,但嚴肅地說,這種情況不應該發生。

    注意:強烈建議只實作第一點。

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

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

    但是賦值應該在腳本的最開始進行。驗證所有的輸入,將其賦值給本地變量,並在程式碼中一直使用它們。這樣,你要存取的每個變數都會有意地存在。

    回覆
    1
  • 取消回覆