Pertanyaan Referensi - Apa arti kesalahan ini di PHP?


Apa ini?

Ini adalah sejumlah jawaban tentang peringatan, kesalahan, dan pemberitahuan yang mungkin Anda temui saat memrogram PHP dan tidak tahu cara memperbaikinya. Ini juga merupakan Wiki Komunitas, sehingga setiap orang diundang untuk berpartisipasi dalam menambah dan mempertahankan daftar ini.

Kenapa ini?

Pertanyaan seperti "Header sudah dikirim" atau "Memanggil anggota non-objek" sering muncul di Stack Overflow. Akar penyebab dari pertanyaan-pertanyaan itu selalu sama. Jadi jawaban atas pertanyaan-pertanyaan itu biasanya mengulanginya dan kemudian menunjukkan kepada OP garis mana yang berubah dalam kasusnya. Jawaban ini tidak menambahkan nilai apa pun ke situs karena hanya berlaku untuk kode khusus OP. Pengguna lain yang memiliki kesalahan yang sama tidak dapat dengan mudah membaca solusinya karena terlalu terlokalisasi. Itu menyedihkan, karena begitu Anda memahami akar masalahnya, memperbaiki kesalahan itu sepele. Oleh karena itu, daftar ini mencoba menjelaskan solusi dengan cara umum untuk diterapkan.

Apa yang harus saya lakukan di sini?

Jika pertanyaan Anda telah ditandai sebagai duplikat dari ini, silakan temukan pesan kesalahan Anda di bawah ini dan terapkan perbaikan pada kode Anda. Jawabannya biasanya berisi tautan lebih lanjut untuk diinvestigasi jika tidak jelas dari jawaban umum saja.

Jika Anda ingin berkontribusi, harap tambahkan pesan kesalahan "favorit" Anda, peringatan atau pemberitahuan, satu per jawaban, deskripsi singkat apa artinya (bahkan jika itu hanya menyoroti istilah ke halaman manual mereka), solusi yang mungkin atau pendekatan debugging dan daftar Q & A yang ada yang bernilai. Juga, jangan ragu untuk meningkatkan jawaban yang ada.

Daftar

Juga lihat


907


asal


Jawaban:


Peringatan: Tidak dapat mengubah informasi header - header sudah dikirim

Terjadi ketika skrip Anda mencoba mengirim tajuk HTTP ke klien, tetapi sudah ada keluaran sebelumnya, yang menghasilkan tajuk untuk dikirim ke klien.

Ini adalah sebuah E_WARNING dan itu tidak akan menghentikan skripnya.

Contoh umum adalah file template seperti ini:

<html>
    <?php session_start(); ?>
    <head><title>My Page</title>
</html>
...

Itu session_start() fungsi akan mencoba mengirim header dengan cookie sesi ke klien. Tetapi PHP sudah mengirim header ketika menulis <html> elemen ke arus keluaran. Anda harus memindahkan session_start() ke atas.

Anda bisa menyelesaikan ini dengan melewati garis sebelum kode memicu Peringatan dan periksa di mana hasilnya. Pindahkan kode pengiriman header apa pun sebelum kode itu.

Output yang sering diabaikan adalah baris baru setelah penutupan PHP ?>. Ini dianggap sebagai praktik standar untuk dihilangkan ?> ketika itu adalah hal terakhir dalam file. Demikian juga, penyebab umum lainnya untuk peringatan ini adalah ketika pembukaan <?php memiliki ruang kosong, garis, atau karakter yang tidak terlihat sebelumnya, menyebabkan webserver mengirim header dan spasi / newline sehingga ketika PHP mulai mem-parsing tidak akan dapat mengirimkan header apa pun.

Jika file Anda memiliki lebih dari satu <?php ... ?> blok kode di dalamnya, Anda seharusnya tidak memiliki spasi di antara mereka. (Catatan: Anda mungkin memiliki beberapa blok jika Anda memiliki kode yang dibangun secara otomatis)

Juga pastikan Anda tidak memiliki Byte Order Marks dalam kode Anda, misalnya ketika pengkodean skrip adalah UTF-8 dengan BOM.

Pertanyaan-pertanyaan Terkait:


225



Kesalahan fatal: Panggilan ke fungsi anggota ... pada non-objek

Terjadi dengan kode yang mirip dengan xyz->method() dimana xyz bukan objek dan oleh karena itu method tidak bisa disebut.

Ini adalah kesalahan fatal yang akan menghentikan skrip (pemberitahuan kompatibilitas maju: Ini akan menjadi kesalahan yang dapat ditelusuri dimulai dengan PHP 7).

Paling sering ini adalah tanda bahwa kode tersebut tidak memiliki pengecekan untuk kondisi kesalahan. Validasi bahwa objek sebenarnya adalah objek sebelum memanggil metodenya.

SEBUAH khas contoh akan

// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);

Pada contoh di atas, kueri tidak dapat disiapkan dan prepare() akan menugaskan false untuk $statement. Mencoba memanggil execute() metode ini kemudian akan menghasilkan Fatal Error karena false adalah "non-objek" karena nilainya boolean.

Cari tahu Mengapa fungsi Anda mengembalikan boolean sebagai ganti objek. Misalnya, periksa $pdo objek untuk kesalahan terakhir yang terjadi. Rincian tentang cara melakukan debug ini akan bergantung pada bagaimana kesalahan ditangani untuk fungsi / objek / kelas tertentu yang dimaksud.

Bahkan jika ->prepare gagal maka Anda $pdo database menangani objek tidak lolos ke lingkup saat ini. Temukan tempat yang ditentukan. Lalu, masukkan sebagai parameter, simpan sebagai properti, atau bagikan melalui cakupan global.

Masalah lain mungkin secara kondisional menciptakan objek dan kemudian mencoba memanggil metode di luar blok kondisional tersebut. Sebagai contoh

if ($someCondition) {
    $myObj = new MyObj();
}
// ...
$myObj->someMethod();

Dengan mencoba mengeksekusi metode di luar blok kondisional, objek Anda mungkin tidak ditentukan.

Pertanyaan-pertanyaan Terkait:


156



Tidak ada yang terlihat. Halaman kosong dan putih.

Juga dikenal sebagai Halaman Putih Kematian atau Layar Putih Kematian. Ini terjadi ketika pelaporan kesalahan dimatikan dan kesalahan fatal (sering kesalahan sintaks) terjadi.

Jika Anda memiliki kesalahan logging diaktifkan, Anda akan menemukan pesan kesalahan konkret dalam log kesalahan Anda. Ini biasanya akan berada dalam file bernama "php_errors.log", baik di lokasi pusat (mis. /var/log/apache2 di banyak lingkungan Linux) atau di direktori skrip itu sendiri (kadang-kadang digunakan dalam lingkungan hosting bersama).

Kadang-kadang mungkin lebih mudah untuk secara sementara mengaktifkan tampilan kesalahan. Halaman putih kemudian akan menampilkan pesan kesalahan. Berhati-hati karena kesalahan ini terlihat oleh semua orang yang mengunjungi situs web.

Ini dapat dengan mudah dilakukan dengan menambahkan di bagian atas skrip kode PHP berikut:

ini_set('display_errors', 1); error_reporting(~0);

Kode akan mengaktifkan tampilan kesalahan dan mengatur pelaporan ke level tertinggi.

Sejak itu ini_set() dijalankan saat runtime tidak memiliki efek pada parsing / sintaks kesalahan. Kesalahan itu akan muncul di log. Jika Anda ingin menampilkannya dalam output juga (mis. Di browser) Anda harus mengaturnya display_startup_errors direktif ke true. Lakukan ini baik di php.ini atau dalam .htaccess atau dengan metode lain apa pun yang memengaruhi konfigurasi sebelum runtime.

Anda dapat menggunakan metode yang sama untuk mengatur log_errors dan catatan eror arahan untuk memilih lokasi file log Anda sendiri.

Melihat di log atau menggunakan layar, Anda akan mendapatkan pesan kesalahan yang jauh lebih baik dan baris kode tempat skrip Anda berhenti.

Pertanyaan-pertanyaan Terkait:

Kesalahan terkait:


100



Perhatikan: Indeks Tidak Terdefinisi

Terjadi ketika Anda mencoba mengakses larik dengan kunci yang tidak ada dalam larik.

Contoh umum untuk sebuah Undefined Index pemberitahuan akan (demo)

$data = array('foo' => '42', 'bar');
echo $data['spinach'];
echo $data[1];

Kedua spinach dan 1 tidak ada dalam larik, menyebabkan E_NOTICE dipicu.

Solusinya adalah memastikan indeks atau offset ada sebelum mengakses indeks itu. Ini mungkin berarti bahwa Anda perlu memperbaiki bug di program Anda untuk memastikan bahwa indeks-indeks itu memang ada ketika Anda mengharapkannya. Atau mungkin itu berarti Anda perlu menguji apakah indeks sudah ada array_key_exists atau isset:

$data = array('foo' => '42', 'bar');
if (array_key_exists('spinach', $data)) {
    echo $data['spinach'];
}
else {
    echo 'No key spinach in array';
}

Jika Anda memiliki kode seperti:

<?php echo $_POST['message']; ?>
<form method="post" action="">
    <input type="text" name="message">
    ...

kemudian $_POST['message'] tidak akan diatur ketika halaman ini pertama kali dimuat dan Anda akan mendapatkan kesalahan di atas. Hanya ketika formulir dikirimkan dan kode ini dijalankan untuk kedua kalinya, indeks array akan ada. Anda biasanya memeriksa ini dengan:

if ($_POST)  ..  // if the $_POST array is not empty
// or
if ($_SERVER['REQUEST_METHOD'] == 'POST') ..  // page was requested with POST

Pertanyaan-pertanyaan Terkait:


89



Peringatan: mysql_fetch_array () mengharapkan parameter 1 sebagai sumber daya, diberikan boolean

Pertama dan terutama:

Tolong, jangan gunakan mysql_* berfungsi dalam kode baru. Mereka tidak lagi dipertahankan dan secara resmi tidak digunakan lagi. Lihat kotak merah? Belajar tentang pernyataan siap sebagai gantinya, dan gunakan PDO atau MySQLi - artikel ini akan membantu Anda memutuskan yang mana. Jika Anda memilih PDO, di sini adalah tutorial yang bagus.


Ini terjadi ketika Anda mencoba mengambil data dari hasil mysql_query tetapi permintaan gagal.

Ini adalah peringatan dan tidak akan menghentikan skrip, tetapi akan membuat program Anda salah.

Anda perlu memeriksa hasil yang dikembalikan oleh mysql_query oleh

$res = mysql_query($sql);
if (!$res) {
   die(mysql_error());
}
// after checking, do the fetch

Pertanyaan-pertanyaan Terkait:

Kesalahan Terkait:

Lain mysql* fungsi yang juga mengharapkan sumber daya hasil mysql sebagai parameter akan menghasilkan kesalahan yang sama untuk alasan yang sama.


75



Kesalahan fatal: Menggunakan $ ini ketika tidak dalam konteks objek

$this adalah variabel khusus dalam PHP yang tidak dapat ditugaskan. Jika diakses dalam konteks di mana tidak ada, kesalahan fatal ini diberikan.

Kesalahan ini dapat terjadi:

  1. Jika metode non-statis disebut statis. Contoh:

    class Foo {
       protected $var;
       public function __construct($var) {
           $this->var = $var;
       }
    
       public static function bar () {
           // ^^^^^^
           echo $this->var;
           //   ^^^^^
       }
    }
    
    Foo::bar();
    

    Bagaimana cara memperbaiki: tinjau kode Anda lagi, $this hanya dapat digunakan dalam konteks objek, dan tidak boleh digunakan dalam metode statis. Juga, metode statis seharusnya tidak mengakses properti non-statis. Menggunakan self::$static_property untuk mengakses properti statis.

  2. Jika kode dari metode kelas telah disalin ke fungsi normal atau hanya lingkup global dan menjaga $thisvariabel khusus.
    Bagaimana cara memperbaiki: Tinjau kode dan ganti $this dengan variabel substitusi yang berbeda.

Pertanyaan-pertanyaan Terkait:

  1. Memanggil metode non-statis sebagai statis: PHP Fatal error: Menggunakan $ this ketika tidak dalam konteks objek
  2. Salin lebih dari kode: Kesalahan fatal: Menggunakan $ ini ketika tidak dalam konteks objek
  3. Semua "Menggunakan $ ini ketika tidak dalam konteks objek" Pertanyaan pada Stackoverflow

69



Kesalahan fatal: Panggilan ke fungsi tidak terdefinisi XXX

Terjadi ketika Anda mencoba memanggil fungsi yang belum ditentukan. Penyebab umum termasuk ekstensi yang hilang dan termasuk, deklarasi fungsi kondisional, fungsi dalam deklarasi fungsi atau kesalahan ketik sederhana.

Contoh 1 - Deklarasi Fungsi Bersyarat

$someCondition = false;
if ($someCondition === true) {
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

Pada kasus ini, fn() tidak akan pernah dinyatakan karena $someCondition tidak benar.

Contoh 2 - Berfungsi dalam Deklarasi Fungsi

function createFn() 
{
    function fn() {
        return 1;
    }
}
echo fn(); // triggers error

Pada kasus ini, fn hanya akan dinyatakan satu kali createFn() dipanggil. Perhatikan bahwa panggilan selanjutnya ke createFn() akan memicu kesalahan tentang Redeclaration of anisting function.

Anda mungkin juga melihat ini untuk fungsi built-in PHP. Coba cari fungsi di manual resmi, dan periksa "ekstensi" apa (modul PHP) miliknya, dan versi PHP apa yang mendukungnya.

Dalam kasus perpanjangan yang hilang, instal ekstensi itu dan aktifkan di php.ini. Lihat Petunjuk Instalasi dalam Manual PHP untuk ekstensi fungsi Anda. Anda juga dapat mengaktifkan atau menginstal ekstensi menggunakan manajer paket Anda (mis. apt di Debian atau Ubuntu, yum di Red Hat atau CentOS), atau panel kontrol di lingkungan hosting bersama.

Jika fungsi ini diperkenalkan dalam versi PHP yang lebih baru dari yang Anda gunakan, Anda mungkin menemukan tautan ke penerapan alternatif di manual atau bagian komentarnya. Jika telah dihapus dari PHP, cari informasi tentang mengapa, karena mungkin tidak lagi diperlukan.

Dalam hal termasuk yang hilang, pastikan untuk menyertakan file yang mendeklarasikan fungsi sebelum memanggil fungsi.

Jika terjadi salah ketik, perbaiki kesalahan ketik.

Pertanyaan-pertanyaan Terkait:


66



Kesalahan Parse: kesalahan sintaks, T_XXX yang tidak diharapkan

Terjadi ketika Anda memilikinya T_XXX token di tempat yang tidak disangka, kurung tak seimbang (berlebihan), penggunaan tag pendek tanpa mengaktifkannya di php.ini, dan banyak lagi.

Pertanyaan-pertanyaan Terkait:

Untuk bantuan lebih lanjut, lihat:


65



Kesalahan fatal: Tidak dapat menggunakan fungsi mengembalikan nilai dalam konteks penulisan

Ini biasanya terjadi ketika menggunakan fungsi langsung dengan empty.

Contoh:

if (empty(is_null(null))) {
  echo 'empty';
}

Hal ini karena empty adalah konstruksi bahasa dan bukan fungsi, itu tidak dapat disebut dengan ekspresi sebagai argumennya dalam versi PHP sebelum 5.5. Sebelum PHP 5.5, argumen untuk empty()harus menjadi a variabel, tetapi ekspresi arbitrer (seperti nilai kembalinya fungsi) diperbolehkan dalam PHP 5.5+.

empty, terlepas dari namanya, tidak benar-benar memeriksa apakah suatu variabel "kosong". Sebaliknya, ia memeriksa apakah suatu variabel tidak ada, atau == false. Ekspresi (suka is_null(null) dalam contoh) akan selalu dianggap ada, jadi di sini empty hanya memeriksa apakah itu sama dengan salah. Anda bisa mengganti empty() disini dengan !, mis. if (!is_null(null)), atau secara eksplisit dibandingkan dengan false, mis. if (is_null(null) == false).

Pertanyaan-pertanyaan Terkait:


60