Rumah > Soal Jawab > teks badan
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:
Apabila menggunakan sesi, anda perlu meletakkan session_start();
dalam semua fail yang menggunakan sesi.
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:
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:
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
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.
Gunakan @operator untuk menyekat ralat. Meninggalkan sini atas sebab sejarah, tetapi serius, ini tidak sepatutnya berlaku.
Nota: Sangat disyorkan untuk hanya melaksanakan perkara 1.
Notis/amaran ini berlaku apabila anda (atau PHP) cuba mengakses indeks tatasusunan yang tidak ditentukan.
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. null
或 false
). 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']; }
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: