cari

Rumah  >  Soal Jawab  >  teks badan

Menggunakan PHP "Awas: pembolehubah tidak ditentukan", "Awas: indeks tidak ditentukan", "Amaran: kunci tatasusunan tidak ditentukan" dan "Awas: tidak ditentukan offset"

<p>Saya sedang menjalankan skrip PHP dan terus menerima ralat seperti ini: </p> <blockquote> <p>Notis: Pembolehubah tidak ditentukan: my_variable_name dalam C:wampwwwmypathindex.php pada baris 10</p> <p>Nota: Indeks tidak ditentukan: my_index C:wampwwwmypathindex.php baris 11</p> <p>Amaran: Kunci tatasusunan 'my_index' tidak ditakrifkan dalam C:wampwwwmypathindex.php pada baris 11</p> </blockquote> <p>Barisan 10 dan 11 kelihatan seperti ini: </p> <pre class="brush:php;toolbar:false;">echo "Nilai pembolehubah saya ialah: " $my_variable_name; echo "Nilai indeks saya ialah: " $my_array["my_index"];</pre> <p>Apakah maksud mesej ralat ini? </p> <p>Mengapa ia muncul secara tiba-tiba? Saya telah menggunakan skrip ini selama bertahun-tahun dan tidak pernah mengalami sebarang masalah. </p> <p>Bagaimana untuk membetulkannya? </p> <hr /> <blockquote> <p><sub><strong>Ini adalah soalan rujukan umum</strong> supaya orang ramai boleh memautkan kepada soalan pendua tanpa perlu menerangkan soalan itu berulang kali. Saya rasa ini perlu kerana kebanyakan jawapan dunia sebenar kepada soalan ini adalah sangat spesifik. </sub></p> <p><sub>Perbincangan meta berkaitan:</sub></p> <ul> <li><sub>Apakah yang perlu saya lakukan mengenai soalan pendua? </sub></li> <li><sub>Adakah "soalan rujukan" masuk akal? </sub></li> </ul> </blockquote><p><br /></p>
P粉851401475P粉851401475465 hari yang lalu530

membalas semua(2)saya akan balas

  • P粉644981029

    P粉6449810292023-08-24 11:13:56

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

    Atau, sebagai penyelesaian cepat dan kotor:

    // not the best solution, but works
    // in your php setting use, it helps hiding site wide notices
    error_reporting(E_ALL ^ E_NOTICE);

    Nota tentang sesi:

    balas
    0
  • P粉787934476

    P粉7879344762023-08-24 10:41:30

    Mesej ralat ini bertujuan untuk membantu Pengaturcara PHP mencari kesilapan atau kesilapan semasa mengakses pembolehubah (atau elemen tatasusunan) yang tidak wujud. Jadi pengaturcara yang baik:

    1. Pastikan setiap pembolehubah atau kunci tatasusunan ditakrifkan apabila digunakan. Jika anda perlu menggunakan pembolehubah di dalam fungsi, anda mesti menghantarnya sebagai parameter kepada fungsi tersebut.
    2. Berhati-hati dengan ralat ini dan teruskan untuk membetulkannya seperti mana-mana ralat lain. Ini mungkin bermakna terdapat kesilapan taip atau beberapa prosedur tidak mengembalikan data yang sepatutnya.
    3. Hanya dalam kes yang jarang berlaku, apabila perkara di luar kawalan pengaturcara, sekiranya anda menambah kod untuk mengelakkan ralat ini. Tetapi ini tidak sepatutnya menjadi tabiat buta.

    Notis/Amaran: Pembolehubah tidak ditentukan

    Walaupun PHP tidak memerlukan pengisytiharan berubah-ubah, ia mengesyorkannya untuk mengelakkan beberapa lubang keselamatan atau pepijat di mana orang lupa untuk memberikan nilai kepada pembolehubah yang digunakan kemudian dalam skrip. PHP mengeluarkan ralat tahap E_WARNING apabila pembolehubah tidak diisytiharkan.

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

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

    Kaedah menangani masalah:

    1. Syor: Isytihar setiap pembolehubah sebelum menggunakannya. Dengan cara itu anda hanya akan melihat ralat ini jika anda benar-benar membuat kesilapan cuba menggunakan pembolehubah yang tidak wujud - itulah sebabnya mesej ralat ini wujud.

      //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 apabila pembolehubah ditakrifkan tetapi tidak kelihatan dalam fungsi. Fungsi dalam PHP mempunyai skop pembolehubah mereka sendiri, jika anda perlu menggunakan pembolehubah luaran dalam fungsi, nilainya mesti diluluskan sebagai parameter fungsi:

      function test($param) {
          return $param + 1; 
      }
      $var = 0;
      echo test($var); // now $var's value is accessible inside through $param
    1. Sekat ralat menggunakan operator penyatuan null. Tetapi ingat, dengan cara ini PHP tidak akan dapat memberitahu anda bahawa anda menggunakan nama pembolehubah yang salah.

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

      Untuk versi PHP yang lebih lama (< 7.0) anda boleh menggunakan isset() dengan ternary< 7.0),可以使用带有三元的 isset()

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

      Sila ambil perhatian bahawa ia pada asasnya masih merupakan penindasan ralat, walaupun hanya untuk ralat tertentu. Oleh itu, ia mungkin menghalang PHP daripada membantu anda dengan menandakan pembolehubah seragam.

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

    Nota: Sangat disyorkan untuk hanya melaksanakan perkara 1.

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

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

    Tatasusunan dalaman

    Sikap harus betul-betul sama apabila berurusan dengan tatasusunan dalaman yang ditakrifkan dalam kod: hanya mulakan semua kekunci sebelum digunakan. Dengan cara ini, pepijat akan melakukan tugas yang dimaksudkan: memberitahu pengaturcara tentang ralat dalam kod mereka. Jadi kaedahnya adalah sama:

    Disyorkan: Isytiharkan elemen tatasusunan anda:

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

    Satu kes khas ialah apabila sesetengah fungsi mengembalikan tatasusunan atau nilai lain (cth. nullfalse). Kemudian anda mesti melakukan ujian sebelum cuba mengakses elemen tatasusunan, seperti

    $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 agak berbeza, kerana pengaturcara tidak mempunyai kawalan ke atas kandungan tatasusunan tersebut. Oleh itu, adalah munasabah untuk memeriksa sama ada kunci tertentu wujud atau menetapkan nilai lalai kepada kunci yang hilang.

    • Apabila skrip PHP mengandungi borang HTML, adalah wajar bahawa tiada kandungan borang apabila ia mula dimuatkan. Jadi skrip sedemikian harus menyemak sama ada borang telah dihantar

      // 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 dinyahtandai. Dalam kes ini, terdapat sebab untuk menggunakan operator penggabungan nol untuk menetapkan nilai lalai

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

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

    Tetapi tugasan harus dilakukan pada awal skrip. Sahkan semua input, berikannya kepada pembolehubah setempat dan gunakannya sepanjang kod anda. Oleh itu, setiap pembolehubah yang anda akses akan wujud dengan sengaja.

    Berkaitan:

    balas
    0
  • Batalbalas