28 Pertanyaan: "Pemberitahuan: Variabel tidak terdefinisi", "Pemberitahuan: Indeks tidak terdefinisi", dan "Pemberitahuan: Undefined offset" menggunakan PHP

pertanyaan dibuat di Tue, Jun 4, 2019 12:00 AM

Saya sedang menjalankan skrip PHP, dan terus menerima kesalahan seperti:

  

Pemberitahuan: Variabel tidak terdefinisi: my_variable_name di C: \wamp \www \mypath \index.php pada baris 10

     

Pemberitahuan: Indeks tidak terdefinisi: my_index C: \wamp \www \mypath \index.php pada baris 11

Baris 10 dan 11 terlihat seperti ini:

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

Apa arti dari pesan kesalahan ini?

Kenapa mereka muncul tiba-tiba? Saya biasa menggunakan skrip ini selama bertahun-tahun dan saya tidak pernah punya masalah.

Bagaimana cara memperbaikinya?

  

Ini adalah pertanyaan Referensi Umum untuk orang-orang untuk ditautkan sebagai duplikat, alih-alih harus menjelaskan masalah berulang-ulang. Saya merasa ini perlu karena sebagian besar jawaban dunia nyata untuk masalah ini sangat spesifik.

     

Diskusi Meta terkait:

     
    
1091
  1. 2013-10-08 15: 25: 41Z
  2. variabel mungkin belum diinisialisasi. Apakah Anda menginisialisasi variabel dari posting atau dapatkan atau array apa pun? Jika itu masalahnya Anda mungkin tidak memiliki bidang dalam array itu. Itu yang Anda akses.
    2015-12-15 13: 12: 21Z
  3. @ Pekka 웃 - Saya melihat hasil edit menambahkan "dan" Pemberitahuan: Undefined offset "" - Bukankah lebih masuk akal menggunakan "PHP:" Undefined variable " , "Undefined index", "Undefined offset" pemberitahuan "(bahkan menghapus PHP, karena ini ditandai sebagai" php ". Plus, URL terputus pada and-notice-undef, hanya saran agar URL tidak terpotong off. Mungkin bahkan menghapus (terlalu banyak) tanda kutip. Atau PHP: “Undefined variable/index/offset” notices
    2017-01-20 15: 24: 01Z
  4. @ Fred Saya kira argumen dapat dibuat untuk kedua variasi. Ada kemungkinan bahwa pemula akan memasuki seluruh baris, termasuk "Pemberitahuan:" ke dalam kueri pencarian mereka, yang saya yakin adalah penghasil lalu lintas utama untuk pertanyaan ini. Jika semua pesan ada di sana, itu kemungkinan akan meningkatkan visibilitas di mesin pencari
    2017-01-20 15: 34: 41Z
  5. @ Pekka 웃 Saya mengerti. Saya hanya mengatakan itu karena URL tidak terpotong sebelum dan sekarang di and-notice-undef. Itu hanya (beberapa) saran. Itu hanya mengulangi sendiri juga menjadi Notice: Undefined.
    2017-01-20 15: 35: 48Z
28 Jawaban                              28                         

Pemberitahuan: Variabel tidak terdefinisi

Dari kebijaksanaan Manual PHP yang luas :

  

Mengandalkan nilai default dari variabel yang tidak diinisialisasi bermasalah dalam kasus memasukkan satu file ke file lain yang menggunakan nama variabel yang sama. Ini juga merupakan risiko keamanan utama dengan register_globals dihidupkan. E_NOTICE tingkat kesalahan dikeluarkan dalam hal bekerja dengan variabel yang tidak diinisialisasi, namun tidak dalam kasus menambahkan elemen ke array yang tidak diinisialisasi. isset () konstruksi bahasa dapat digunakan untuk mendeteksi jika suatu variabel telah sudah diinisialisasi.Selain itu dan lebih ideal adalah solusi dari kosong () karena tidak menghasilkan peringatan atau pesan kesalahan jika variabel tidak diinisialisasi.

Dari dokumentasi PHP :

  

Tidak ada peringatan yang dihasilkan jika variabel tidak ada. Itu berarti       kosong () pada dasarnya setara dengan ! penerbit ($var) || $var      == false .

Ini berarti Anda hanya dapat menggunakan empty() untuk menentukan apakah variabelnya disetel, dan selain itu memeriksa variabel terhadap yang berikut, 0, 0.0, "", "0", null, false, [] atau

$o = [];
@$var = ["",0,null,1,2,3,$foo,$o['myIndex']];
array_walk($var, function($v) {
    echo (!isset($v) || $v == false) ? 'true ' : 'false';
    echo ' ' . (empty($v) ? 'true' : 'false');
    echo "\n";
});
.

Contoh:

 E_NOTICE

Uji cuplikan di atas di 3v4l.org editor PHP online pp>

Meskipun PHP tidak memerlukan deklarasi variabel, PHP merekomendasikannya untuk menghindari beberapa kerentanan keamanan atau bug di mana orang akan lupa untuk memberi nilai pada variabel yang akan digunakan nanti dalam skrip. Apa yang dilakukan PHP dalam kasus variabel yang tidak dideklarasikan adalah mengeluarkan tingkat kesalahan yang sangat rendah, isset(), yang bahkan tidak dilaporkan secara default, tetapi Manual menyarankan untuk mengizinkan selama pengembangan.

Cara untuk mengatasi masalah ini:

  1. Disarankan: Nyatakan variabel Anda, misalnya saat Anda mencoba menambahkan string ke variabel yang tidak ditentukan. Atau gunakan !empty() /

    //Initializing variable
    $value = ""; //Initialization value; Examples
                 //"" When you want to append stuff later
                 //0  When you want to add numbers later
    //isset()
    $value = isset($_POST['value']) ? $_POST['value'] : '';
    //empty()
    $value = !empty($_POST['value']) ? $_POST['value'] : '';
    
    untuk memeriksa apakah mereka dideklarasikan sebelum mereferensikannya, seperti pada:

     
    // Null coalesce operator - No need to explicitly initialize the variable.
    $value = $_POST['value'] ?? '';
    

    Ini menjadi lebih bersih pada PHP 7.0, sekarang Anda dapat menggunakan operator null coalesce :

     
    set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
    
  2. Tetapkan penangan kesalahan khusus untuk E_NOTICE dan mengalihkan pesan dari output standar (mungkin ke file log):

     E_NOTICE
  3. Nonaktifkan E_NOTICE dari pelaporan. Cara cepat untuk mengecualikan hanya

    error_reporting( error_reporting() & ~E_NOTICE )
    
    adalah:  isset()
  4. Menekan kesalahan dengan @ operator .

Catatan: Sangat disarankan untuk menerapkan titik 1 saja.

Pemberitahuan: Indeks tidak ditentukan /Offset tidak ditentukan

Pemberitahuan ini muncul ketika Anda (atau PHP) mencoba mengakses indeks array yang tidak ditentukan.

Cara untuk mengatasi masalah ini:

  1. Periksa apakah indeks ada sebelum Anda mengaksesnya. Untuk ini, Anda dapat menggunakan array_key_exists() atau

    //isset()
    $value = isset($array['my_index']) ? $array['my_index'] : '';
    //array_key_exists()
    $value = array_key_exists('my_index', $array) ? $array['my_index'] : '';
    
    :

     list()
  2. Konstruk bahasa

    list($a, $b) = array(0 => 'a');
    //or
    list($one, $two) = explode(',', 'test string');
    
    dapat menghasilkan ini ketika mencoba mengakses array indeks yang tidak ada:

     0

Dua variabel digunakan untuk mengakses dua elemen array, namun hanya ada satu elemen array, indeks $_POST, jadi ini akan menghasilkan:

  

Pemberitahuan: Offset yang tidak ditentukan: 1

 $_GET/$_SESSION/$_POST variabel

Pemberitahuan di atas sering muncul saat bekerja dengan $_GET, $_SESSION atau $_POST. Untuk $_GET dan $_SESSION Anda hanya perlu memeriksa apakah indeks ada atau tidak sebelum Anda menggunakannya. Untuk session_start() Anda harus memastikan bahwa sesi dimulai dengan @ dan bahwa indeks juga ada.

Juga perhatikan bahwa ketiga variabel adalah superglobals dan huruf besar.

Terkait:

995
2019-05-21 17: 53: 21Z
  1. @ dieselpower44 Beberapa pemikiran: "operator shut-up" ($var = @$_GET['nonexisting'];) memiliki beberapa masalah kinerja. Juga, karena ia menekan semua kesalahan withipada lingkup tertentu, menggunakannya tanpa peduli dapat menutupi pesan yang ingin Anda lihat.
    2013-10-24 20: 00: 28Z
  2. Menyembunyikan masalah BUKAN cara untuk menangani masalah. Item # 2 ... # 4 hanya dapat digunakan di server produksi, tidak secara umum.
    2014-09-13 08: 09: 54Z
  3. Apakah mungkin untuk mem-shutdown inline pesan (tidak di handler) ketika juga handler error custom digunakan? $value = isset($_POST['value']) ? $_POST['value'] : ''; masih menyebabkan pemberitahuan ..
    2014-10-11 14: 14: 22Z
  4. Mengapa disarankan untuk menggunakan 1. $value = @$_POST['value']; daripada menggunakan 4.
    // 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'];
    }
    
    ?
    2015-02-09 13: 38: 50Z
  5. @ twistedpixel Ke-4 cara itu independen, itu bukan panduan 4 langkah. Jadi jika Anda memilih untuk menggunakan cara 4, itu berarti Anda belum menerapkan 3 cara pertama, sehingga Anda belum menekan kesalahan apa pun.
    2015-08-06 09: 58: 38Z

Coba ini

  

Q1: pemberitahuan ini berarti $varname tidak   didefinisikan pada ruang lingkup saat ini   skrip.

     

Q2: Penggunaan kondisi isset (), kosong () sebelum menggunakan variabel yang mencurigakan berfungsi dengan baik.

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

Atau, sebagai solusi cepat dan kotor:

 session_start();

Catatan tentang sesi:

126
2018-06-26 14: 58: 33Z
  1. Jika menggunakan php.ini dari file konfigurasi error_reporting = (E_ALL & ~E_NOTICE), lakukan @
    2014-10-04 05: 39: 20Z
  2. 2018-06-25 10: 43: 28Z

Tampilan kesalahan @ operator

Untuk pemberitahuan yang tidak diinginkan dan berlebihan, seseorang dapat menggunakan

$var = @($_GET["optional_param"]);
operator khusus ke » sembunyikan « pesan variabel /indeks yang tidak ditentukan.

 isset?:
  • Ini biasanya tidak disarankan. Pendatang baru cenderung menggunakannya secara berlebihan.
  • Ini sangat tidak pantas untuk kode jauh di dalam logika aplikasi (mengabaikan variabel yang tidak dideklarasikan di tempat yang seharusnya tidak Anda lakukan), mis. untuk parameter fungsi, atau dalam loop.
  • Namun ada satu sisi positif dari super-supresi ?? atau @. Pemberitahuan masih bisa dicatat. Dan seseorang dapat membangkitkan set_error_handler("var_dump"); pemberitahuan tersembunyi dengan: if (isset($_POST["shubmit"]))
    • Selain itu, Anda seharusnya tidak terbiasa menggunakan /merekomendasikan @ dalam kode awal Anda.
    • Pendatang baru tidak akan menemukan kesalahan ketik seperti itu. Itu hanya membuat Anda kehilangan Pemberitahuan PHP untuk kasus-kasus itu. Tambahkan isset atau @ hanya setelah memverifikasi fungsi.
    •   

      Perbaiki penyebabnya terlebih dahulu. Bukan pemberitahuan.

  • $_GET terutama dapat diterima untuk $_POST/$_GET parameter input, khususnya jika itu opsional .

Dan karena ini mencakup sebagian besar pertanyaan seperti itu, mari kita bahas penyebab paling umum:

 $_POST/$_REQUEST/$count = $_GET["whatnow?"]; input tidak terdefinisi

  • Hal pertama yang Anda lakukan saat menemukan indeks /offset yang tidak ditentukan, adalah periksa untuk kesalahan ketik:
    var_dump

    • Apakah ini nama kunci yang diharapkan dan ditampilkan pada setiap permintaan halaman ?
    • Nama variabel adalah indeks array dan case-sensitive dalam PHP.
  • Kedua, jika pemberitahuan itu tidak memiliki penyebab yang jelas, gunakan print_r atau

    var_dump($_GET);
    var_dump($_POST);
    //print_r($_REQUEST);
    
    untuk memverifikasi semua masukan array untuk konten saat ini:

     $_GET

    Keduanya akan mengungkapkan jika skrip Anda dipanggil dengan hak atau parameter apa pun.

  • Alternatif atau gunakan tambahan peramban browser ( F12 ) dan periksa tab jaringan untuk permintaan dan parameter:

    alat pengembang browser /jaringan tab

    Parameter POST dan GET input akan ditampilkan secara terpisah.

  • Untuk QUERY_STRING parameter, Anda juga dapat mengintip di

    print_r($_SERVER);
    
    di

     $_COOKIES

    PHP memiliki beberapa aturan untuk menyatu nama-nama parameter non-standar ke dalam superglobals. Apache mungkin juga menulis ulang. Anda juga dapat melihat header mentah yang disediakan http://example.org/script.php?id=5&sort=desc dan header permintaan HTTP lainnya dengan cara itu.

  • Lebih jelas lihat bilah alamat peramban Anda untuk GET parameter :

    name=value

    ? pasangan setelah tanda tanya $_GET["id"] adalah parameter kueri (GET) Anda. Dengan demikian URL ini hanya dapat menghasilkan $_GET["sort"] dan <form>.

  • Terakhir, periksa deklarasi <input> dan <input name=FOO> Anda, jika Anda mengharapkan parameter tetapi tidak menerima.

    • Pastikan setiap input yang dibutuhkan memiliki id=
    • Atribut title= atau method=POST tidak cukup.
    • Formulir $_POST seharusnya memuat method=GET.
    • Sedangkan $_GET (atau meninggalkannya) akan menghasilkan action=script.php?get=param variabel.
    • Formulir juga memungkinkan untuk memasok method=POST melalui $_GET dan $_REQUEST['vars'] bidang lainnya dalam $_POST di sampingnya.
    • Dengan konfigurasi PHP modern (≥ 5.6) ia menjadi layak (tidak modis) ) untuk menggunakan access.log lagi, yang menggabungkan paruhan GET dan POST.
  • Jika Anda menggunakan mod_rewrite, maka Anda harus memeriksa RewriteLog dan mengaktifkan $_FILES untuk mengetahui parameter yang tidak ada.

$_FILES["formname"]

$_COOKIE

  • Larik setcookie() tidak pernah diisi tepat setelah if (isset($varname)), tetapi hanya pada permintaan HTTP tindak lanjut apa pun.
  • Selain itu validitasnya habis, mereka dapat menjadi kendala untuk subdomain atau jalur individual, dan pengguna dan browser bisa menolak atau menghapusnya.
59
2018-08-22 21: 16: 29Z
  1. Jika Anda ingin tahu apa dampak kinerja, artikel ini merangkumnya dengan baik, derickrethans.nl/... .
    2014-02-11 12: 24: 04Z
  2. @ GajusKuizinas Sudah ada beberapa perubahan sejak 2009, khususnya php.net/ChangeLog-5.php#5.4.0 mengubah hasilnya secara drastis (lihat" Mesin Zend, kinerja "dan" operator (diam) ").
    2014-02-11 12: 37: 27Z
  3. Terima kasih @mario, menarik. Sekarang, jika seseorang cukup baik untuk membandingkan keduanya ... 3v4l.org/CYVOn/perf#tabs 3v4l.org/FLp3D/perf#tabs Menurut tes ini, tampaknya identik (perhatikan bahwa perubahan skala).
    2014-02-11 16: 30: 07Z
  4. Saya menguji dengan PHP 5.4 dan kinerjanya masih buruk.
    2014-10-03 17: 43: 43Z

Umumnya karena "pemrograman buruk", dan kemungkinan kesalahan sekarang atau nanti.

  1. Jika itu kesalahan, buat tugas yang benar untuk variabel terlebih dahulu: $varname = 0;
  2. Jika kadang-kadang hanya didefinisikan, uji untuk itu:
    function ifexists($varname)
    {
      return(isset($$varname)?$varname:null);
    }
    
    , sebelum menggunakannya
  3. Jika itu karena Anda salah mengeja, perbaiki saja itu
  4. Bahkan mungkin pergantian peringatan di Anda pengaturan PHP
44
2018-04-11 08: 46: 21Z
  1. Tolong jangan matikan peringatan. Dalam bahasa yang lebih ketat, mereka sering berarti "mungkin ada bug, lebih baik Anda memeriksa baris ini dua kali" - dalam bahasa yang permisif seperti PHP, mereka sering berarti "kode ini omong kosong dan secara proporsional penuh dengan bug; Saya akan mencoba membuat beberapa rasa tetapi Anda lebih baik memperbaiki ini ASAP ".
    2010-11-23 21: 37: 54Z
  2. Meskipun saya setuju dengan tiga poin pertama, # 4 sama sekali salah. Menyembunyikan masalah tidak akan membuatnya hilang, dan bahkan mungkin menyebabkan lebih banyak masalah di jalan.
    2010-11-23 21: 38: 37Z
  3. @ Freek benar sekali, tetapi dalam beberapa skenario (Skrip pembelian, tanpa pengetahuan teknis, memerlukannya dijalankan besok ...) itu adalah solusi lakban - benar-benar buruk , yang selalu perlu ditekankan, tetapi merupakan opsi
    2010-11-23 21: 40: 29Z
  4. Duct-tape itu baik ... terkadang. Secara historis, peringatan telah diubah dalam pengaturan PHP standar, tetapi pengaturan yang salah telah menjadi lebih ketat. Sayang sekali banyak yang kembali ke pengaturan lama, agar tidak mengganggu pelanggan.
    2010-11-23 22: 26: 03Z

Ini berarti Anda sedang menguji, mengevaluasi, atau mencetak variabel yang belum Anda tetapkan untuk apa pun. Itu berarti Anda memiliki salah ketik, atau Anda perlu memeriksa bahwa variabel diinisialisasi ke sesuatu terlebih dahulu. Periksa jalur logika Anda, mungkin disetel di satu jalur tetapi tidak di jalur lain.

    
40
2010-11-24 02: 43: 04Z

Saya tidak ingin menonaktifkan pemberitahuan karena ini membantu, tetapi ingin menghindari mengetik terlalu banyak.

Solusi saya adalah fungsi ini:

 
<?=ifexists('name')?>

Jadi jika saya ingin merujuk ke $name dan echo jika ada, saya cukup menulis:

 
function ifexistsidx($var,$index)
{
  return(isset($var[$index])?$var[$index]:null);
}

Untuk elemen array:

 
<?=ifexistsidx($_REQUEST,'name')?>

Di halaman jika saya ingin merujuk ke $_REQUEST ['name']:

 $foo = "BABAR"; ifexists('foo');     
34
2011-12-30 14: 14: 59Z
  1. Fungsi ifexists () Anda tidak berfungsi untuk saya di PHP 5.3. Variabel penelepon tidak tersedia dalam lingkup lokal fungsi (lihat Lingkup variabel ), kecuali mereka Superglobals atau Anda mengutak-atik $GLOBALS , jadi if( !empty($user) and !empty($location) ) echo "hello $user ..." akan secara umum mengembalikan nol. (Bahasa Italia adalah bab-bab php.net.)
    2012-06-19 22: 14: 12Z
  2. sekarang Anda akan mendapatkan "halo dari" ... apa gunanya? cukup periksa nilai
    $value = filter_input(INPUT_POST, 'value');
    
    2013-07-09 05: 31: 06Z

Cara terbaik untuk mendapatkan input string adalah:

 
if (!isset($_POST['value'])) {
    $value = null;
} elseif (is_array($_POST['value'])) {
    $value = false;
} else {
    $value = $_POST['value'];
}

Lapisan satu ini hampir setara dengan:

 
$value = (string)filter_input(INPUT_POST, 'value');

Jika Anda benar-benar menginginkan nilai string , seperti:

 
$a=10;
if($a==5) { $user_location='Paris';} else { }
echo $user_location;
    
26
2014-08-26 22: 15: 35Z

Ini karena variabel '$user_location' tidak didefinisikan. Jika Anda menggunakan loop if apa pun di mana Anda mendeklarasikan variabel '$user_location' maka Anda juga harus memiliki loop lain dan mendefinisikan yang sama. Misalnya:

 
$a=10;
if($a==5) { $user_location='Paris';} else { $user_location='SOMETHING OR BLANK'; }
echo $user_location;

Kode di atas akan membuat kesalahan karena The if loop tidak puas dan di loop lain '$user_location' tidak didefinisikan. PHP masih diminta untuk mengulangi variabel. Jadi untuk memodifikasi kode Anda harus melakukan hal berikut:

 display_errors     
25
2013-09-22 12: 55: 31Z

Sebagai balasan untuk "" Mengapa mereka muncul tiba-tiba? Saya biasa menggunakan skrip ini selama bertahun-tahun dan saya tidak pernah punya masalah. "

Sangat umum bagi sebagian besar situs untuk beroperasi di bawah pelaporan kesalahan "default" dari "Tampilkan semua kesalahan, tetapi bukan 'pemberitahuan' dan 'usang'". Ini akan diatur dalam php.ini dan berlaku untuk semua situs di server. Ini berarti bahwa "pemberitahuan" yang digunakan dalam contoh akan ditekan (disembunyikan) sementara kesalahan lainnya, yang dianggap lebih penting, akan ditampilkan /direkam.

Pengaturan penting lainnya adalah kesalahan dapat disembunyikan (mis. error_reporting disetel ke "mati" atau "syslog").

Apa yang akan terjadi dalam kasus ini adalah bahwa display_errors telah diubah untuk juga menampilkan pemberitahuan (sesuai contoh) dan /atau bahwa pengaturan diubah menjadi error_reporting di layar (sebagai lawan untuk menekannya /mencatatnya).

Mengapa mereka berubah?

Jawaban yang jelas /paling sederhana adalah seseorang menyesuaikan salah satu dari pengaturan ini di php.ini, atau versi PHP yang ditingkatkan sekarang menggunakan php.ini yang berbeda dari sebelumnya. Itu tempat pertama yang dilihat.

Namun dimungkinkan untuk mengabaikan pengaturan ini di

  • .htconf (konfigurasi server web, termasuk vhosts dan sub-konfigurasi) *
  • .htaccess
  • dalam kode php itu sendiri

dan semua ini juga bisa saja diubah.

Ada juga komplikasi tambahan bahwa konfigurasi server web dapat mengaktifkan /menonaktifkan arahan .htaccess, jadi jika Anda memiliki arahan dalam .htaccess yang tiba-tiba mulai /berhenti berfungsi maka Anda perlu memeriksanya.

(.htconf /.htaccess menganggap Anda menjalankan sebagai apache. Jika menjalankan baris perintah, ini tidak akan berlaku; jika menjalankan IIS atau server web lain, Anda harus memeriksa konfigurasi tersebut dengan benar)

  • Periksa display_errors dan error_reporting arahan php di php.ini belum berubah, atau Anda tidak menggunakan php.ini berbeda dari sebelumnya.
  • Periksa display_errors dan error_reporting arahan php dalam .htconf (atau vhosts dll) belum berubah
  • Periksa display_errors dan error_reporting arahan php dalam .htaccess belum berubah
  • Jika Anda memiliki arahan dalam .htaccess, periksa apakah masih diizinkan dalam file .htconf
  • Akhirnya periksa kode Anda; mungkin perpustakaan yang tidak terkait; untuk melihat apakah display_errors dan
    $user_location = null;
    
    arahan php telah ditetapkan di sana.
25
2016-11-23 01: 44: 03Z

perbaikan cepat adalah untuk menetapkan variabel Anda ke nol di bagian atas kode Anda

 
// Echo whatever the hell this is
<?=$_POST['something']?>
    
20
2014-05-12 19: 02: 26Z

Saya dulu mengutuk kesalahan ini, tetapi bisa mengingatkan Anda untuk melarikan diri dari input pengguna.

Misalnya, jika Anda menganggapnya pintar, kode singkatan:

 
// If this is set, echo a filtered version
<?=isset($_POST['something']) ? html($_POST['something']) : ''?>

... Pikirkan lagi! Solusi yang lebih baik adalah:

 html()

(Saya menggunakan fungsi

$greeting = "Hello, ".exst($user_name, 'Visitor')." from ".exst($user_location);


/** 
 * Function exst() - Checks if the variable has been set 
 * (copy/paste it in any place of your code)
 * 
 * If the variable is set and not empty returns the variable (no transformation)
 * If the variable is not set or empty, returns the $default value
 *
 * @param  mixed $var
 * @param  mixed $default
 * 
 * @return mixed 
 */

function exst( & $var, $default = "")
{
    $t = "";
    if ( !isset($var)  || !$var ) {
        if (isset($default) && $default != "") $t = $default;
    }
    else  {  
        $t = $var;
    }
    if (is_string($t)) $t = trim($t);
    return $t;
}
khusus untuk keluar dari karakter, jarak tempuh Anda mungkin beragam)     
16
2015-07-28 19: 12: 50Z

Saya menggunakan fungsi bermanfaat yang dimiliki sepanjang waktu exst () yang secara otomatis mendeklarasikan variabel.

Kode Anda adalah -

 $user_location     
14
2013-04-09 14: 07: 38Z

Dalam Bahasa Sederhana .
Kesalahannya adalah Anda menggunakan variabel $user_location = ''; yang sebelumnya tidak Anda tetapkan dan tidak memiliki nilai apa pun. Jadi saya sarankan Anda untuk menyenangkan menyatakan variabel ini sebelum menggunakan itu, Sebagai Contoh:


 $user_location = 'Los Angles';
Atau
echo "My index value is: " . ($my_array["my_index"] ?? '');

Ini adalah kesalahan yang sangat umum yang bisa Anda hadapi. Jadi jangan khawatir, cukup deklarasikan variabel dan Nikmati Pengodean .     
14
2015-12-18 11: 06: 24Z

Di PHP 7.0 sekarang mungkin menggunakan operator penggabungan Null:

 
echo "My index value is: " . (isset($my_array["my_index"]) ? $my_array["my_index"] : '');

Sama dengan:

 if (is_array($my_array['idontexist'] ?? '')) { dosomething(); }

manual PHP PHP 7.0

    
14
2016-12-12 13: 34: 57Z
  1. Wow, jawaban ini perlu lebih banyak dipilih sekarang karena ini tersedia di PHP 7. Solusi hebat !!!
    2017-09-24 13: 17: 26Z
  2. Ini juga berfungsi dengan baik dalam pernyataan if. isset()
    2018-02-23 20: 04: 40Z
  3. Kode Anda sebenarnya adalah bug yang diabaikan: ?? - hanya memeriksa is_array(), jika Anda lulus
    <?php
    error_reporting(E_ALL); // making sure all notices are on
    
    function idxVal(&$var, $default = null) {
             return empty($var) ? $var = $default : $var;
      }
    
    echo idxVal($arr['test']);         // returns null without any notice
    echo idxVal($arr['hey ho'], 'yo'); // returns yo and assigns it to array index, nice
    
    ?>
    
    - yang merupakan boolean, perilaku tak terduga akan mengikuti.
    2018-02-26 01: 20: 56Z

kenapa tidak sesederhana itu?

 E_STRICT     
8
2013-06-06 20: 37: 30Z

MENGAPA INI TERJADI?

Seiring waktu, PHP telah menjadi bahasa yang lebih berfokus pada keamanan. Pengaturan yang dulu dinonaktifkan secara default sekarang diaktifkan secara default. Contoh sempurna untuk ini adalah E_NOTICE, yang dinyalakan secara default pada PHP 5.4.0 .

Selanjutnya, menurut dokumentasi PHP, secara default,

; Common Values:
;   E_ALL (Show all errors, warnings and notices including coding standards.)
;   E_ALL & ~E_NOTICE  (Show all errors, except for notices)
;   E_ALL & ~E_NOTICE & ~E_STRICT  (Show all errors, except for notices and coding standards warnings.)
;   E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR  (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
; http://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
dinonaktifkan di php.ini. Dokumentasi PHP merekomendasikan menyalakannya untuk tujuan debugging . Namun, ketika saya mengunduh PHP dari repositori Ubuntu – dan dari tumpukan Windows BitNami – saya melihat sesuatu yang lain.  error_reporting

Perhatikan bahwa E_NOTICE sebenarnya disetel ke nilai produksi secara default, bukan ke nilai "default" secara default. Ini agak membingungkan dan tidak didokumentasikan di luar php.ini, jadi saya punya not memvalidasi ini di distribusi lain.

Namun, untuk menjawab pertanyaan Anda, kesalahan ini muncul saat tidak muncul sebelumnya karena:

  1. Anda memasang PHP dan pengaturan default yang baru sedikit didokumentasikan tetapi tidak mengecualikan E_NOTICE.

  2. E_NOTICE peringatan seperti variabel yang tidak ditentukan dan indeks yang tidak ditentukan sebenarnya membantu membuat kode Anda lebih bersih dan lebih aman. Saya dapat memberitahu Anda bahwa, tahun lalu, menjaga E_NOTICE diaktifkan memaksa saya untuk mendeklarasikan variabel saya. Itu membuatnya BANYAK lebih mudah untuk belajar C, kalau tidak menyatakan variabel jauh lebih besar dari gangguan.

APA YANG BISA SAYA LAKUKAN TENTANG ITU?

  1. Matikan E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED dengan menyalin "Nilai default" error_reporting = dan pasang kembaliacing dengan apa yang saat ini dihapus komentar setelah tanda sama dengan E_NOTICE. Mulai ulang Apache, atau PHP jika menggunakan CGI atau FPM. Pastikan Anda mengedit "benar" php.ini. Yang benar adalah Apache jika Anda menjalankan PHP dengan Apache, fpm atau php-fpm jika menjalankan PHP-FPM, cgi jika menjalankan PHP-CGI, dll. Ini bukan metode yang disarankan, tetapi jika Anda memiliki kode lawas yang akan sangat sulit untuk diedit, maka itu mungkin taruhan terbaik Anda.

  2. Matikan php_value pada level file atau folder. Ini mungkin lebih disukai jika Anda memiliki kode warisan tetapi ingin melakukan hal-hal dengan cara yang "benar" sebaliknya. Untuk melakukan ini, Anda harus berkonsultasi dengan Apache2, Nginx, atau apa pun server pilihan Anda. Di Apache, Anda akan menggunakan <Directory> di dalam display_errors.

  3. Tulis ulang kode Anda agar lebih bersih. Jika Anda perlu melakukan ini saat pindah ke lingkungan produksi atau tidak ingin seseorang melihat kesalahan Anda, pastikan Anda menonaktifkan tampilan kesalahan apa pun, dan hanya mencatat kesalahan Anda (lihat log_errors dan ~E_STRICT di php.ini dan pengaturan server Anda).

Untuk memperluas pada opsi 3: Ini adalah yang ideal. Jika Anda dapat menempuh rute ini, Anda harus melakukannya. Jika awalnya Anda tidak menggunakan rute ini, pertimbangkan untuk memindahkan rute ini pada akhirnya dengan menguji kode Anda di lingkungan pengembangan. Sementara Anda melakukannya, singkirkan ~E_DEPRECATED dan Undefined variable: my_variable_name untuk melihat apa yang salah di masa depan. Anda akan melihat BANYAK kesalahan yang tidak dikenal, tetapi itu akan menghentikan Anda dari memiliki masalah yang tidak menyenangkan ketika Anda perlu meningkatkan PHP di masa mendatang.

APA ARTINYA KESALAHAN?

function foo()
{
    $my_variable_name = '';

    //....

    if ($my_variable_name) {
        // perform some logic
    }
}
- Ini terjadi ketika variabel belum ditentukan sebelum digunakan. Ketika skrip PHP dijalankan, secara internal hanya mengasumsikan nilai nol. Namun, dalam skenario mana Anda perlu memeriksa variabel sebelum didefinisikan? Pada akhirnya, ini adalah argumen untuk "kode ceroboh". Sebagai pengembang, saya dapat memberi tahu Anda bahwa saya menyukainya ketika saya melihat proyek open source di mana variabel didefinisikan sebagai tinggi dalam cakupan mereka karena mereka dapat didefinisikan. Itu membuatnya lebih mudah untuk mengetahui variabel apa yang akan muncul di masa depan dan membuatnya lebih mudah untuk membaca /mempelajari kode.  Undefined index: my_index

// verbose way - generally better
if (isset($my_array['my_index'])) {
    echo "My index value is: " . $my_array['my_index'];
}

// non-verbose ternary example - I use this sometimes for small rules.
$my_index_val = isset($my_array['my_index'])?$my_array['my_index']:'(undefined)';
echo "My index value is: " . $my_index_val;   
- Ini terjadi ketika Anda mencoba mengakses nilai dalam sebuah array dan itu tidak ada. Untuk mencegah kesalahan ini, lakukan pemeriksaan bersyarat.  
$my_array = array(
    'my_index' => ''
);

//...

$my_array['my_index'] = 'new string';

Opsi lain adalah mendeklarasikan array kosong di bagian atas fungsi Anda. Ini tidak selalu memungkinkan.

 vim

(kiat tambahan)

  • Ketika saya menghadapi masalah ini dan lainnya, saya menggunakan NetBeans IDE (gratis) dan memberi saya host peringatan dan pemberitahuan. Beberapa dari mereka menawarkan tips yang sangat membantu. Ini bukan persyaratan, dan saya tidak menggunakan IDE lagi kecuali untuk proyek-proyek besar. Saya lebih dari
    <?php 
    
    $newArray[] = {1,2,3,4,5};
    print_r($newArray[5]);
    
    ?>
    
    orang hari ini :).
8
2019-04-25 11: 15: 56Z

indeks tidak terdefinisi berarti dalam array yang Anda minta untuk indeks array tidak tersedia misalnya

 
<?php print_r($myvar); ?>

variabel tidak terdefinisi berarti Anda telah menggunakan sepenuhnya tidak ada variabel atau yang tidak didefinisikan atau diinisialisasi dengan nama itu misalnya

 
php> echo array_key_exists(1, $myarray);

offset offset yang didefinisikan dalam array yang Anda minta tidak ada kunci. Dan itu solusi untuk ini adalah memeriksa sebelum menggunakan

 ini_set()     
6
2017-06-30 01: 02: 18Z

Mengenai bagian pertanyaan ini:

  

Kenapa mereka muncul tiba-tiba? Saya biasa menggunakan skrip ini selama bertahun-tahun dan saya tidak pernah punya masalah.

Tidak ada jawaban yang pasti tetapi berikut adalah beberapa kemungkinan penjelasan mengapa pengaturan dapat 'tiba-tiba' berubah:

  1. Anda telah meningkatkan versi PHP ke versi yang lebih baru yang dapat memiliki standar lain untuk error_reporting, display_errors atau pengaturan lain yang relevan.

  2. Anda telah menghapus atau memperkenalkan beberapa kode (mungkin dalam ketergantungan) yang menetapkan pengaturan yang relevan saat runtime menggunakan error_reporting() atau .htaccess (cari ini dalam kode)

  3. Anda mengubah konfigurasi server web (dengan asumsi apache di sini): $this file dan konfigurasi vhost juga dapat memanipulasi pengaturan php.

  4. Biasanya pemberitahuan tidak ditampilkan /dilaporkan (lihat manual PHP ) jadi ada kemungkinan bahwa ketika mengatur server,File php.ini tidak dapat dimuat karena suatu alasan (izin file ??) dan Anda berada pada pengaturan default. Kemudian, 'bug' telah diselesaikan (secara tidak sengaja) dan sekarang BISA memuat file php.ini yang benar dengan set error_reporting untuk menampilkan pemberitahuan.

4
2016-11-28 19: 31: 39Z

Jika bekerja dengan kelas, Anda perlu memastikan Anda mereferensi variabel anggota menggunakan

class Person
{
    protected $firstName;
    protected $lastName;

    public function setFullName($first, $last)
    {
        // Correct
        $this->firstName = $first;

        // Incorrect
        $lastName = $last;

        // Incorrect
        $this->$lastName = $last;
    }
}
:  
$query = "SELECT col1 FROM table WHERE col_x = ?";
    
3
2017-07-20 11: 44: 13Z

Alasan lain mengapa pemberitahuan indeks yang tidak ditentukan akan dilempar, adalah bahwa kolom dihilangkan dari permintaan basis data.

I.e .:

 
print_r($row['col1']);
print_r($row['col2']); // undefined index thrown

Lalu coba akses lebih banyak kolom /baris di dalam satu lingkaran.

I.e .:

 while

atau dalam loop

while( $row = fetching_function($query) ) {

    echo $row['col1'];
    echo "<br>";
    echo $row['col2']; // undefined index thrown
    echo "<br>";
    echo $row['col3']; // undefined index thrown

}
:  null

Hal lain yang perlu dicatat adalah bahwa pada * NIX OS dan Mac OS X, semuanya peka huruf besar-kecil.

Konsultasikan Q & A yang mengikuti di tumpukan:

3
2017-10-25 10: 15: 26Z
  1. Saya harus bertanya-tanya mengapa ini juga downvoted.
    2018-10-25 00: 26: 18Z

Menggunakan ternary sederhana, mudah dibaca, dan bersih:

Pra PHP 7
Tetapkan variabel ke nilai variabel lain jika disetel, jika tidak, tentukan

$newVariable = isset($thePotentialData) ? $thePotentialData : null;
(atau nilai default apa pun yang Anda butuhkan):  isset()

PHP 7+
Hal yang sama kecuali menggunakan Null Penggabungan Operator . Tidak perlu lagi menelepon

$newVariable = $thePotentialData ?? null;
karena ini sudah ada di dalamnya, dan tidak perlu lagi menyediakan variabel untuk kembali karena diasumsikan mengembalikan nilai variabel yang sedang diperiksa:  
if (isset($thePotentialData)) {
    $newVariable = $thePotentialData;
} else {
    $newVariable = null;
}

Keduanya akan menghentikan Pemberitahuan dari pertanyaan OP, dan keduanya sama persis dengan:

 echo


Jika Anda tidak memerlukan pengaturan variabel baru maka Anda dapat langsung menggunakan nilai yang dikembalikan ternary, seperti dengan

echo 'Your name is: ' . isset($name) ? $name : 'You did not provide one';
, argumen fungsi, dll:

Echo:

 
$foreName = getForeName(isset($userId) ? $userId : null);

function getForeName($userId)
{
    if ($userId === null) {
        // Etc
    }
}

Fungsi:

 $_SESSION['checkMe']

Hal di atas akan berfungsi sama dengan array, termasuk sesi, dll, menggantikan variabel yang diperiksa dengan mis .:
$clients['personal']['address']['postcode']
atau seberapa banyak level yang Anda butuhkan, mis .:
@


Penindasan:

Dimungkinkan untuk menekan Pemberitahuan PHP dengan

<!-- The data encoding type, enctype, MUST be specified as below -->
<form enctype="multipart/form-data" action="__URL__" method="POST">
    <!-- MAX_FILE_SIZE must precede the file input field -->
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
    <!-- Name of input element determines name in $_FILES array -->
    Send this file: <input name="userfile" type="file" />
    <input type="submit" value="Send File" />
</form>
atau mengurangi tingkat pelaporan kesalahan Anda, tetapi itu tidak memperbaiki masalah , itu hanya menghentikannya dilaporkan dalam log kesalahan. Ini berarti bahwa kode Anda masih mencoba menggunakan variabel yang tidak disetel, yang mungkin atau mungkin tidak berarti sesuatu tidak berfungsi sebagaimana dimaksud - tergantung pada seberapa penting nilai yang hilang itu.

Anda harus benar-benar memeriksa masalah ini dan menanganinya dengan tepat, baik menyajikan pesan yang berbeda, atau bahkan hanya mengembalikan nilai nol untuk segala sesuatu yang lain untuk mengidentifikasi keadaan yang tepat.

Jika Anda hanya peduli tentang Pemberitahuan yang tidak ada di log kesalahan, maka sebagai opsi Anda bisa mengabaikan log kesalahan tersebut.

    
2
2018-07-06 18: 56: 38Z

Mungkin Anda menggunakan versi PHP lama hingga dan sekarang memutakhirkan PHP karena alasan itu berfungsi tanpa kesalahan hingga sekarang dari tahun ke tahun. sampai PHP4 tidak ada kesalahan jika Anda menggunakan variabel tanpa mendefinisikannya tetapi pada PHP5 dan seterusnya ia melempar kesalahan untuk kode seperti yang disebutkan dalam pertanyaan.

    
0
2017-08-30 09: 08: 24Z

Saat berurusan dengan file, diperlukan enctype yang tepat dan metode POST, yang akan memicu pemberitahuan indeks yang tidak ditentukan jika keduanya tidak termasuk dalam formulir.

Manual menyatakan sintaks dasar berikut:

 

<?php
// In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead
// of $_FILES.

$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    echo "File is valid, and was successfully uploaded.\n";
} else {
    echo "Possible file upload attack!\n";
}

echo 'Here is some more debugging info:';
print_r($_FILES);

print "</pre>";

?>

 <form>

Referensi:

0
2017-10-07 12: 21: 51Z

Salah satu penyebab umum dari variabel tidak ada setelah formulir HTML dikirimkan adalah elemen formulir tidak terdapat dalam tag <form>:

Contoh: Elemen tidak terkandung dalam

<form action="example.php" method="post">
    <p>
        <input type="text" name="name" />
        <input type="submit" value="Submit" />
    </p>
</form>

<select name="choice">
    <option value="choice1">choice 1</option>
    <option value="choice2">choice 2</option>
    <option value="choice3">choice 3</option>
    <option value="choice4">choice 4</option>
</select>

 <form>

Contoh: Elemen sekarang terkandung dalam

<form action="example.php" method="post">
    <select name="choice">
        <option value="choice1">choice 1</option>
        <option value="choice2">choice 2</option>
        <option value="choice3">choice 3</option>
        <option value="choice4">choice 4</option>
    </select>
    <p>
        <input type="text" name="name" />
        <input type="submit" value="Submit" />
    </p>
</form>

 
153    foreach($cities as $key => $city){
154        if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){
    
0
2018-07-05 20: 46: 04Z

Saya mengajukan pertanyaan tentang ini dan saya dirujuk ke pos ini dengan pesan:

  

Pertanyaan ini sudah memiliki jawaban di sini:

     

"Pemberitahuan: Variabel tidak terdefinisi", "Pemberitahuan: Indeks tidak terdefinisi", dan "Pemberitahuan:   Offset yang tidak ditentukan ”menggunakan PHP

Saya membagikan pertanyaan dan solusi saya di sini:

Ini kesalahannya:

 masukkan deskripsi gambar di sini

Baris 154 adalah masalahnya. Inilah yang saya miliki di baris 154:

 $city

Saya pikir masalahnya adalah saya menulis jika kondisi untuk variabel $key => $city, yang bukan kuncinya tetapi nilainya di $citiesCounterArray[$key]. Pertama, bisakah Anda mengkonfirmasi jika itu adalah penyebab peringatan? Kedua, jika itu masalahnya, mengapa saya tidak bisa menulis kondisi berdasarkan nilai? Apakah harus dengan kunci yang harus saya tulis kondisinya?

PEMBARUAN 1: Masalahnya adalah ketika menjalankan $key, kadang-kadang $citiesCounterArray sesuai dengan kunci yang tidak ada dalam array $key, tetapi itu tidak selalu merupakan kasus berdasarkan pada data dari loop saya. Yang saya butuhkan adalah mengatur kondisi sehingga jika array_key_exists() ada dalam array, lalu jalankan kodenya, jika tidak, lewati saja.

UPDATE 2: Ini adalah bagaimana saya memperbaikinya dengan menggunakan

foreach($cities as $key => $city){
    if(array_key_exists($key, $citiesCounterArray)){
        if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){
:  
ini_set('error_reporting', 'on');
ini_set('display_errors', 'on');
error_reporting(E_ALL);
    
0
2018-09-01 18: 31: 57Z

Kesalahan ini terjadi setiap kali kami menggunakan variabel yang tidak disetel.

Cara terbaik untuk menghadapinya adalah mengatur pelaporan kesalahan saat pengembangan.

Untuk mengatur pelaporan kesalahan pada:

 
if ($my == 9) {
 $test = 'yes';  // Will produce error as $my is not 9.
}
echo $test;

Pada server produksi, pelaporan kesalahan tidak aktif, oleh karena itu, kami tidak mendapatkan kesalahan ini.

Di server pengembangan, kami dapat mengatur pelaporan kesalahan.

Untuk menghilangkan kesalahan ini, kami melihat contoh berikut:

 NULL

Kami dapat menginisialisasi variabel menjadi

$test = NULL;
if ($my == 9) {
 $test = 'yes';  // Will produce error as $my is not 9.
}
echo $test;
sebelum menetapkan nilainya atau menggunakannya.

Jadi, kami dapat mengubah kode sebagai:

 $test

Ini tidak akan mengganggu logika program apa pun dan tidak akan menghasilkan Pemberitahuan meskipun defined tidak memiliki nilai.

Jadi, pada dasarnya, selalu lebih baik untuk mengatur pelaporan kesalahan HIDUP untuk pengembangan.

Dan perbaiki semua kesalahan.

Dan saat produksi, pelaporan kesalahan harus dinonaktifkan.

    
0
2019-04-25 11: 14: 45Z

Pemberitahuan itu karena Anda tidak memiliki variabel my_index dan kunci $my_array yang digunakan tidak ada di code variabel.

Pemberitahuan itu dipicu setiap saat, karena

$my_variable_name = "Variable name"; // defining variable
echo "My variable value is: " . $my_variable_name;

if(isset($my_array["my_index"])){
    echo "My index value is: " . $my_array["my_index"]; // check if my_index is set 
}
Anda tidak benar, tetapi mungkin Anda tidak mengaktifkan pelaporan pemberitahuan.

Selesaikan bug:

 
ini_set("error_reporting", false)

Cara lain untuk mengeluarkan ini:

 
//If you only want to check variable has value and value has true and false value.
//But variable must be defined first.

if($my_variable_name){

}

//If you want to check variable is define or undefine
//Isset() does not check that variable has true or false value
//But it check null value of variable
if(isset($my_variable_name)){

}
    
- 1
2018-01-25 13: 09: 56Z

Dalam PHP Anda perlu kepalan untuk mendefinisikan variabel setelah itu Anda dapat menggunakannya.
Kami dapat memeriksa variabel didefinisikan atau tidak dengan cara yang sangat efisien !.

 
//It will work with :- true,false,NULL
$defineVarialbe = false;
if($defineVarialbe){
    echo "true";
}else{
    echo "false";
}

//It will check variable is define or not and variable has null value.
if(isset($unDefineVarialbe)){
    echo "true";
}else{
    echo "false";
}

Penjelasan Sederhana

      
- 1
2018-05-17 02: 43: 09Z
sumber ditempatkan sini