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.
php
mysqli
prepared-statement
environment
error-reporting
siopaoman
sumber
sumber
$mysqli
variabel?SELECT
kueri. Apakah Anda sudah memeriksanya?Jawaban:
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:
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_reporting
harus diatur keE_ALL
nilai;log_errors
harus disetel ke 1 (akan lebih mudah untuk memiliki log di PC pengembangan juga)display_errors
harus disetel ke 1Di server produksi
error_reporting
harus diatur keE_ALL
nilai;log_errors
harus disetel ke 1display_errors
harus disetel ke 0Bagaimana 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: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.
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
@
)! Itu membuat programmer tidak dapat membaca pesan kesalahan dan karena itu tidak dapat memperbaiki kesalahan tersebutdie()
atauecho
atau 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.if($result)
). Dengan pengecualian kesalahan diaktifkan, kondisi seperti itu tidak akan berguna.try..catch
operator 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.
sumber