mysqli_fetch_assoc () mengharapkan parameter / Panggilan ke fungsi anggota bind_param () kesalahan. Bagaimana cara mendapatkan kesalahan mysql yang sebenarnya dan memperbaikinya?

109

Di lingkungan lokal / pengembangan saya, kueri MySQLi bekerja dengan baik. Namun, ketika saya mengunggahnya di lingkungan host web saya, saya mendapatkan kesalahan ini:

Kesalahan fatal: Panggilan ke fungsi anggota bind_param () pada non-objek di ...

Ini kodenya:

global $mysqli;
$stmt = $mysqli->prepare("SELECT id, description FROM tbl_page_answer_category WHERE cur_own_id = ?");
$stmt->bind_param('i', $cur_id);
$stmt->execute();
$stmt->bind_result($uid, $desc);

Untuk memeriksa kueri saya, saya mencoba menjalankan kueri melalui panel kontrol phpMyAdmin dan hasilnya OK.

siopaoman
sumber
Bisakah kita melihat di mana Anda memulai $mysqlivariabel?
Rikesh
Bisa jadi pengguna MySQL Anda kurang memiliki hak untuk melakukan SELECTkueri. Apakah Anda sudah memeriksanya?
Amal Murali
Yang muncul di benak Anda adalah tidak ada mysqli yang tersedia atau Anda memberikan kredensial yang salah untuk terhubung ke MySQL.
NB
@YourCommonSense - Dengan judul lama, lebih mudah menemukan pertanyaan ini untuk referensi duplikat.
Paul Spiegel
@Paul ya, ini adalah perhatian saya yang terdalam juga. Saya mengubah judul demi pencarian Google dan pengakuan keseluruhan, karena untuk rata-rata pengguna PHP, hubungan antara kode mereka dan lingkungan yang berbeda tidak jelas. Tapi sejak itu saya kesulitan menemukannya juga. Akhirnya memilikinya di bookmark. Jika Anda dapat mengusulkan judul yang dapat dikenali tetapi relevan, itu akan bagus
Akal

Jawaban:

122

Terkadang kode MySQLi Anda menghasilkan kesalahan seperti mysqli_fetch_assoc() expects parameter..., Call to a member function bind_param()...atau serupa. Atau bahkan tanpa kesalahan apa pun, tetapi kueri tidak berfungsi semuanya. Artinya kueri Anda gagal dijalankan.

Setiap kali kueri gagal, MySQL memiliki pesan kesalahan yang menjelaskan alasannya . Sayangnya, secara default kesalahan semacam itu tidak ditransfer ke PHP, dan yang Anda dapatkan hanyalah pesan kesalahan samar yang disebutkan di atas. Oleh karena itu, sangat penting untuk mengkonfigurasi PHP dan MySQLi untuk melaporkan kesalahan MySQL kepada Anda. Dan begitu Anda mendapatkan pesan kesalahan, memperbaikinya akan menjadi sangat mudah.

Bagaimana cara mendapatkan pesan kesalahan di MySQLi?

Pertama-tama, selalu miliki baris ini sebelum MySQLi terhubung di semua lingkungan Anda:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

Setelah itu semua kesalahan MySQL akan ditransfer ke pengecualian PHP. Pengecualian yang tidak tertangkap, pada gilirannya, membuat kesalahan fatal pada PHP. Jadi, jika terjadi kesalahan MySQL, Anda akan mendapatkan kesalahan PHP konvensional. Itu akan langsung membuat Anda sadar akan penyebab kesalahan. Dan jejak tumpukan akan membawa Anda ke tempat yang tepat di mana kesalahan terjadi.

Cara mengkonfigurasi PHP di lingkungan yang berbeda

Berikut adalah inti dari artikel saya tentang pelaporan kesalahan PHP :
Melaporkan kesalahan pada server pengembangan dan langsung harus berbeda. Pada server pengembangan, lebih mudah menampilkan kesalahan di layar, tetapi pada server langsung pesan kesalahan harus dicatat, sehingga Anda dapat menemukannya di log kesalahan nanti.

Oleh karena itu, Anda harus menyetel opsi konfigurasi yang sesuai dengan nilai berikut:

  • Di server pengembangan

    • error_reportingharus diatur ke E_ALLnilai;
    • log_errors harus disetel ke 1 (akan lebih mudah untuk memiliki log di PC pengembangan juga)
    • display_errors harus disetel ke 1
  • Di server produksi

    • error_reportingharus diatur ke E_ALLnilai;
    • log_errors harus disetel ke 1
    • display_errors harus disetel ke 0

Bagaimana cara menggunakannya?

Hapus saja kode apa pun yang memeriksa kesalahan secara manual , semua itu or die(), if ($result)dan semacamnya. Cukup tulis kode interaksi database Anda segera:

$stmt = $this->con->prepare("INSERT INTO table(name, quantity) VALUES (?,?)");
$stmt->bind_param("si", $name, $quantity);
$stmt->execute();

sekali lagi, tanpa syarat apapun . Jika terjadi kesalahan, itu akan diperlakukan sebagai kesalahan lain dalam kode Anda. Misalnya, pada PC pengembangan itu hanya akan muncul di layar, sementara di situs langsung itu akan dicatat untuk programmer, sedangkan untuk kenyamanan pengguna Anda dapat menggunakan penangan kesalahan (tetapi itu adalah cerita berbeda yang di luar topik untuk MySQLi, tetapi Anda dapat membacanya di artikel yang ditautkan di atas).

Apa yang harus dilakukan dengan pesan kesalahan yang Anda dapatkan?

Pertama-tama Anda harus menemukan kueri masalah. Pesan kesalahan berisi nama file dan nomor baris dari tempat kesalahan terjadi. Untuk kode sederhana saja sudah cukup, tetapi jika kode Anda menggunakan fungsi atau kelas, Anda mungkin perlu mengikuti pelacakan tumpukan untuk menemukan kueri masalah.

Setelah mendapatkan pesan kesalahan, Anda harus membaca dan memahaminya. Kedengarannya terlalu jelas jika tidak merendahkan, namun peserta didik sering kali mengabaikan fakta bahwa pesan kesalahan bukan hanya sekedar sinyal alarm, tetapi sebenarnya berisi penjelasan rinci tentang masalah tersebut . Dan yang Anda butuhkan hanyalah membaca pesan kesalahan dan memperbaiki masalah.

  • Katakanlah, jika dikatakan bahwa tabel tertentu tidak ada, Anda harus memeriksa ejaan, kesalahan ketik, huruf besar-kecil. Anda juga harus memastikan bahwa skrip PHP Anda terhubung ke database yang benar
  • Atau, jika dikatakan ada kesalahan dalam sintaks SQL, maka Anda harus memeriksa SQL Anda. Dan tempat masalahnya ada tepat sebelum bagian kueri yang dikutip dalam pesan kesalahan.

Jika Anda tidak memahami pesan kesalahan tersebut, coba Google. Dan saat menelusuri hasil, tetap gunakan jawaban yang menjelaskan kesalahan tersebut daripada terus terang memberikan solusi. Solusi mungkin tidak berfungsi dalam kasus khusus Anda, tetapi penjelasannya akan membantu Anda memahami masalahnya dan membuat Anda dapat memperbaiki masalah sendiri.

Anda juga harus mempercayai pesan kesalahan tersebut. Jika ia mengatakan bahwa jumlah token tidak sesuai dengan jumlah variabel terikat maka adalah sangat. Hal yang sama berlaku untuk tabel atau kolom yang tidak ada. Diberikan pilihan, apakah itu kesalahan Anda sendiri atau pesan kesalahan yang salah, selalu gunakan yang pertama. Sekali lagi kedengarannya merendahkan, tetapi ratusan pertanyaan di situs ini membuktikan bahwa nasihat ini sangat berguna.

Daftar hal-hal yang tidak boleh Anda lakukan sehubungan dengan pelaporan kesalahan

  • Jangan pernah menggunakan operator penekan kesalahan ( @)! Itu membuat programmer tidak dapat membaca pesan kesalahan dan karena itu tidak dapat memperbaiki kesalahan tersebut
  • Jangan gunakan die()atau echoatau fungsi lain untuk mencetak pesan kesalahan di layar tanpa syarat. PHP dapat melaporkan kesalahan dengan sendirinya dan melakukannya dengan cara yang benar tergantung pada lingkungan - jadi biarkan saja untuk PHP.
  • Jangan menambahkan kondisi untuk menguji hasil kueri secara manual (seperti if($result)). Dengan pengecualian kesalahan diaktifkan, kondisi seperti itu tidak akan berguna.
  • Jangan gunakan try..catchoperator untuk menggemakan pesan kesalahan. Operator ini harus digunakan untuk melakukan beberapa penanganan kesalahan, seperti rollback transaksi. Tetapi jangan pernah menggunakannya hanya untuk melaporkan kesalahan - seperti yang kita pelajari di atas, PHP sudah dapat melakukannya dengan cara yang benar.

PS
Terkadang tidak ada error tapi juga tidak ada hasil. Artinya, tidak ada data di database yang sesuai dengan kriteria Anda . Dalam hal ini Anda harus mengakui fakta ini, bahkan jika Anda dapat bersumpah data dan kriterianya baik-baik saja. Mereka tidak. Anda harus memeriksanya lagi. Saya punya artikel yang dapat membantu dalam masalah ini, Cara men-debug interaksi database . Meski ditulis untuk PDO, namun prinsipnya sama. Cukup ikuti instruksi ini selangkah demi selangkah dan dapatkan masalah Anda terpecahkan atau dapatkan pertanyaan yang dapat dijawab untuk Stack Overflow.

Akal Sehat Anda
sumber
@AdamWinter menggunakan @ selalu salah, dan dalam kasus khusus ini sepuluh kali lipat. Pesan kesalahan pada program Anda sama dengan sakit pada tubuh Anda. Ini memberi tahu Anda bahwa ada sesuatu yang salah, seperti kaki Anda patah. Dan Anda harus memperbaiki kaki tidak hanya mengambil obat penghilang rasa sakit dan melanjutkan. SAMA DISINI. PHP memberi tahu Anda bahwa tidak ada variabel yang Anda harapkan. Jadi, Anda harus memperbaiki formulir atau apa pun, untuk membuat variabel ini tersedia. Bukan hanya menulis kode untuk menghindari kesalahan.
Akal Sehat Anda