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

Mar 26 2014

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.

Jawaban

131 YourCommonSense Mar 26 2014 at 20:32

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 tersebut 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, sedangkan di situs langsung itu akan dicatat untuk programmer, sedangkan untuk kenyamanan pengguna Anda dapat menggunakan penangan kesalahan (tetapi itu 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 kentara 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 masalahnya 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. Jika 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 terkait 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 echofungsi 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 transaksi rollback. 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 kesalahan tapi tidak ada hasil juga. 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 penyelesaian masalah Anda atau dapatkan pertanyaan yang dapat dijawab untuk Stack Overflow.