报错:"Notis: Pembolehubah tidak ditentukan", "Notis: Indeks tidak ditentukan", "Amaran: Kunci tatasusunan tidak ditentukan", 还有"Notis: Offset tidak ditentukan" menggunakan PHP
P粉046878197
P粉046878197 2023-07-20 11:17:02
0
2
631

Saya sedang menjalankan skrip PHP tetapi saya terus mendapat ralat seperti ini:

Notis: Pembolehubah tidak ditentukan: my_variable_name dalam C:wampwwwmypathindex.php pada baris 10

Notis: Indeks tidak ditentukan: my_index C:wampwwwmypathindex.php pada baris 11

Amaran: Kunci tatasusunan tidak ditentukan "my_index" dalam C:wampwwwmypathindex.php pada baris 11

Baris 10 dan 11 kelihatan seperti ini:

echo "My variable value is: " . $my_variable_name;
echo "My index value is: " . $my_array["my_index"];

Apakah maksud mesej ralat ini?

Kenapa mereka muncul secara tiba-tiba? Saya telah menggunakan skrip ini selama beberapa tahun dan tidak pernah mengalami sebarang masalah sebelum ini.

Bagaimana untuk membetulkan ralat ini?


P粉046878197
P粉046878197

membalas semua(2)
P粉116631591

Cuba ini

// 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'];
}

Sebagai alternatif, terdapat penyelesaian yang cepat dan mudah:

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

Mesej ralat ini bertujuan untuk membantu pengaturcara PHP mengesan kesilapan atau kesilapan semasa mengakses pembolehubah yang tidak wujud (atau elemen tatasusunan). Oleh itu, seorang pengaturcara yang baik hendaklah:

  1. Pastikan setiap pembolehubah atau kunci tatasusunan ditentukan sebelum menggunakannya. Jika anda perlu menggunakan pembolehubah di dalam fungsi, anda mesti menghantarnya sebagai parameter kepada fungsi tersebut.
  2. Ikuti pepijat ini dan betulkan ia sama seperti pepijat lain. Ia mungkin menunjukkan kesilapan menaip atau prosedur yang tidak mengembalikan data yang sepatutnya.
  3. Hanya dalam kes yang jarang berlaku di luar kawalan pengaturcara harus ditambah kod untuk memintas ralat ini. Tetapi ia tidak boleh menjadi tabiat buta.

Nota/Amaran: Pembolehubah tidak ditentukan

Walaupun PHP tidak memerlukan pengisytiharan pembolehubah, adalah disyorkan untuk mengisytiharkannya untuk mengelakkan beberapa lubang keselamatan atau pepijat di mana seseorang mungkin terlupa untuk memberikan nilai kepada pembolehubah yang akan digunakan kemudian dalam skrip. Apabila pembolehubah tidak diisytiharkan, PHP mengeluarkan ralat tahap E_WARNING.

Amaran ini membantu pengaturcara mengesan nama pembolehubah yang salah eja atau ralat serupa (cth. memberikan nilai kepada pembolehubah apabila keadaan dinilai sebagai palsu). Selain itu, mungkin terdapat masalah lain yang mungkin berlaku dengan pembolehubah yang tidak dimulakan. Seperti yang dinyatakan dalam manual PHP,

Ini bermakna pembolehubah mungkin mendapat nilai daripada fail yang disertakan dan nilai ini akan digunakan dan bukannya nilai nol yang dijangkakan apabila mengakses pembolehubah yang tidak dimulakan, yang mungkin membawa kepada keputusan yang tidak dapat diramalkan. Untuk mengelakkan ini, adalah idea yang baik untuk memulakan semua pembolehubah dalam fail PHP anda sebelum menggunakannya.

Terdapat beberapa cara untuk menangani masalah ini:

  1. Pendekatan yang disyorkan ialah mengisytiharkan setiap pembolehubah sebelum menggunakannya. Dengan cara ini, anda hanya akan melihat ralat ini jika anda benar-benar membuat kesilapan dan cuba menggunakan pembolehubah yang tidak wujud, itulah sebabnya mesej ralat ini muncul.

    //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
  • Kes khas ialah apabila pembolehubah ditakrifkan tetapi tidak kelihatan dalam fungsi. Dalam PHP, fungsi mempunyai skop pembolehubahnya sendiri Jika anda perlu menggunakan pembolehubah luaran dalam fungsi, nilainya mesti dihantar sebagai parameter fungsi:

    function test($param) {
        return $param + 1; 
    }
    $var = 0;
    echo test($var); // now $var's value is accessible inside through $param
  1. Gunakan operator penggabungan nol untuk menyekat ralat. Tetapi perlu diingat bahawa dengan cara ini PHP tidak akan dapat memberitahu anda bahawa anda menggunakan nama pembolehubah yang salah.

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

    Untuk versi PHP purba (< 7.0) isset() dengan ternary boleh digunakan

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

    Sila ambil perhatian bahawa walaupun ini pada asasnya adalah penindasan ralat, ia hanya berfungsi pada ralat tertentu. Oleh itu, ia mungkin menghalang PHP daripada membantu anda dengan menandakan pembolehubah sebagai tidak dimulakan.

  2. Gunakan operator @ untuk menyekat ralat. Ia disimpan di sini atas sebab sejarah, tetapi serius, ini tidak sepatutnya berlaku.

Nota: Sangat disyorkan untuk melaksanakan perkara pertama sahaja.

Nota: indeks tidak ditentukan/offset tidak ditentukan/amaran: kunci tatasusunan tidak ditentukan

Petua/amaran ini muncul apabila anda (atau PHP) cuba mengakses indeks tatasusunan yang tidak ditentukan.

Tatasusunan dalaman

Sikap yang sama harus diguna pakai apabila berurusan dengan tatasusunan dalaman, iaitu tatasusunan yang ditakrifkan dalam kod anda: mulakan semua kunci sebelum digunakan. Dengan cara ini, ralat dapat melakukan tugas yang dimaksudkan: memberitahu pengaturcara tentang ralat dalam kod. Jadi pendekatannya adalah sama:

Cadangan: Isytiharkan elemen tatasusunan:

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

Kes istimewa ialah apabila fungsi mengembalikan tatasusunan atau nilai lain seperti null atau false. Sebelum cuba mengakses elemen tatasusunan, ujian mesti dilakukan, contohnya:

$row = $stmt->fetch();
if ($row) { // the record was found and can be worked with
    echo $row['name']; 
}

Tatasusunan luaran

Untuk tatasusunan luaran (seperti $_POST/$_GET/$_SESSION atau input JSON) keadaannya berbeza kerana pengaturcara tidak mempunyai kawalan ke atas kandungan tatasusunan ini. Oleh itu, adalah munasabah untuk menyemak sama ada kunci tertentu wujud atau memberikan nilai lalai kepada kunci yang hilang.

  • Apabila skrip PHP mengandungi borang HTML, secara semula jadi, tiada kandungan borang pada muat pertama. Oleh itu, skrip sedemikian harus menyemak sama ada borang telah diserahkan.

    // 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
      }
  • Sesetengah elemen borang HTML, seperti kotak pilihan, tidak akan dihantar ke pelayan jika ia tidak dipilih. Dalam kes ini, masuk akal untuk menggunakan operator penggabungan nol untuk menetapkan nilai lalai.

    $agreed = $_POST['terms'] ?? false;
  • Elemen rentetan pertanyaan pilihan atau kuki hendaklah dikendalikan dengan cara yang sama.

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

Tetapi tugasan harus dilakukan pada awal skrip. Sahkan semua input, tetapkan ia kepada pembolehubah tempatan dan gunakannya sepanjang kod anda. Dengan cara ini, setiap pembolehubah yang anda akses akan wujud dengan sengaja.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!