Saya mencoba untuk memilih data dari tabel MySQL, tetapi saya mendapatkan salah satu dari pesan kesalahan berikut:
mysql_fetch_array () mengharapkan parameter 1 menjadi sumber daya, diberikan boolean
Ini kode saya:
$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');
while($row = mysql_fetch_array($result)) {
echo $row['FirstName'];
}
mysql_real_escape_string
. Jangan pernah mempercayai data pengguna.mysql_real_escape_string
bukan menjadi semua dan akhir semua perlindungan injeksi SQL; masih rentan terhadap sejumlah serangan. (Tidak, Anda tidak pernah mengatakan itu sempurna, tetapi Anda menyiratkan itu adalah satu-satunya solusi yang diperlukan) Solusi terbaik sekarang adalah PDO, sejauh yang saya tahu.Jawaban:
Kueri mungkin gagal karena berbagai alasan yang mana mysql_ * dan ekstensi mysqli akan kembali
false
dari fungsi / metode kueri masing-masing. Anda perlu menguji untuk kondisi kesalahan itu dan menanganinya sesuai.ekstensi mysql_ * :
Periksa
$result
sebelum meneruskannya kemysql_fetch_array
. Anda akan menemukan bahwa itufalse
karena kueri gagal. Lihatmysql_query
dokumentasi untuk kemungkinan nilai pengembalian dan saran untuk cara menanganinya.ekstensi
gaya prosedural mysqli :
oo-style :
menggunakan pernyataan yang disiapkan:
Contoh-contoh ini hanya menggambarkan apa yang harus dilakukan (penanganan kesalahan), bukan bagaimana melakukannya. Kode produksi tidak boleh digunakan
or die
saat mengeluarkan HTML, karena itu akan (setidaknya) menghasilkan HTML yang tidak valid. Juga, pesan kesalahan basis data tidak boleh ditampilkan kepada pengguna non-admin, karena terlalu banyak mengungkapkan informasi .sumber
if($result === FALSE)
bisa Anda gunakanif(! $result)
. Koreksi saya jika saya salahPesan kesalahan ini ditampilkan ketika Anda memiliki kesalahan dalam permintaan Anda yang menyebabkannya gagal. Ini akan terwujud saat menggunakan:
mysql_fetch_array
/mysqli_fetch_array()
mysql_fetch_assoc()
/mysqli_fetch_assoc()
mysql_num_rows()
/mysqli_num_rows()
Catatan : Kesalahan ini tidak muncul jika tidak ada baris yang dipengaruhi oleh permintaan Anda. Hanya kueri dengan sintaks yang tidak valid yang akan menghasilkan kesalahan ini.
Langkah Pemecahan Masalah
Pastikan Anda memiliki server pengembangan yang dikonfigurasi untuk menampilkan semua kesalahan. Anda dapat melakukan ini dengan menempatkan ini di bagian atas file atau dalam file konfigurasi:
error_reporting(-1);
. Jika Anda memiliki kesalahan sintaks, ini akan menunjukkannya kepada Anda.Gunakan
mysql_error()
.mysql_error()
akan melaporkan kesalahan yang terjadi pada MySQL saat melakukan kueri Anda.Penggunaan sampel:
Jalankan kueri Anda dari baris perintah MySQL atau alat seperti phpMyAdmin . Jika Anda memiliki kesalahan sintaksis dalam kueri Anda, ini akan memberi tahu Anda apa itu.
Pastikan kutipan Anda benar. Kutipan yang hilang di sekitar kueri atau nilai dapat menyebabkan kueri gagal.
Pastikan Anda melarikan diri dari nilai-nilai Anda. Kutipan dalam kueri Anda dapat menyebabkan kueri gagal (dan juga membuat Anda terbuka untuk injeksi SQL). Gunakan
mysql_real_escape_string()
untuk menghindari input Anda.Pastikan Anda tidak melakukan pencampuran
mysqli_*
danmysql_*
fungsi. Mereka bukan hal yang sama dan tidak dapat digunakan bersama. (Jika Anda akan memilih salah satu atau tongkat lainnyamysqli_*
. Lihat di bawah untuk alasannya.)Tips lainnya
mysql_*
fungsi tidak boleh digunakan untuk kode baru. Mereka tidak lagi dipertahankan dan masyarakat telah memulai proses penghinaan . Alih-alih, Anda harus belajar tentang pernyataan yang disiapkan dan menggunakan PDO atau MySQLi . Jika Anda tidak dapat memutuskan, artikel ini akan membantu Anda memilih. Jika Anda ingin belajar, ini tutorial PDO yang bagus .sumber
mysql_query()
/mysqli_query($connection)
dll." ; pikiran? Karena tidak ada jawaban lain dalam T&J ini menyebutkan ini.Kesalahan yang terjadi di sini adalah karena penggunaan tanda kutip tunggal (
'
). Anda dapat menempatkan pertanyaan Anda seperti ini:Ini digunakan
mysql_real_escape_string
untuk pencegahan injeksi SQL. Meskipun kita harus menggunakan ekstensi MySQLi atau PDO_MYSQL untuk versi upgrade PHP (PHP 5.5.0 dan yang lebih baru), tetapi untuk versi yang lebih lamamysql_real_escape_string
akan melakukan trik.sumber
Seperti yang dijelaskan scompt.com , kueri mungkin gagal. Gunakan kode ini untuk mendapatkan galat dari kueri atau hasil yang benar:
Lihat dokumentasi untuk
mysql_query()
informasi lebih lanjut.Kesalahan aktual adalah tanda kutip tunggal sehingga variabel
$username
tidak diuraikan. Tetapi Anda harus benar-benar menggunakannyamysql_real_escape_string($username)
untuk menghindari injeksi SQL.sumber
Beri tanda kutip
$username
. Nilai string, sebagai lawan dari nilai numerik, harus dilampirkan dalam tanda kutip.Juga, tidak ada gunanya menggunakan
LIKE
kondisi jika Anda tidak menggunakan wildcard: jika Anda memerlukan penggunaan sama persis=
bukanLIKE
.sumber
Silakan periksa sekali database yang dipilih bukan karena beberapa kali database tidak dipilih
Memeriksa
sebelum permintaan MySQL dan kemudian lanjutkan ke langkah berikutnya
sumber
Kode Anda harus seperti ini
Setelah selesai dengan itu, Anda akan mendapatkan kueri yang dicetak di layar. Coba kueri ini di server Anda dan lihat apakah ini menghasilkan hasil yang diinginkan. Sebagian besar kesalahan dalam kueri. Sisa kode sudah benar.
sumber
Anda mendefinisikan string menggunakan tanda kutip tunggal dan PHP tidak menguraikan string kutipan tunggal yang dibatasi. Untuk mendapatkan interpolasi variabel, Anda harus menggunakan tanda kutip ganda ATAU penggabungan string (atau kombinasi keduanya). Lihat http://php.net/manual/en/language.types.string.php untuk informasi lebih lanjut.
Anda juga harus memeriksa bahwa mysql_query mengembalikan sumber daya hasil yang valid, jika tidak fetch_ *, num_rows, dll tidak akan berfungsi pada hasil karena bukan hasil! YAITU:
http://us.php.net/manual/en/function.mysql-query.php untuk informasi lebih lanjut.
sumber
Kueri ini seharusnya berfungsi:
Masalahnya adalah tanda kutip tunggal, sehingga permintaan Anda gagal dan mengembalikan FALSE dan loop WHILE Anda tidak dapat mengeksekusi. Menggunakan% memungkinkan Anda untuk mencocokkan hasil apa pun yang mengandung string Anda (seperti SomeText- $ username-SomeText).
Ini hanyalah jawaban untuk pertanyaan Anda, Anda harus menerapkan hal-hal yang disebutkan dalam posting lain: penanganan kesalahan, gunakan string pelarian (pengguna dapat mengetikkan apa pun ke dalam bidang, dan Anda HARUS memastikan itu bukan kode arbitrer), gunakan PDO sebagai ganti mysql_connect yang sekarang sudah dikurangi.
sumber
Terkadang menekan kueri sebagai
@mysql_query(your query);
sumber
Jika Anda mencoba semuanya di sini, dan itu tidak berhasil, Anda mungkin ingin memeriksa susunan basis data MySQL Anda. Milik saya diatur ke koleksi Swedia. Lalu saya mengubahnya
utf8_general_ci
dan semuanya baru saja diklik.sumber
Alih-alih menggunakan kueri WHERE, Anda bisa menggunakan kueri ORDER BY ini. Jauh lebih baik daripada ini untuk penggunaan kueri.
Saya telah melakukan permintaan ini dan saya tidak mendapatkan kesalahan seperti parameter atau boolean.
sumber
htmlspecialchars()
saat menggunakan data arbitrer dalam konteks HTML. Jika tidak, Anda berisiko membuat HTML yang valid ketika karakter yang digunakan digunakan dalam data.Coba ini, itu harus berhasil, jika tidak Anda perlu mencetak kesalahan untuk menentukan masalah Anda
sumber
LIKE
ekspresi).Mungkin ada dua alasan:
Sudahkah Anda membuka koneksi ke database sebelum memanggil fungsi mysql_query? Saya tidak melihat itu dalam kode Anda. Gunakan mysql_connect sebelum membuat kueri. Lihat
php.net/manual/en/function.mysql-connect.php
Variabel $ username digunakan di dalam string kutipan tunggal, sehingga nilainya tidak akan dievaluasi di dalam kueri. Permintaan pasti akan gagal.
Ketiga, struktur permintaan rentan terhadap injeksi SQL . Anda dapat menggunakan pernyataan yang disiapkan untuk menghindari ancaman keamanan ini.
sumber
Coba kode berikut. Itu mungkin bekerja dengan baik.
sumber
Pergi ke milikmu
config.php
. Saya memiliki masalah yang sama. Verifikasi nama pengguna dan kata sandi, dan juga sql select adalah nama yang sama dengan konfigurasi.sumber
Jangan gunakan fungsi mysql_ * yang sudah didepricar (depricated di php 5.5 akan dihapus di php 7). dan Anda dapat membuat ini dengan mysqli atau pdo
di sini adalah kueri pemilihan lengkap
sumber
Dan jika ada pengguna dengan nama pengguna yang unik, Anda dapat menggunakan "=" untuk itu. Tidak perlu suka.
Kueri Anda akan:
sumber
username
dan itu akan dieksekusi.Sertakan variabel string koneksi sebelum permintaan MySQL. Misalnya,
$connt
dalam kode ini:sumber
Setiap kali Anda mendapatkan ...
... kemungkinan karena ada masalah dengan permintaan Anda. The
prepare()
atauquery()
kekuatan kembaliFALSE
(Boolean), tapi pesan kegagalan generik ini tidak meninggalkan Anda banyak di jalan petunjuk. Bagaimana Anda mengetahui apa yang salah dengan kueri Anda? Kamu bertanya !Pertama-tama, pastikan pelaporan kesalahan dihidupkan dan terlihat: tambahkan dua baris ini ke bagian atas file Anda tepat setelah
<?php
tag pembuka Anda :Jika pelaporan kesalahan Anda telah diatur dalam php.ini Anda tidak perlu khawatir tentang ini. Pastikan Anda menangani kesalahan dengan anggun dan tidak pernah mengungkapkan penyebab sebenarnya dari masalah apa pun kepada pengguna Anda. Mengungkap penyebab sebenarnya bagi publik bisa menjadi undangan terukir emas bagi mereka yang ingin merusak situs dan server Anda. Jika Anda tidak ingin mengirim kesalahan ke browser, Anda selalu dapat memonitor log kesalahan server web Anda. Lokasi log akan bervariasi dari satu server ke server misalnya, pada Ubuntu log kesalahan biasanya terletak di
/var/log/apache2/error.log
. Jika Anda memeriksa log kesalahan di lingkungan Linux, Anda dapat menggunakantail -f /path/to/log
di jendela konsol untuk melihat kesalahan saat terjadi secara real-time .... atau saat Anda membuatnya.Setelah Anda dihadapkan pada pelaporan kesalahan standar, menambah pemeriksaan kesalahan pada koneksi database Anda dan pertanyaan akan memberi Anda lebih banyak detail tentang masalah yang terjadi. Lihat contoh ini di mana nama kolom salah. Pertama, kode yang mengembalikan pesan kesalahan fatal umum:
Kesalahannya bersifat umum dan tidak terlalu membantu Anda dalam menyelesaikan apa yang sedang terjadi.
Dengan beberapa baris kode Anda bisa mendapatkan informasi yang sangat terperinci yang dapat Anda gunakan untuk menyelesaikan masalah dengan segera . Periksa
prepare()
pernyataan untuk kebenaran dan jika itu baik Anda dapat melanjutkan ke mengikat dan mengeksekusi.Jika ada sesuatu yang salah, Anda dapat memuntahkan pesan kesalahan yang membawa Anda langsung ke masalah ini. Dalam hal ini, tidak ada
foo
kolom dalam tabel, menyelesaikan masalah itu sepele.Jika Anda memilih, Anda bisa memasukkan pemeriksaan ini dalam suatu fungsi atau kelas dan memperluasnya dengan menangani kesalahan dengan anggun seperti yang disebutkan sebelumnya.
sumber
echo $error;
dalam satu posting?sumber
Coba ini
sumber
Pertama, periksa koneksi Anda ke database. Apakah berhasil terhubung atau tidak?
Jika sudah selesai, maka setelah itu saya sudah menulis kode ini, dan itu berfungsi dengan baik:
sumber
Jika Anda menggunakan beberapa kueri dalam skrip bahkan Anda menyertakan halaman lain yang berisi kueri atau koneksi basis data, maka mungkin saja di tempat mana pun Anda menggunakan db_close () yang akan menutup koneksi basis data Anda jadi pastikan Anda tidak melakukan kesalahan ini dalam skrip Anda.
sumber
Jika Anda tidak memiliki Kesalahan MySQL yang muncul saat memeriksa, pastikan Anda membuat tabel database dengan benar. Ini terjadi pada saya. Cari koma atau kutipan yang tidak diinginkan.
sumber
Periksa koneksi Anda terlebih dahulu.
Kemudian jika Anda ingin mengambil nilai yang tepat dari database maka Anda harus menulis:
Atau Anda ingin mengambil
LIKE
jenis nilai maka Anda harus menulis:sumber
Anda juga dapat memeriksa apakah
$result
gagal seperti sebelum menjalankan array fetchsumber
Biasanya kesalahan terjadi ketika konektifitas database Anda gagal, jadi pastikan untuk menghubungkan database Anda atau untuk memasukkan file database.
ATAU
mysql_query($query_variable);
.sumber
Coba kode ini berfungsi baik
tetapkan variabel pos ke variabel
sumber
karena $ username adalah variabel php kita harus meneruskannya sebagai string ke mysqli jadi karena dalam kueri Anda mulai dengan satu kutipan, kita akan menggunakan penawaran ganda, penawaran tunggal, dan fullstop untuk tujuan penggabungan ("'. $ nama pengguna. '") jika Anda mulai dengan kuotasi ganda, Anda akan membalikkan kuotasi ('". $ nama pengguna. "').
tetapi penggunaan Mysql telah menyusut banyak, gunakan PDO sebagai gantinya. Itu sederhana tetapi sangat aman
sumber