Referensi - Apa artinya kesalahan ini dalam PHP?


1137

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

Juga, lihat:


7
Juga, untuk mengeluarkan diskusi dari komentar, silakan buka pertanyaan meta ini
Earlz



Jawaban:


275

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_WARNINGdan tidak akan menghentikan skrip.

Contoh tipikal adalah file templat seperti ini:

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

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 memindahkan session_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 <?phpmemiliki 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:


2
Jika Anda menggunakan WordPress, periksa file tema. Ketika saya memutakhirkan situs ke versi baru WordPress, saya tidak dapat memperbarui tema karena belum diperbarui dalam beberapa tahun. Masalah ini terpotong. Ternyata file functions.php memiliki lebih dari satu <? ?> blok dengan spasi di antaranya.
Roy Leban

2
@RoyLeban "Jika file Anda memiliki lebih dari satu blok di dalamnya ..." Saya tidak yakin apa artinya ini. Apa itu "blok"? Apakah satu blok terdiri dari <?php ?>dan "lebih dari satu blok" akan terbentuk <?php ?> <?php ?>?
Andrew Fox

2
Silakan aktifkan fitur 'output buffering' dalam file konfigurasi PHP.ini jika memungkinkan. Ini digunakan untuk menyimpan masalah ini. Ia mengirimkan file html disimpan dalam buffer output dan dikirim ke klien hanya setelah skrip berhenti, jadi jika dua tajuk dikeluarkan di lokasi yang berbeda maka tajuk lama akan diganti tajuk baru.
Nidhin David

191

Kesalahan fatal: Memanggil ke fungsi anggota ... pada benda yang bukan objek

Terjadi dengan kode yang mirip dengan di xyz->method()mana xyzbukan objek dan karena itu methodtidak 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

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

Dalam contoh di atas, query tidak dapat disiapkan dan prepare()akan menetapkan falseuntuk $statement. Mencoba memanggil execute()metode maka akan menghasilkan Kesalahan Fatal karena falsemerupakan "non-objek" karena nilainya boolean.

Cari tahu mengapa fungsi Anda mengembalikan boolean, bukan objek. Misalnya, periksa $pdoobjek 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 ->preparegagal maka objek $pdodatabase 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

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

Dengan mencoba mengeksekusi metode di luar blok bersyarat, objek Anda mungkin tidak didefinisikan.

Pertanyaan-pertanyaan Terkait:


115

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

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

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 mengatur display_startup_errorsdirektif ke true. Lakukan ini di dalam php.iniatau di dalam .htaccessatau 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:


3
error_reporting(~0);mengapa tidak -1? Itulah yang ~0dievaluasi, dan jauh lebih samar.
Fabrício Matté

3
Saya pikir keduanya sama-sama samar. ~0lebih 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 biner 1111'1111'1111'1111(untuk 32 bit).
nalply

2
Ups, 1111'1111'1111'1111benar-benar 16 bit, tapi saya harap Anda mengerti apa yang saya maksud.
nalply

3
@IvanSolntsev, maaf tidak, untuk versi sebelum 5.4, E_STRICTtidak termasuk dalam E_ALL. php.net/manual/en/errorfunc.constants.php dan gulir ke bawah ke E_STRICT.
nalply

102

Pemberitahuan: Indeks Tidak Terdefinisi

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

Contoh khas Undefined Indexpemberitahuan adalah ( demo )

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

Keduanya spinachdan 1tidak ada dalam array, menyebabkan E_NOTICEdipicu.

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_existsatau menggunakan isset:

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

Jika Anda memiliki kode seperti:

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

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:

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

Pertanyaan-pertanyaan Terkait:


Saya cenderung menggunakanif(!empty($_POST['message'])){ //do stuff }
kurdtpage

85

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

Pertama dan terutama:

Tolong, jangan gunakan mysql_*fungsi dalam kode baru . Mereka tidak lagi dipertahankan dan secara resmi ditinggalkan . Lihat kotak merah ? Pelajari tentang pernyataan yang disiapkan , dan gunakan PDO atau MySQLi - artikel ini akan membantu Anda memutuskan yang mana. Jika Anda memilih PDO, berikut adalah tutorial yang bagus .


Ini terjadi ketika Anda mencoba mengambil data dari hasil mysql_querytetapi kueri gagal.

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

Anda perlu memeriksa hasilnya dikembalikan mysql_queryoleh

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

Pertanyaan-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.


5
Hanya sebuah catatan. Jika mysql_querytidak cukup buruk, menambahkan or diedi atasnya menambah penghinaan pada cedera.
Hantu Madara

Masalah yang saya temui adalah $res = mysql_query($query)mengembalikan 1 jika kueri berhasil sehingga dianggap benar. Oleh karena itu ketika memberikan hasil mysql_query untuk mysql_fetch_array() pemberitahuan menunjukkan.
mboy

@ mboy Untuk SELECT, SHOW, DESCRIBE, EXPLAIN, dan pernyataan lain yang mengembalikan resultset, mysql_query () mengembalikan sumber daya jika berhasil, atau SALAH pada kesalahan. Untuk jenis pernyataan SQL lainnya, INSERT, UPDATE, DELETE, DROP, dll, mysql_query () mengembalikan TRUE jika berhasil atau SALAH pada kesalahan.
xdazz

@xdazz Itulah masalah yang saya hadapi, masukkan pembaruan mengembalikan BENAR sehingga saya tidak dapat menyingkirkan kesalahan ini, 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?
mboy

2
@ mboy 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).
xdazz

79

Kesalahan fatal: Menggunakan $ this saat tidak dalam konteks objek

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

Kesalahan ini dapat terjadi:

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

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

    Cara memperbaiki: tinjau kembali kode Anda,$thishanya dapat digunakan dalam konteks objek, dan jangan pernah digunakan dalam metode statis. Juga, metode statis tidak boleh mengakses properti non-statis. Gunakanself::$static_propertyuntuk mengakses properti statis.

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

Pertanyaan-pertanyaan Terkait:

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

2
Anda mungkin juga ingin menyebutkan bagaimana ini bekerja dengan penutupan (bahkan dalam metode non-statis) dan bagaimana "diperbaiki" dalam 5.4.
Kendall Hopkins

2
@ HAKRE Saya sedang berbicara tentang panggilan statis di dalam Penutupan. Seperti $closure = function() { self::method(); }.
Kendall Hopkins

2
@KendallHopkins: Itu adalah kesalahan yang berbeda: "Kesalahan fatal: Tidak dapat mengakses diri :: ketika tidak ada ruang kelas aktif" Namun dengan $thisAnda dapat memicu "kesalahan fatal: Menggunakan $ ini saat ini tidak dalam konteks objek" :$closure = function() { $this->method(); };
hakre

75

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

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

Dalam hal ini, fn()tidak akan pernah dinyatakan karena $someConditionitu tidak benar.

Contoh 2 - Fungsi dalam Deklarasi Fungsi

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

Dalam hal ini, fnhanya akan dinyatakan setelah createFn()dipanggil. Perhatikan bahwa panggilan selanjutnya ke createFn()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. aptDalam Debian atau Ubuntu, yumdalam 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:


73

Kesalahan parse: kesalahan sintaksis, T_XXX yang tidak terduga

Terjadi ketika Anda memiliki T_XXXtoken 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:


70

Kesalahan fatal: Tidak dapat menggunakan nilai pengembalian fungsi dalam konteks tulis

Ini biasanya terjadi ketika menggunakan fungsi langsung dengan empty.

Contoh:

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

Ini karena emptymerupakan konstruksi bahasa dan bukan fungsi, tidak dapat dipanggil dengan ekspresi sebagai argumennya dalam versi PHP sebelum 5.5. Sebelum PHP 5.5, argumen empty()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 (seperti is_null(null)dalam contoh) akan selalu dianggap ada, jadi di sini emptyhanya memeriksa apakah itu sama dengan false. Anda dapat mengganti di empty()sini dengan !, misalnya if (!is_null(null)), atau secara eksplisit membandingkan ke false, misalnya if (is_null(null) == false).

Pertanyaan-pertanyaan Terkait:


64

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"):

$query = "UPDATE `posts` SET my_text='{$_POST['text']}' WHERE id={$_GET['id']}";
mysqli_query($db, $query);

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? $queryakan berakhir dengan:

$query = "UPDATE `posts` SET my_text='I'm a PHP newbie' WHERE id=10';

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:


3
Selain itu, jika Anda tidak situs Anda akan diretas oleh bot secara otomatis
apscience

2
@gladoscc Klik "edit" dan ubah jawabannya. Saya sadar itu bisa diperbaiki.
Jocelyn

2
Atau gunakan kueri sql yang sudah disiapkan.
Matej

53

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.inifile atau dengan menggunakan ini_set('memory_limit', '128 M');dalam skrip (yang akan menimpa nilai yang ditentukan dalam php.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_usageFungsi adalah teman Anda.

Pertanyaan-pertanyaan Terkait:


53

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:

echo "This is a double-quoted string with a quoted array key in $array['key']";
//---------------------------------------------------------------------^^^^^

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:

echo "This is a double-quoted string with an un-quoted array key in $array[key]";
//------------------------------------------------------------------------^^^^^

Seluruh variabel dan kunci array kompleks dapat dilampirkan {}, dalam hal ini mereka harus dikutip untuk menghindari E_NOTICE. Dokumentasi PHP merekomendasikan sintaks ini untuk variabel kompleks.

echo "This is a double-quoted string with a quoted array key in {$array['key']}";
//--------------------------------------------------------------^^^^^^^^^^^^^^^
// Or a complex array property of an object:
echo "This is a a double-quoted string with a complex {$object->property->array['key']}";

Tentu saja, alternatif untuk salah satu di atas adalah menyatukan variabel array bukan menginterpolasinya:

echo "This is a double-quoted string with an array variable". $array['key'] . " concatenated inside.";
//----------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^

Untuk referensi, lihat bagian tentang Parsing Variabel di halaman manual PHP Strings


45

Peringatan: [fungsi] : gagal membuka aliran: [alasan]

Itu terjadi ketika Anda memanggil file biasanya dengan include,require atau fopendan PHP tidak dapat menemukan file atau tidak memiliki cukup izin untuk memuat file.

Ini dapat terjadi karena berbagai alasan:

  • jalur file salah
  • path file relatif
  • termasuk jalan yang salah
  • izin terlalu ketat
  • SELinux berlaku
  • dan masih banyak lagi ...

Satu kesalahan umum adalah tidak menggunakan jalur absolut. Ini dapat dengan mudah diselesaikan dengan menggunakan jalur penuh atau konstanta ajaib seperti __DIR__atau dirname(__FILE__):

include __DIR__ . '/inc/globals.inc.php';

atau:

require dirname(__FILE__) . '/inc/globals.inc.php';

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:


44

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:


Cara termudah untuk memicu kesalahan ini adalah menjalankan a()::b;atau $a=::;.
Ismael Miguel

43

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:

// Wrong
echo $array[key];

// Right
echo $array['key'];

Penyebab umum lainnya adalah tanda $(dolar) yang hilang di depan nama variabel:

// Wrong
echo varName;

// Right
echo $varName;

Atau mungkin Anda salah mengeja konstanta atau kata kunci lainnya:

// Wrong
$foo = fasle;

// Right
$foo = false;

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:


2
Saya akan mengatakan penyebab paling umum adalah melupakan $ di depan variabel, bukan array.
Overv

42

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 requireatau di includemana Anda seharusnya menggunakan require_onceatau include_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

<?php

class MyClass
{
    public function doSomething()
    {
        // do stuff here
    }
}

index.php

<?php

function do_stuff()
{
   require 'class.php';
   $obj = new MyClass;
   $obj->doSomething();
}

do_stuff();
do_stuff();

Panggilan kedua ke do_stuff()akan menghasilkan kesalahan di atas. Dengan mengubah requireke require_once, kita dapat memastikan bahwa file yang berisi definisi MyClasshanya akan dimuat sekali, dan kesalahannya akan dihindari.


3
Apakah perlu disebutkan menggunakan autoloading, dan standar seperti PSR-4 atau bahkan PSR-0 yang sekarang sudah tidak digunakan lagi sudah cukup dengan menyelamatkan Anda dari keharusan menggunakan butuhkan / sertakan diri Anda sendiri (batalkan beberapa kasus tepi yang aneh).
DanielM

39

Perhatikan: Variabel tidak terdefinisi

Terjadi ketika Anda mencoba menggunakan variabel yang tidak ditentukan sebelumnya.

Contoh khasnya adalah

foreach ($items as $item) {
    // do something with item
    $counter++;
}

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

$counter = 0;
foreach ($items as $item) {
    // do something with item
    $counter++;
}

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 counterproperti belum disetel.

$obj = new stdclass;
$obj->property = 2342;
foreach ($items as $item) {
    // do something with item
    $obj->counter++;
}

Pertanyaan-pertanyaan Terkait:


35

Kesalahan Parse: kesalahan sintaksis, T_VARIABLE yang tidak terduga

Skenario yang memungkinkan

Sepertinya saya tidak dapat menemukan kesalahan kode saya. Ini kesalahan saya:

Kesalahan Parse: kesalahan sintaks, T_VARIABLE yang tidak terduga pada baris x

Apa yang saya coba

$sql = 'SELECT * FROM dealer WHERE id="'$id.'"';

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 itu T_VARIABLEdisebut a token. 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, ada T_VARIABLEtoken dalam daftar juru bahasa.

Bacaan yang bagus: Daftar Toker Parser

Jadi, pastikan Anda mengaktifkan setidaknya E_PARSEdi php.ini. Kesalahan Parse seharusnya tidak ada dalam skrip produksi.

Saya selalu merekomendasikan untuk menambahkan pernyataan berikut, saat coding:

error_reporting(E_ALL);

Pelaporan kesalahan PHP

Juga, ide bagus untuk menggunakan IDE yang akan memberi tahu Anda kesalahan parse saat mengetik. Kamu bisa menggunakan:

  1. NetBeans (bagian kecantikan, perangkat lunak bebas) yang bagus (menurut saya terbaik)
  2. PhpStorm (paman Gordon suka ini: P, paket berbayar, berisi perangkat lunak berpemilik dan gratis)
  3. Eclipse (perangkat lunak bebas dan cantik)

Pertanyaan-pertanyaan Terkait:


34

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

$string = 'ABCD'; 
for ($i=0, $len = strlen($string); $i <= $len; $i++){
    echo "$string[$i] \n"; 
}

Contoh di atas akan menghasilkan ( demo online ):

A
B
C
D
Notice: Uninitialized string offset: 4 in XXX on line X

Dan, begitu skrip selesai bergema DAnda akan mendapatkan kesalahan, karena di dalam for()loop, Anda telah memberitahu PHP untuk menunjukkan kepada Anda dari karakter string pertama hingga kelima dari 'ABCD'Yang, ada, tetapi karena loop mulai menghitung dari 0dan gema Dpada saat mencapai 4, itu akan melempar kesalahan offset.

Kesalahan serupa:


32

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

$users = json_decode('[{"name": "hakre"}]');
echo $users->name; # Notice: Trying to get property of non-object

Dalam hal ini, $usersadalah 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 kembaliNULL 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 :

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$divText = $result->item(0)->nodeValue; # Notice: Trying to get property of non-object

Masalahnya adalah mengakses nodeValueproperti (bidang) dari item pertama sementara itu belum diperiksa apakah ada atau tidak dalam $resultkoleksi. Alih-alih membayar untuk membuat kode lebih eksplisit dengan menetapkan variabel ke objek kode beroperasi:

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$div     = $result->item(0);
$divText = "-/-";
if (is_object($div)) {
    $divText = $div->nodeValue;
}
echo $divText;

Kesalahan terkait:


1
json_decodesekarang mengembalikan instance stdclasssecara default, jadi kode contoh akan benar - benar berfungsi.
Hugo Zink

@HugoZink: Sebenarnya (dan memang selalu) mengembalikan array untuk contoh itu: 3v4l.org/SUDe0 - Dapatkah Anda memberikan referensi untuk tulisan Anda bahwa " json_decodesekarang mengembalikan instance stdclasssecara default" ? Saya tidak dapat menemukannya di changelog.
hakre

Menurut halaman manual PHP pada json_decode , secara default, assocparameter ini disetel ke false. Parameter ini memutuskan apakah fungsi mengembalikan stdclassbukan array asosiatif.
Hugo Zink

json_decode('[{"name": "hakre"}]', true)akan mengembalikan array, jika tidak stdclassobjek
zanderwar

29

Peringatan: 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 disebutopen_basedir .

Terkadang nama file atau direktori yang salah digunakan, maka perbaikannya adalah menggunakan yang benar.

Pertanyaan-pertanyaan Terkait:


1
Ini paling sering terjadi pada host bersama, orang-orang biasanya tidak mengunci diri mereka sendiri dari direktori :-)
ya

28

Parse error: syntax error, tak terduga '['

Kesalahan ini muncul dalam dua varian:

Variasi 1

$arr = [1, 2, 3];

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:

$arr = array(1, 2, 3);

Lihat juga contoh ini dari manual.

Variasi 2

$suffix = explode(',', 'foo,bar')[1];

Hasil fungsi array dereferencing juga diperkenalkan di PHP 5.4. Jika tidak memungkinkan untuk ditingkatkan, Anda perlu menggunakan variabel (sementara):

$parts = explode(',', 'foo,bar');
$suffix = $parts[1];

Lihat juga contoh ini dari manual.


23

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 :

Ada dua jenis sumber daya yang digunakan dalam modul MySQL. Yang pertama adalah pengidentifikasi tautan untuk koneksi basis data, yang kedua adalah sumber daya yang menampung hasil kueri.

Ekstensi CURL menentukan dua jenis sumber daya lainnya :

... CURL handle dan CURL multi handle.

Saat var_dumpdiedit, nilainya terlihat seperti ini:

$resource = curl_init();
var_dump($resource);

resource(1) of type (curl)

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 falsesebagai gantinya. Misalnya, fopenfungsi memiliki deskripsi ini:

Nilai Pengembalian

Mengembalikan sumber daya penunjuk file saat sukses, atau FALSEkesalahan.

Jadi dalam kode ini, $fpbaik akan menjadi resource(x) of type (stream)atau false:

$fp = fopen(...);

Jika Anda tidak memeriksa apakah fopenoperasi berhasil atau gagal dan karenanya apakah $fpsumber daya yang valid atau falsedan beralih $fpke fungsi lain yang mengharapkan sumber daya, Anda mungkin mendapatkan kesalahan di atas:

$fp   = fopen(...);
$data = fread($fp, 1024);

Warning: fread() expects parameter 1 to be resource, boolean given

Anda selalu perlu memeriksa kesalahan nilai pengembalian fungsi yang mencoba mengalokasikan sumber daya dan mungkin gagal :

$fp = fopen(...);

if (!$fp) {
    trigger_error('Failed to allocate resource');
    exit;
}

$data = fread($fp, 1024);

Kesalahan Terkait:


22

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:

$var = "test";
echo $var["a_key"];

Jika Anda berpikir variabel tersebut harus berupa array, lihat dari mana asalnya dan perbaiki masalah di sana.


20

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:

  • server web yang menjalankan skrip Anda
  • untuk mengatur ekstensi file ke .php, jika tidak server web tidak akan menafsirkannya seperti itu *
  • untuk mengakses file .php Anda melalui server web

* 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:

file://C:/path/to/my/file.php

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:

http://localhost/my/file.php

Anda mungkin juga ingin memeriksa apakah Anda menggunakan tag terbuka pendek <?alih-alih <?phpdan konfigurasi PHP Anda telah menonaktifkan tag terbuka pendek.

Juga lihat kode PHP tidak dieksekusi, alih-alih kode muncul di halaman


18

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 $usernamedan $password.

    • Jarang Anda mendapatkan akses tanpa kata sandi - yang terjadi ketika Peringatan: berkata (using password: NO).
    • Hanya server uji lokal yang biasanya memungkinkan untuk terhubung dengan nama pengguna root, tanpa kata sandi, dan testnama 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_USERatau DB_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.phpbenar-benar disertakan dan lupakan.

  • Periksa untuk mengatur GRANTizin 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_querypanggilan, jika Anda tidak memiliki izin SELECTdari tabel tertentu, atau INSERT/ UPDATE, dan lebih umum DELETEapa 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=dan mysql.default_password=miliki nilai yang berarti.

    • Seringkali ini adalah konfigurasi penyedia. Jadi, hubungi dukungan mereka untuk ketidakcocokan.

  • Temukan dokumentasi penyedia hosting bersama Anda:

  • 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:

Btw, Anda mungkin tidak ingin menggunakan mysql_*fungsi lagi . Pendatang baru sering bermigrasi ke mysqli , yang bagaimanapun membosankan. Alih-alih membaca di PDO dan menyiapkan pernyataan .
$db = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");


2
mysql memungkinkan koneksi otomatis melalui pengaturan php-ini, maka pesan kesalahan yang sama diberikan dengan perintah yang berbeda diawali, misalnya "Peringatan: mysql_query (): Akses ditolak untuk pengguna '' @ 'localhost' (menggunakan kata sandi: TIDAK) di. .. " - hanya mencatat.
hakre

Ha, benar-benar lupa tentang itu! (Mungkin terakhir menggunakannya dengan PHP3 atau lebih ..)
mario

18

Perhatian: Array to string conversion

Ini hanya terjadi jika Anda mencoba memperlakukan array sebagai string:

$arr = array('foo', 'bar');

echo $arr;  // Notice: Array to string conversion
$str = 'Something, ' . $arr;  // Notice: Array to string conversion

Array tidak bisa begitu saja echoatau 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:

echo $arr[0];  // displays foo
$str = 'Something ' . join(', ', $arr); //displays Something, foo, bar

Atau lingkaran array:

foreach($arr as $key => $value) {
    echo "array $key = $value";
    // displays first: array 0 = foo
    // displays next:  array 1 = bar
}

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.


12

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:

$value = @(2 / 0);

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.

if ( $var1 == 0 ) { // check if var1 equals zero
    $var1 = 1; // var1 equaled zero so change var1 to equal one instead
    $var3 = ($var2 / $var1); // divide var1/var2 ie. 1/1
} else {
    $var3 = ($var2 / $var1); // if var1 does not equal zero, divide
}

Pertanyaan-pertanyaan Terkait:


Pengaturan ke 1 jika 0 akan menghentikan kesalahan tetapi apakah ini benar-benar lebih baik daripada penindasan yang Anda katakan tidak boleh digunakan (yang saya setuju dengan)? Saya menyarankan sebagian besar kali kemungkinan pesan atau nilai lain akan dikembalikan.
James

Untuk contoh ini, jika $var1== 0 maka Anda dapat mengatur $var3ke $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
James

8

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_STRICTbendera dierror_reporting() pengaturan .

Contoh:

class HTML {
   public function br() {
      echo '<br>';
   }
}

HTML::br() atau $html::br()

Anda benar-benar dapat menghindari kesalahan ini dengan tidak menambahkan E_STRICTuntuk error_reporting(), misalnya

error_reporting(E_ALL & ~E_STRICT);

karena untuk PHP 5.4.0 dan di atasnya, E_STRICTtermasuk dalam E_ALL[ ref ]. Tapi itu tidak disarankan. Solusinya adalah mendefinisikan fungsi statis yang Anda inginkan sebagai aktual static:

public static function br() {
  echo '<br>';
}

atau hubungi fungsi secara konvensional:

$html = new HTML();
$html->br();

Pertanyaan-pertanyaan Terkait :


7

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:

$string = 'abc';
echo $string{0};  // a

$array = [1, 2, 3];
echo $array{0};  // 1

Ini telah ditinggalkan sejak PHP 7.4.0 dan menghasilkan peringatan:

Tidak digunakan lagi: Sintaks akses array dan string offset dengan kurung kurawal sudah ditinggalkan

Anda harus menggunakan tanda kurung siku []untuk mengakses offset string dan elemen array:

$string = 'abc';
echo $string[0];  // a

$array = [1, 2, 3];
echo $array[0];  // 1

The RFC untuk perubahan ini link ke sebuah PHP Script yang upaya untuk memperbaiki ini secara mekanis.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.