錯誤:'注意:未定義的變數”,'注意:未定義的索引”,'警告:未定義的數組鍵”,還有'注意:未定義的偏移量”使用 PHP
P粉046878197
P粉046878197 2023-07-20 11:17:02
0
2
637

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

全部回覆(2)
P粉116631591

試一下這個

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

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

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

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