Apa ini?
Ini adalah sejumlah jawaban tentang peringatan, kesalahan, dan pemberitahuan yang mungkin Anda temui saat pemrograman PHP dan tidak memiliki petunjuk bagaimana cara memperbaikinya. Ini juga Wiki Komunitas, jadi semua orang diundang untuk ikut serta menambah dan memelihara daftar ini.
Kenapa ini?
Pertanyaan seperti "Header sudah terkirim" atau "Memanggil anggota non-objek" sering muncul di Stack Overflow. Akar penyebab dari pertanyaan-pertanyaan itu selalu sama. Jadi jawaban untuk pertanyaan-pertanyaan itu biasanya mengulanginya dan kemudian menunjukkan OP baris mana yang akan berubah dalam kasus khusus mereka. Jawaban-jawaban ini tidak menambah 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 mereka terlalu lokal. Itu menyedihkan karena sekali Anda memahami akar penyebabnya, memperbaiki kesalahan itu sepele. Karenanya, daftar ini mencoba menjelaskan solusi secara umum untuk diterapkan.
Apa yang harus saya lakukan di sini?
Jika pertanyaan Anda telah ditandai sebagai duplikat dari pertanyaan ini, temukan pesan kesalahan Anda di bawah ini dan terapkan perbaikannya pada kode Anda. Jawabannya biasanya berisi tautan lebih lanjut untuk diselidiki seandainya tidak jelas dari jawaban umum saja.
Jika Anda ingin berkontribusi, silakan tambahkan pesan kesalahan, peringatan atau pemberitahuan "favorit" Anda, 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 T&J yang ada yang bernilai. Juga, jangan ragu untuk meningkatkan jawaban yang ada.
Daftar
- Tidak ada yang terlihat. Halaman itu kosong dan putih. (Juga dikenal sebagai White Page / Screen Of Death )
- Kode tidak berjalan / apa yang tampak seperti bagian dari kode PHP saya adalah output
- Peringatan: Tidak dapat mengubah informasi header - header sudah dikirim
- Peringatan: mysql_fetch_array () mengharapkan parameter 1 menjadi sumber daya, diberikan boolean alias
Peringatan: mysql_fetch_array (): argumen yang diberikan bukan sumber daya hasil MySQL yang valid alias
Peringatan: mysqli_num_rows () mengharapkan parameter 1 menjadi mysqli_result, boolean diberikan (atau variasi serupa) - Peringatan: [fungsi] mengharapkan parameter 1 menjadi sumber daya, diberikan boolean
- Peringatan: [fungsi] : gagal membuka aliran: [alasan]
- Peringatan: pembatasan open_basedir berlaku
- Peringatan: Pembagian dengan nol
- Peringatan: Offset string ilegal 'XXX'
- Peringatan: count (): Parameter harus berupa array atau objek yang mengimplementasikan Countable
- Parse error: syntax error, tak terduga '['
- Kesalahan parse: kesalahan sintaksis, T_XXX yang tidak terduga
- Kesalahan Parse: kesalahan sintaksis, T_ENCAPSED_AND_WHITESPACE yang tidak terduga
- Kesalahan parse: kesalahan sintaksis, T_PAAMAYIM_NEKUDOTAYIM yang tidak terduga
- Kesalahan parse: kesalahan sintaksis, 'tak terduga diperlukan' (T_REQUIRE_ONCE), fungsi yang diharapkan (T_FUNCTION)
- Kesalahan Parse: kesalahan sintaksis, T_VARIABLE yang tidak terduga
- Kesalahan fatal: Ukuran memori yang diizinkan dari XXX byte habis (mencoba mengalokasikan XXX byte)
- Kesalahan fatal: Memanggil ke fungsi anggota ... pada non-objek atau null
- Kesalahan Fatal: Panggil ke fungsi Tidak Terdefinisi XXX
- Kesalahan fatal: Tidak dapat mendeklarasikan ulang XXX
- Kesalahan fatal: Tidak dapat menggunakan nilai pengembalian fungsi dalam konteks tulis
- Kesalahan fatal: Pernyataan AAA :: BBB () harus kompatibel dengan CCC :: BBB () '
- Kesalahan fatal: Menggunakan $ this saat tidak dalam konteks objek
- Kesalahan fatal: Objek penutupan kelas tidak dapat dikonversi ke string
- Kesalahan fatal: Konstanta kelas tidak terdefinisi
- Perhatian: Array to string conversion
- Perhatikan: Mencoba mendapatkan properti dari kesalahan non-objek
- Pemberitahuan: Variabel atau properti yang tidak ditentukan
- Pemberitahuan: Indeks Tidak Terdefinisi
- Perhatian: Undefined offset XXX [Referensi]
- Perhatikan: Offset string yang tidak diinisialisasi: XXX
- Perhatian: Penggunaan XXX yang tidak didefinisikan konstan - diasumsikan 'XXX'
- MySQL: Anda memiliki kesalahan dalam sintaks SQL Anda; periksa manual yang sesuai dengan versi server MySQL Anda untuk sintaks yang tepat untuk digunakan di dekat ... di baris ...
- Standar Ketat: Metode non-statis [<class> :: <method>] tidak boleh dipanggil secara statis
- Peringatan: fungsi mengharapkan parameter X menjadi boolean / string / integer
- Kesalahan HTTP 500 - Kesalahan server internal
- Tidak digunakan lagi: Sintaks akses array dan string offset dengan kurung kurawal sudah ditinggalkan
Juga, lihat:
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 yang sudah dikirim ke klien.
Ini adalah
E_WARNING
dan tidak akan menghentikan skrip.Contoh tipikal adalah file templat seperti ini:
The
session_start()
fungsi akan mencoba untuk mengirim header dengan sesi cookie untuk klien. Tetapi PHP sudah mengirim header ketika menulis<html>
elemen ke aliran output. Anda harus memindahkansession_start()
ke atas.Anda dapat menyelesaikan ini dengan menelusuri baris sebelum kode memicu Peringatan dan memeriksa di mana output. Pindahkan header yang mengirim kode sebelum kode itu.
Output yang sering diabaikan adalah baris baru setelah PHP ditutup
?>
. 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, baris, atau karakter yang tidak terlihat sebelumnya, menyebabkan server web mengirim header dan spasi / baris baru sehingga ketika PHP mulai 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 antaranya. (Catatan: Anda mungkin memiliki beberapa blok jika Anda memiliki kode yang dibuat secara otomatis)Pastikan juga Anda tidak memiliki Byte Orders Marks dalam kode Anda, misalnya ketika pengkodean skrip adalah UTF-8 dengan BOM.
Pertanyaan-pertanyaan Terkait:
sumber
<?php ?>
dan "lebih dari satu blok" akan terbentuk<?php ?> <?php ?>
?Kesalahan fatal: Memanggil ke fungsi anggota ... pada benda yang bukan objek
Terjadi dengan kode yang mirip dengan di
xyz->method()
manaxyz
bukan objek dan karena itumethod
tidak dapat dipanggil.Ini adalah kesalahan fatal yang akan menghentikan skrip (meneruskan pemberitahuan kompatibilitas: Ini akan menjadi kesalahan yang bisa dimulai dengan PHP 7).
Paling sering ini adalah tanda bahwa kode tidak ada pemeriksaan untuk kondisi kesalahan. Validasi bahwa suatu objek sebenarnya adalah objek sebelum memanggil metode-metodenya.
Contoh khasnya adalah
Dalam contoh di atas, query tidak dapat disiapkan dan
prepare()
akan menetapkanfalse
untuk$statement
. Mencoba memanggilexecute()
metode maka akan menghasilkan Kesalahan Fatal karenafalse
merupakan "non-objek" karena nilainya boolean.Cari tahu mengapa fungsi Anda mengembalikan boolean, bukan objek. Misalnya, periksa
$pdo
objek untuk kesalahan terakhir yang terjadi. Rincian tentang cara men-debug ini akan tergantung pada bagaimana kesalahan ditangani untuk fungsi / objek / kelas tertentu yang dimaksud.Jika bahkan
->prepare
gagal maka objek$pdo
database menangani Anda tidak diteruskan ke lingkup saat ini . Temukan di mana ia didefinisikan. Kemudian berikan sebagai parameter, simpan sebagai properti, atau bagikan melalui lingkup global.Masalah lain mungkin secara kondisional membuat objek dan kemudian mencoba memanggil metode di luar blok bersyarat itu. Sebagai contoh
Dengan mencoba mengeksekusi metode di luar blok bersyarat, objek Anda mungkin tidak didefinisikan.
Pertanyaan-pertanyaan Terkait:
sumber
Tidak ada yang terlihat. Halaman itu kosong dan putih.
Juga dikenal sebagai White Page Of Death atau White Screen Of Death . 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 di log kesalahan Anda. Ini biasanya akan berada dalam file yang disebut "php_errors.log", baik di lokasi pusat (misalnya
/var/log/apache2
di banyak lingkungan Linux) atau di direktori skrip itu sendiri (kadang-kadang digunakan dalam lingkungan hosting bersama).Terkadang mungkin lebih mudah untuk mengaktifkan sementara tampilan kesalahan. Halaman putih kemudian akan menampilkan pesan kesalahan. Berhati-hatilah karena kesalahan ini dapat dilihat oleh semua orang yang mengunjungi situs web.
Ini dapat dengan mudah dilakukan dengan menambahkan di atas script kode PHP berikut:
Kode akan mengaktifkan tampilan kesalahan dan mengatur pelaporan ke level tertinggi.
Karena
ini_set()
dijalankan pada saat runtime tidak memiliki efek pada kesalahan parsing / sintaksis. Kesalahan itu akan muncul di log. Jika Anda ingin menampilkannya di output juga (misalnya di browser) Anda harus mengaturdisplay_startup_errors
direktif ketrue
. Lakukan ini di dalamphp.ini
atau di dalam.htaccess
atau dengan metode lain yang memengaruhi konfigurasi sebelum runtime .Anda dapat menggunakan metode yang sama untuk mengatur arahan log_errors dan error_log untuk memilih lokasi file log Anda sendiri.
Melihat log atau menggunakan tampilan, Anda akan mendapatkan pesan kesalahan yang jauh lebih baik dan garis kode tempat skrip Anda berhenti.
Pertanyaan-pertanyaan Terkait:
Kesalahan terkait:
sumber
error_reporting(~0);
mengapa tidak-1
? Itulah yang~0
dievaluasi, dan jauh lebih samar.~0
lebih eksplisit IMO: meniadakan set bit kosong, yaitu mengaktifkan semua flag. -1 tidak dimaksudkan untuk berdiri untuk «tidak ditemukan» seperti di strpos () di C, tetapi sebagai bitset dengan semua flag yang ditetapkan, karena -1 adalah biner1111'1111'1111'1111
(untuk 32 bit).1111'1111'1111'1111
benar-benar 16 bit, tapi saya harap Anda mengerti apa yang saya maksud.E_STRICT
tidak termasuk dalamE_ALL
. php.net/manual/en/errorfunc.constants.php dan gulir ke bawah keE_STRICT
.Pemberitahuan: Indeks Tidak Terdefinisi
Terjadi ketika Anda mencoba mengakses array dengan kunci yang tidak ada dalam array.
Contoh khas
Undefined Index
pemberitahuan adalah ( demo )Keduanya
spinach
dan1
tidak ada dalam array, menyebabkanE_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 itu memang ada saat Anda mengharapkannya. Atau itu mungkin berarti bahwa Anda perlu menguji apakah indeks menggunakan
array_key_exists
atau menggunakanisset
:Jika Anda memiliki kode seperti:
maka
$_POST['message']
tidak akan ditetapkan saat halaman ini pertama kali dimuat dan Anda akan mendapatkan kesalahan di atas. Hanya ketika formulir dikirimkan dan kode ini dijalankan kedua kalinya indeks array akan ada. Anda biasanya memeriksa ini dengan:Pertanyaan-pertanyaan Terkait:
sumber
if(!empty($_POST['message'])){ //do stuff }
Peringatan: mysql_fetch_array () mengharapkan parameter 1 menjadi sumber daya, diberikan boolean
Pertama dan terutama:
Ini terjadi ketika Anda mencoba mengambil data dari hasil
mysql_query
tetapi kueri gagal.Ini adalah peringatan dan tidak akan menghentikan skrip, tetapi akan membuat program Anda salah.
Anda perlu memeriksa hasilnya dikembalikan
mysql_query
olehPertanyaan-pertanyaan Terkait:
Kesalahan Terkait:
mysql*
Fungsi lain yang juga mengharapkan sumber daya hasil MySQL sebagai parameter akan menghasilkan kesalahan yang sama karena alasan yang sama.sumber
mysql_query
tidak cukup buruk, menambahkanor die
di atasnya menambah penghinaan pada cedera.$res = mysql_query($query)
mengembalikan 1 jika kueri berhasil sehingga dianggap benar. Oleh karena itu ketika memberikan hasilmysql_query
untukmysql_fetch_array()
pemberitahuan menunjukkan.mysql_fetch_array() expects parameter 1 to be resource, boolean given in select
silakan lihat - gist.github.com/romelemperado/93af4cdbd44ebf3a07cbfa0e3fc539d7 Ada saran untuk menghilangkan kesalahan ini?mysql_fetch_array()
adalah untuk kueri pemilihan, untuk menyisipkan dan memperbarui, Anda tidak perlu mengambil set hasil (dan tidak ada set hasil yang membiarkan Anda mengambil).Kesalahan fatal: Menggunakan $ this saat tidak dalam konteks objek
$this
adalah variabel khusus dalam PHP yang tidak dapat ditetapkan. Jika diakses dalam konteks di mana tidak ada, kesalahan fatal ini diberikan.Kesalahan ini dapat terjadi:
Jika metode non-statis disebut secara statis. Contoh:
Cara memperbaiki: tinjau kembali kode Anda,
$this
hanya dapat digunakan dalam konteks objek, dan jangan pernah digunakan dalam metode statis. Juga, metode statis tidak boleh mengakses properti non-statis. Gunakanself::$static_property
untuk mengakses properti statis.Jika kode dari metode kelas telah disalin ke fungsi normal atau hanya lingkup global dan menjaga
$this
variabel khusus.Cara memperbaiki: Tinjau kode dan ganti
$this
dengan variabel substitusi yang berbeda.Pertanyaan-pertanyaan Terkait:
sumber
$closure = function() { self::method(); }
.$this
Anda dapat memicu "kesalahan fatal: Menggunakan $ ini saat ini tidak dalam konteks objek" :$closure = function() { $this->method(); };
Kesalahan fatal: Panggilan ke fungsi yang tidak ditentukan XXX
Terjadi ketika Anda mencoba memanggil fungsi yang belum didefinisikan. Penyebab umum termasuk ekstensi yang hilang dan termasuk, deklarasi fungsi kondisional, fungsi dalam deklarasi fungsi atau salah ketik sederhana.
Contoh 1 - Deklarasi Fungsi Bersyarat
Dalam hal ini,
fn()
tidak akan pernah dinyatakan karena$someCondition
itu tidak benar.Contoh 2 - Fungsi dalam Deklarasi Fungsi
Dalam hal ini,
fn
hanya akan dinyatakan setelahcreateFn()
dipanggil. Perhatikan bahwa panggilan selanjutnya kecreateFn()
akan memicu kesalahan tentang Redeclaration dari fungsi yang ada.Anda juga dapat melihat ini untuk fungsi bawaan PHP. Coba cari fungsi dalam manual resmi , dan periksa "ekstensi" apa (modul PHP) miliknya, dan versi PHP apa yang mendukungnya.
Jika ada ekstensi yang hilang, instal ekstensi itu dan aktifkan di php.ini. Rujuk ke Petunjuk Instalasi dalam Manual PHP untuk mengetahui ekstensi tempat fungsi Anda muncul. Anda mungkin juga dapat mengaktifkan atau menginstal ekstensi menggunakan manajer paket Anda (mis.
apt
Dalam Debian atau Ubuntu,yum
dalam Red Hat atau CentOS), atau panel kontrol di lingkungan hosting bersama.Jika fungsi tersebut diperkenalkan dalam versi PHP yang lebih baru dari apa yang Anda gunakan, Anda dapat menemukan tautan ke implementasi alternatif di manual atau bagian komentarnya. Jika sudah dihapus dari PHP, cari informasi tentang alasannya, karena mungkin tidak diperlukan lagi.
Dalam kasus yang hilang termasuk, pastikan untuk memasukkan file yang menyatakan fungsi sebelum memanggil fungsi.
Dalam hal kesalahan ketik, perbaiki kesalahan ketik.
Pertanyaan-pertanyaan Terkait:
sumber
Kesalahan parse: kesalahan sintaksis, T_XXX yang tidak terduga
Terjadi ketika Anda memiliki
T_XXX
token di tempat yang tak terduga, tanda kurung tidak seimbang (berlebihan), penggunaan tag pendek tanpa mengaktifkannya di php.ini, dan banyak lagi.Pertanyaan-pertanyaan Terkait:
Untuk bantuan lebih lanjut lihat:
sumber
Kesalahan fatal: Tidak dapat menggunakan nilai pengembalian fungsi dalam konteks tulis
Ini biasanya terjadi ketika menggunakan fungsi langsung dengan
empty
.Contoh:
Ini karena
empty
merupakan konstruksi bahasa dan bukan fungsi, tidak dapat dipanggil dengan ekspresi sebagai argumennya dalam versi PHP sebelum 5.5. Sebelum PHP 5.5, argumenempty()
harus berupa variabel , tetapi ekspresi arbitrer (seperti nilai balik fungsi) diizinkan dalam PHP 5.5+.empty
, terlepas dari namanya, sebenarnya tidak memeriksa apakah suatu variabel "kosong". Sebagai gantinya, ia memeriksa apakah suatu variabel tidak ada, atau== false
. Ekspresi (sepertiis_null(null)
dalam contoh) akan selalu dianggap ada, jadi di siniempty
hanya memeriksa apakah itu sama dengan false. Anda dapat mengganti diempty()
sini dengan!
, misalnyaif (!is_null(null))
, atau secara eksplisit membandingkan ke false, misalnyaif (is_null(null) == false)
.Pertanyaan-pertanyaan Terkait:
sumber
MySQL: Anda memiliki kesalahan dalam sintaks SQL Anda; periksa manual yang sesuai dengan versi server MySQL Anda untuk sintaks yang tepat untuk digunakan di dekat ... di baris ...
Kesalahan ini sering disebabkan karena Anda lupa untuk melarikan diri dari data yang dikirimkan ke permintaan MySQL.
Contoh apa yang tidak boleh dilakukan ("Ide Buruk"):
Kode ini dapat dimasukkan dalam halaman dengan formulir untuk dikirimkan, dengan URL seperti http://example.com/edit.php?id=10 (untuk mengedit posting n ° 10)
Apa yang akan terjadi jika teks yang dikirim berisi kutipan tunggal?
$query
akan berakhir dengan:Dan ketika permintaan ini dikirim ke MySQL, itu akan mengeluh bahwa sintaksnya salah, karena ada kutipan tunggal tambahan di tengah.
Untuk menghindari kesalahan seperti itu, Anda HARUS selalu melarikan diri data sebelum digunakan dalam kueri.
Melarikan data sebelum digunakan dalam kueri SQL juga sangat penting karena jika tidak, skrip Anda akan terbuka untuk injeksi SQL. Injeksi SQL dapat menyebabkan perubahan, kehilangan, atau modifikasi catatan, tabel, atau seluruh database. Ini adalah masalah keamanan yang sangat serius!
Dokumentasi:
mysql_real_escape_string()
mysqli_real_escape_string()
sumber
Kesalahan fatal: Ukuran memori yang diizinkan dari XXX byte habis (mencoba mengalokasikan XXX byte)
Tidak ada cukup memori untuk menjalankan skrip Anda. PHP telah mencapai batas memori dan berhenti menjalankannya. Kesalahan ini fatal, skrip berhenti. Nilai batas memori dapat dikonfigurasi baik dalam
php.ini
file atau dengan menggunakanini_set('memory_limit', '128 M');
dalam skrip (yang akan menimpa nilai yang ditentukan dalamphp.ini
). Tujuan dari batas memori adalah untuk mencegah satu skrip PHP dari menelan semua memori yang tersedia dan menjatuhkan seluruh server web.Hal pertama yang harus dilakukan adalah meminimalkan jumlah memori yang dibutuhkan skrip Anda. Misalnya, jika Anda membaca file besar menjadi variabel atau mengambil banyak catatan dari database dan menyimpan semuanya dalam sebuah array, yang mungkin menggunakan banyak memori. Ubah kode Anda sebagai gantinya membaca file baris demi baris atau mengambil catatan database satu per satu tanpa menyimpan semuanya dalam memori. Ini memang membutuhkan sedikit kesadaran konseptual tentang apa yang terjadi di balik layar dan ketika data disimpan dalam memori vs di tempat lain.
Jika kesalahan ini terjadi ketika skrip Anda tidak melakukan pekerjaan intensif-memori, Anda perlu memeriksa kode Anda untuk melihat apakah ada kebocoran memori. The
memory_get_usage
Fungsi adalah teman Anda.Pertanyaan-pertanyaan Terkait:
sumber
Kesalahan Parse: kesalahan sintaksis, T_ENCAPSED_AND_WHITESPACE yang tidak terduga
Kesalahan ini paling sering ditemui ketika mencoba untuk mereferensikan nilai array dengan kunci yang dikutip untuk interpolasi di dalam string yang dikutip ganda ketika seluruh konstruk variabel kompleks tidak disertakan
{}
.Kasus kesalahan:
Ini akan menghasilkan
Unexpected T_ENCAPSED_AND_WHITESPACE
:Kemungkinan perbaikan:
Dalam string yang dikutip ganda, PHP akan mengizinkan string kunci array digunakan tanpa tanda kutip , dan tidak akan mengeluarkan
E_NOTICE
. Jadi di atas dapat ditulis sebagai:Seluruh variabel dan kunci array kompleks dapat dilampirkan
{}
, dalam hal ini mereka harus dikutip untuk menghindariE_NOTICE
. Dokumentasi PHP merekomendasikan sintaks ini untuk variabel kompleks.Tentu saja, alternatif untuk salah satu di atas adalah menyatukan variabel array bukan menginterpolasinya:
Untuk referensi, lihat bagian tentang Parsing Variabel di halaman manual PHP Strings
sumber
Peringatan: [fungsi] : gagal membuka aliran: [alasan]
Itu terjadi ketika Anda memanggil file biasanya dengan
include
,require
ataufopen
dan PHP tidak dapat menemukan file atau tidak memiliki cukup izin untuk memuat file.Ini dapat terjadi karena berbagai alasan:
Satu kesalahan umum adalah tidak menggunakan jalur absolut. Ini dapat dengan mudah diselesaikan dengan menggunakan jalur penuh atau konstanta ajaib seperti
__DIR__
ataudirname(__FILE__)
:atau:
Memastikan jalur yang benar digunakan adalah salah satu langkah dalam mengatasi masalah ini, ini juga dapat dikaitkan dengan file yang tidak ada, hak sistem file yang mencegah akses atau pembatasan berbasis openir oleh PHP itu sendiri.
Cara terbaik untuk menyelesaikan masalah ini dengan cepat adalah dengan mengikuti daftar periksa pemecahan masalah di bawah ini.
Pertanyaan-pertanyaan Terkait:
Kesalahan Terkait:
sumber
Kesalahan parse: kesalahan sintaksis, T_PAAMAYIM_NEKUDOTAYIM yang tidak terduga
Operator resolusi ruang lingkup juga disebut "Paamayim Nekudotayim" dari bahasa Ibrani פעמיים נקודתיים. yang berarti "usus besar ganda".
Kesalahan ini biasanya terjadi jika Anda secara tidak sengaja memasukkan
::
kode Anda.Pertanyaan-pertanyaan Terkait:
Dokumentasi:
sumber
a()::b;
atau$a=::;
.Perhatian: Penggunaan XXX yang tidak didefinisikan konstan - diasumsikan 'XXX'
atau, dalam PHP 7.2 atau lebih baru:
Peringatan: Penggunaan XXX konstan yang tidak didefinisikan - dianggap 'XXX' (ini akan menimbulkan Kesalahan dalam versi PHP yang akan datang)
Pemberitahuan ini terjadi ketika token digunakan dalam kode dan tampaknya berupa konstanta, tetapi konstanta dengan nama itu tidak didefinisikan.
Salah satu penyebab paling umum dari pemberitahuan ini adalah kegagalan untuk mengutip string yang digunakan sebagai kunci array asosiatif.
Sebagai contoh:
Penyebab umum lainnya adalah tanda
$
(dolar) yang hilang di depan nama variabel:Atau mungkin Anda salah mengeja konstanta atau kata kunci lainnya:
Itu juga bisa menjadi tanda bahwa ekstensi PHP yang dibutuhkan atau pustaka hilang ketika Anda mencoba mengakses konstanta yang didefinisikan oleh pustaka itu.
Pertanyaan-pertanyaan Terkait:
sumber
Kesalahan fatal: Tidak dapat mendeklarasikan ulang kelas [nama kelas]
Kesalahan fatal: Tidak dapat mendeklarasikan ulang [nama fungsi]
Ini berarti Anda menggunakan fungsi / nama kelas yang sama dua kali dan perlu mengganti nama salah satunya, atau itu karena Anda telah menggunakan
require
atau diinclude
mana Anda seharusnya menggunakanrequire_once
atauinclude_once
.Ketika suatu kelas atau suatu fungsi dideklarasikan dalam PHP, ia tidak dapat diubah, dan nantinya tidak dapat dideklarasikan dengan nilai baru.
Pertimbangkan kode berikut:
class.php
index.php
Panggilan kedua ke
do_stuff()
akan menghasilkan kesalahan di atas. Dengan mengubahrequire
kerequire_once
, kita dapat memastikan bahwa file yang berisi definisiMyClass
hanya akan dimuat sekali, dan kesalahannya akan dihindari.sumber
Perhatikan: Variabel tidak terdefinisi
Terjadi ketika Anda mencoba menggunakan variabel yang tidak ditentukan sebelumnya.
Contoh khasnya adalah
Jika Anda tidak mendefinisikan
$counter
sebelumnya, kode di atas akan memicu pemberitahuan.Cara yang benar adalah dengan mengatur variabel sebelum menggunakannya, bahkan jika itu hanya string kosong seperti
Perhatikan: Properti tidak terdefinisi
Kesalahan ini berarti banyak hal yang sama, tetapi mengacu pada properti suatu objek. Menggunakan kembali contoh di atas, kode ini akan memicu kesalahan karena
counter
properti belum disetel.Pertanyaan-pertanyaan Terkait:
sumber
Kesalahan Parse: kesalahan sintaksis, T_VARIABLE yang tidak terduga
Skenario yang memungkinkan
Sepertinya saya tidak dapat menemukan kesalahan kode saya. Ini kesalahan saya:
Apa yang saya coba
Menjawab
Parse error: Masalah dengan sintaks program Anda, seperti membiarkan tanda titik koma di akhir pernyataan atau, seperti halnya kasus di atas, melewatkan
.
operator. Penerjemah berhenti menjalankan program Anda ketika menemukan kesalahan parse.Dengan kata sederhana ini adalah kesalahan sintaksis, yang berarti ada sesuatu dalam kode Anda yang menghentikannya diurai dengan benar dan karenanya berjalan.
Apa yang harus Anda lakukan adalah memeriksa dengan hati-hati di garis-garis di mana kesalahan tersebut adalah untuk kesalahan sederhana.
Pesan kesalahan itu berarti bahwa dalam baris x file, penerjemah PHP mengharapkan untuk melihat tanda kurung terbuka tetapi sebaliknya, ia menemukan sesuatu yang disebut
T_VARIABLE
. Benda ituT_VARIABLE
disebut atoken
. Ini adalah cara penerjemah PHP untuk mengekspresikan berbagai bagian mendasar dari program. Ketika penerjemah membaca dalam suatu program, penerjemah menerjemahkan apa yang telah Anda tulis ke dalam daftar token. Di mana pun Anda meletakkan variabel dalam program Anda, adaT_VARIABLE
token dalam daftar juru bahasa.Bacaan yang bagus: Daftar Toker Parser
Jadi, pastikan Anda mengaktifkan setidaknya
E_PARSE
diphp.ini
. Kesalahan Parse seharusnya tidak ada dalam skrip produksi.Saya selalu merekomendasikan untuk menambahkan pernyataan berikut, saat coding:
Pelaporan kesalahan PHP
Juga, ide bagus untuk menggunakan IDE yang akan memberi tahu Anda kesalahan parse saat mengetik. Kamu bisa menggunakan:
Pertanyaan-pertanyaan Terkait:
sumber
Perhatikan: Offset string yang tidak diinisialisasi:
*
Seperti namanya, jenis kesalahan seperti itu terjadi, ketika Anda kemungkinan besar mencoba untuk beralih atau menemukan nilai dari array dengan kunci yang tidak ada.
Anggap Anda, berusaha menunjukkan setiap surat dari
$string
Contoh di atas akan menghasilkan ( demo online ):
Dan, begitu skrip selesai bergema
D
Anda akan mendapatkan kesalahan, karena di dalamfor()
loop, Anda telah memberitahu PHP untuk menunjukkan kepada Anda dari karakter string pertama hingga kelima dari'ABCD'
Yang, ada, tetapi karena loop mulai menghitung dari0
dan gemaD
pada saat mencapai4
, itu akan melempar kesalahan offset.Kesalahan serupa:
sumber
Perhatikan: Mencoba mendapatkan properti dari kesalahan non-objek
Terjadi ketika Anda mencoba mengakses properti objek sementara tidak ada objek.
Contoh khas untuk pemberitahuan non-objek adalah
Dalam hal ini,
$users
adalah array (jadi bukan objek) dan tidak memiliki properti.Ini mirip dengan mengakses indeks atau kunci array yang tidak ada (lihat Pemberitahuan: Indeks Tidak Terdefinisi ).
Contoh ini sangat disederhanakan. Paling sering pemberitahuan semacam itu menandakan nilai balik yang tidak dicentang, misalnya ketika perpustakaan kembali
NULL
jika suatu objek tidak ada atau hanya nilai non-objek yang tidak terduga (misalnya dalam hasil Xpath, struktur JSON dengan format yang tidak terduga, XML dengan format yang tidak terduga, dll.) tetapi kode tidak memeriksa kondisi seperti itu.Karena non-objek tersebut sering diproses lebih lanjut, seringkali kesalahan fatal terjadi selanjutnya saat memanggil metode objek pada non-objek (lihat: Kesalahan fatal: Memanggil ke fungsi anggota ... pada non-objek ) menghentikan naskah.
Itu dapat dengan mudah dicegah dengan memeriksa kondisi kesalahan dan / atau suatu variabel sesuai dengan harapan. Berikut ini pemberitahuan dengan contoh DOMXPath :
Masalahnya adalah mengakses
nodeValue
properti (bidang) dari item pertama sementara itu belum diperiksa apakah ada atau tidak dalam$result
koleksi. Alih-alih membayar untuk membuat kode lebih eksplisit dengan menetapkan variabel ke objek kode beroperasi:Kesalahan terkait:
sumber
json_decode
sekarang mengembalikan instancestdclass
secara default, jadi kode contoh akan benar - benar berfungsi.json_decode
sekarang mengembalikan instancestdclass
secara default" ? Saya tidak dapat menemukannya di changelog.assoc
parameter ini disetel ke false. Parameter ini memutuskan apakah fungsi mengembalikanstdclass
bukan array asosiatif.json_decode('[{"name": "hakre"}]', true)
akan mengembalikan array, jika tidakstdclass
objekPeringatan: pembatasan open_basedir berlaku
Peringatan ini dapat muncul dengan berbagai fungsi yang terkait dengan akses file dan direktori. Ini memperingatkan tentang masalah konfigurasi.
Ketika itu muncul, itu berarti bahwa akses telah dilarang untuk beberapa file.
Peringatan itu sendiri tidak merusak apa pun, tetapi paling sering skrip tidak berfungsi dengan baik jika akses file dicegah.
Perbaikan biasanya untuk mengubah konfigurasi PHP , pengaturan terkait disebut
open_basedir
.Terkadang nama file atau direktori yang salah digunakan, maka perbaikannya adalah menggunakan yang benar.
Pertanyaan-pertanyaan Terkait:
sumber
Parse error: syntax error, tak terduga '['
Kesalahan ini muncul dalam dua varian:
Variasi 1
Sintaks initializer array ini hanya diperkenalkan di PHP 5.4; itu akan meningkatkan kesalahan parser pada versi sebelum itu. Jika memungkinkan, tingkatkan instalasi Anda atau gunakan sintaks lama:
Lihat juga contoh ini dari manual.
Variasi 2
Hasil fungsi array dereferencing juga diperkenalkan di PHP 5.4. Jika tidak memungkinkan untuk ditingkatkan, Anda perlu menggunakan variabel (sementara):
Lihat juga contoh ini dari manual.
sumber
Peringatan: [fungsi] mengharapkan parameter 1 menjadi sumber daya, diberikan boolean
(Variasi yang lebih umum dari Peringatan: mysql_fetch_array () mengharapkan parameter 1 menjadi sumber daya, boolean diberikan )
Sumber daya adalah tipe dalam PHP (seperti string, integer atau objek). Sumber daya adalah gumpalan buram tanpa nilai yang berarti secara inheren sendiri. Sumber daya khusus untuk dan ditentukan oleh serangkaian fungsi atau ekstensi PHP tertentu. Misalnya, ekstensi Mysql mendefinisikan dua jenis sumber daya :
Ekstensi CURL menentukan dua jenis sumber daya lainnya :
Saat
var_dump
diedit, nilainya terlihat seperti ini:Itu semua sumber daya adalah, pengidentifikasi numerik (
(1)
) dari jenis tertentu ((curl)
).Anda membawa sumber daya ini berkeliling dan meneruskannya ke fungsi yang berbeda di mana sumber daya semacam itu berarti sesuatu. Biasanya fungsi-fungsi ini mengalokasikan data tertentu di latar belakang dan sumber daya hanyalah referensi yang mereka gunakan untuk melacak data ini secara internal.
Kesalahan " ... mengharapkan parameter 1 menjadi sumber daya, diberikan boolean " biasanya merupakan hasil dari operasi yang tidak dicentang yang seharusnya membuat sumber daya, tetapi dikembalikan
false
sebagai gantinya. Misalnya,fopen
fungsi memiliki deskripsi ini:Jadi dalam kode ini,
$fp
baik akan menjadiresource(x) of type (stream)
ataufalse
:Jika Anda tidak memeriksa apakah
fopen
operasi berhasil atau gagal dan karenanya apakah$fp
sumber daya yang valid ataufalse
dan beralih$fp
ke fungsi lain yang mengharapkan sumber daya, Anda mungkin mendapatkan kesalahan di atas:Anda selalu perlu memeriksa kesalahan nilai pengembalian fungsi yang mencoba mengalokasikan sumber daya dan mungkin gagal :
Kesalahan Terkait:
sumber
Peringatan: Offset string ilegal 'XXX'
Ini terjadi ketika Anda mencoba mengakses elemen array dengan sintaks braket persegi, tetapi Anda melakukan ini pada string, dan bukan pada array, sehingga operasi jelas tidak masuk akal .
Contoh:
Jika Anda berpikir variabel tersebut harus berupa array, lihat dari mana asalnya dan perbaiki masalah di sana.
sumber
Kode tidak berjalan / apa yang tampak seperti bagian dari kode PHP saya adalah output
Jika Anda tidak melihat hasil dari kode PHP Anda apa pun dan / atau Anda melihat bagian dari output kode sumber PHP Anda secara harfiah di halaman web, Anda dapat yakin bahwa PHP Anda tidak benar-benar dieksekusi. Jika Anda menggunakan View Source di browser Anda, Anda mungkin melihat seluruh file kode sumber PHP apa adanya. Karena kode PHP tertanam di dalamnya
<?php ?>
tag, browser akan mencoba menafsirkannya sebagai tag HTML dan hasilnya mungkin terlihat agak membingungkan.Untuk benar-benar menjalankan skrip PHP Anda, Anda perlu:
* Kecuali Anda mengkonfigurasi ulang, semuanya dapat dikonfigurasi.
Yang terakhir ini sangat penting. Mengklik dua kali file tersebut kemungkinan akan membukanya di browser Anda menggunakan alamat seperti:
Ini sepenuhnya mem-bypass server web apa pun yang mungkin Anda jalankan dan file tidak ditafsirkan. Anda perlu mengunjungi URL file di server web Anda, kemungkinan seperti:
Anda mungkin juga ingin memeriksa apakah Anda menggunakan tag terbuka pendek
<?
alih-alih<?php
dan konfigurasi PHP Anda telah menonaktifkan tag terbuka pendek.Juga lihat kode PHP tidak dieksekusi, alih-alih kode muncul di halaman
sumber
Peringatan: mysql_connect (): Akses ditolak untuk 'nama' @ host 'pengguna
Peringatan ini muncul ketika Anda terhubung ke server MySQL / MariaDB dengan kredensial tidak valid atau hilang (nama pengguna / kata sandi). Jadi ini biasanya bukan masalah kode, tetapi masalah konfigurasi server.
Lihat halaman manual
mysql_connect("localhost", "user", "pw")
untuk contoh.Pastikan Anda benar-benar menggunakan a
$username
dan$password
.(using password: NO)
.Hanya server uji lokal yang biasanya memungkinkan untuk terhubung dengan nama pengguna
root
, tanpa kata sandi, dantest
nama database.Anda dapat menguji apakah mereka benar - benar benar menggunakan klien baris perintah:
mysql --user="username" --password="password" testdb
Nama pengguna dan kata sandi peka huruf besar-kecil dan spasi putih tidak diabaikan. Jika kata sandi Anda mengandung karakter-karakter meta seperti
$
, lepas, atau tulis kata sandi dalam satu tanda kutip .Sebagian besar penyedia hosting yang dibagi membagikan akun mysql terkait dengan akun pengguna unix (kadang-kadang hanya awalan atau sufiks angka tambahan). Lihat dokumen untuk pola atau dokumentasi, dan CPanel atau antarmuka apa pun untuk mengatur kata sandi.
Lihat manual MySQL tentang Menambahkan akun pengguna menggunakan baris perintah. Saat terhubung sebagai pengguna admin Anda dapat mengeluarkan pertanyaan seperti:
CREATE USER 'username'@'localhost' IDENTIFIED BY 'newpassword';
Atau gunakan Adminer atau WorkBench atau alat grafis lainnya untuk membuat, memeriksa, atau memperbaiki detail akun.
Jika Anda tidak dapat memperbaiki kredensial Anda, maka meminta internet untuk "tolong bantu" tidak akan berpengaruh. Hanya Anda dan penyedia hosting Anda yang memiliki izin dan akses yang memadai untuk mendiagnosis dan memperbaiki berbagai hal.
Verifikasi bahwa Anda dapat mencapai server database, menggunakan nama host yang diberikan oleh penyedia Anda:
ping dbserver.hoster.example.net
Periksa ini dari konsol SSH langsung di server web Anda. Pengujian dari klien pengembangan lokal Anda ke server hosting bersama Anda jarang bermakna.
Seringkali Anda hanya menginginkan nama server
"localhost"
, yang biasanya menggunakan soket bernama lokal saat tersedia. Lain kali Anda dapat mencoba"127.0.0.1"
sebagai mundur.Jika server MySQL / MariaDB Anda mendengarkan pada port yang berbeda, maka gunakan
"servername:3306"
.Jika gagal, mungkin ada masalah firewall. (Di luar topik, bukan pertanyaan pemrograman. Tidak mungkin menebak-nebak.)
Saat menggunakan konstanta seperti eg
DB_USER
atauDB_PASSWORD
, periksa apakah konstanta itu didefinisikan .Jika Anda mendapat
"Warning: Access defined for 'DB_USER'@'host'"
dan"Notice: use of undefined constant 'DB_PASS'"
, maka itu masalah Anda.Pastikan bahwa eg Anda
xy/db-config.php
benar-benar disertakan dan lupakan.Periksa untuk mengatur
GRANT
izin dengan benar .Tidak cukup untuk memiliki pasangan
username
+password
.Setiap akun MySQL / MariaDB dapat memiliki satu set izin yang terlampir.
Itu bisa membatasi basis data mana Anda diizinkan untuk terhubung, dari mana klien / server asal koneksi, dan dari mana pertanyaan diizinkan.
Peringatan "Akses ditolak" mungkin juga muncul untuk
mysql_query
panggilan, jika Anda tidak memiliki izinSELECT
dari tabel tertentu, atauINSERT
/UPDATE
, dan lebih umumDELETE
apa saja.Anda dapat menyesuaikan izin akun ketika terhubung per klien baris perintah menggunakan akun admin dengan kueri seperti:
GRANT ALL ON yourdb.* TO 'username'@'localhost';
Jika peringatan muncul pertama kali dengan
Warning: mysql_query(): Access denied for user ''@'localhost'
maka Anda mungkin memiliki pasangan akun / kata sandi yang dikonfigurasi sebelumnya .Periksa itu
mysql.default_user=
danmysql.default_password=
miliki nilai yang berarti.Seringkali ini adalah konfigurasi penyedia. Jadi, hubungi dukungan mereka untuk ketidakcocokan.
Temukan dokumentasi penyedia hosting bersama Anda:
misalnya HostGator , GoDaddy , 1and1 , DigitalOcean , BlueHost , Dreamhost , MediaTemple , Ixwebhosting , lunarhosting , atau hanya google yours'.
Lain berkonsultasi dengan penyedia webhosting Anda melalui saluran dukungan mereka.
Perhatikan bahwa Anda juga telah menghabiskan kumpulan koneksi yang tersedia . Anda akan mendapatkan akses peringatan yang ditolak karena terlalu banyak koneksi bersamaan. (Anda harus menyelidiki pengaturan. Itu masalah konfigurasi server di luar topik, bukan pertanyaan pemrograman.)
Versi klien libmysql Anda mungkin tidak kompatibel dengan server database. Biasanya server MySQL dan MariaDB dapat dijangkau dengan PHP yang dikompilasi dalam driver. Jika Anda memiliki pengaturan khusus, atau versi PHP yang ketinggalan zaman, dan server basis data yang jauh lebih baru, atau yang sudah usang - maka versi ketidakcocokan dapat mencegah koneksi. (Tidak, Anda harus menyelidiki sendiri. Tidak ada yang bisa menebak pengaturan Anda).
Lebih banyak referensi:
sumber
Perhatian: Array to string conversion
Ini hanya terjadi jika Anda mencoba memperlakukan array sebagai string:
Array tidak bisa begitu saja
echo
atau digabungkan dengan string, karena hasilnya tidak didefinisikan dengan baik. PHP akan menggunakan string "Array" sebagai ganti array, dan memicu pemberitahuan untuk menunjukkan bahwa itu mungkin bukan yang dimaksudkan dan bahwa Anda harus memeriksa kode Anda di sini. Anda mungkin menginginkan sesuatu seperti ini sebagai gantinya:Atau lingkaran array:
Jika pemberitahuan ini muncul di suatu tempat yang tidak Anda harapkan, itu berarti variabel yang Anda pikir adalah string sebenarnya adalah sebuah array. Itu berarti Anda memiliki bug dalam kode Anda yang membuat variabel ini menjadi array, bukan string yang Anda harapkan.
sumber
Peringatan: Pembagian dengan nol
Pesan peringatan 'Division by zero' adalah salah satu pertanyaan paling umum di antara para pengembang PHP baru. Kesalahan ini tidak akan menyebabkan pengecualian, oleh karena itu, beberapa pengembang kadang-kadang akan menekan peringatan dengan menambahkan operator penekan kesalahan @ sebelum ekspresi. Sebagai contoh:
Tapi, seperti halnya peringatan, pendekatan terbaik adalah melacak penyebab peringatan dan mengatasinya. Penyebab peringatan akan datang dari setiap contoh di mana Anda mencoba untuk membagi dengan 0, variabel sama dengan 0, atau variabel yang belum ditetapkan (karena NULL == 0) karena hasilnya akan 'tidak terdefinisi'.
Untuk memperbaiki peringatan ini, Anda harus menulis ulang ekspresi Anda untuk memeriksa bahwa nilainya bukan 0, jika ya, lakukan sesuatu yang lain. Jika nilainya nol Anda tidak boleh membaginya, atau Anda harus mengubah nilainya menjadi 1 dan kemudian membaginya sehingga hasil pembagiannya setara dengan hanya dibagi oleh variabel tambahan.
Pertanyaan-pertanyaan Terkait:
sumber
$var1
== 0 maka Anda dapat mengatur$var3
ke$var2
. Bahkan jika tidak melakukan itu, yang lain tidak diperlukan sama sekali karena tugasnya sama dalam kedua kasus, jadi tidak ada yang lain dan tugaskan di luarif
Standar Ketat: Metode non-statis [<class> :: <method>] tidak boleh dipanggil secara statis
Terjadi ketika Anda mencoba memanggil metode non-statis di kelas karena itu statis, dan Anda juga memiliki
E_STRICT
bendera dierror_reporting()
pengaturan .Contoh:
HTML::br()
atau$html::br()
Anda benar-benar dapat menghindari kesalahan ini dengan tidak menambahkan
E_STRICT
untukerror_reporting()
, misalnyakarena untuk PHP 5.4.0 dan di atasnya,
E_STRICT
termasuk dalamE_ALL
[ ref ]. Tapi itu tidak disarankan. Solusinya adalah mendefinisikan fungsi statis yang Anda inginkan sebagai aktualstatic
:atau hubungi fungsi secara konvensional:
Pertanyaan-pertanyaan Terkait :
sumber
Tidak digunakan lagi: Sintaks akses array dan string offset dengan kurung kurawal sudah ditinggalkan
Offset string dan elemen array dapat diakses oleh kurung kurawal
{}
sebelum PHP 7.4.0:Ini telah ditinggalkan sejak PHP 7.4.0 dan menghasilkan peringatan:
Anda harus menggunakan tanda kurung siku
[]
untuk mengakses offset string dan elemen array:The RFC untuk perubahan ini link ke sebuah PHP Script yang upaya untuk memperbaiki ini secara mekanis.
sumber