mysql_fetch_array () / mysql_fetch_assoc () / mysql_fetch_row () / mysql_num_rows dll ... mengharapkan parameter 1 menjadi sumber daya

960

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'];
}
iamjonesy
sumber
15
Anda bisa mendapatkan pesan eroor yang lebih bermanfaat menggunakan :: QUERY atau die (mysql_error ());
nik
123
Juga catatan wajib: Kode Anda rentan terhadap injeksi SQL . Anda harus memvalidasi dan / atau menghindari input pengguna. Lihatlah mysql_real_escape_string. Jangan pernah mempercayai data pengguna.
Felix Kling
7
Sebenarnya, kode OP akan menyebabkan kesalahan sintaks pada server MySQL, tetapi setidaknya tidak rentan terhadap SQL Injection karena tanda kutip tunggal tidak memiliki interpolasi variabel.
szgal
4
@ Feliksling Saya menyadari ini sangat tua, dan kemungkinan yang paling akurat pada saat itu, tetapi komentar Anda sekarang salah dalam satu cara: mysql_real_escape_stringbukan 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.
Dana Gugatan Monica
2
Gah. Memperluas pertanyaan ini dengan memasukkan MySQLi dan PDO adalah ide yang buruk. Mereka masing-masing memiliki sintaks dan pesan kesalahan yang sedikit berbeda dan mereka dapat memiliki pertanyaan sendiri. Menggabungkan semuanya menjadi satu pertanyaan raksasa tiga bagian hanya membuat ini kurang Googleable dan memaksa orang yang datang ke sini untuk mengarungi konten yang tidak relevan untuk mendapatkan apa yang mereka inginkan. Itu juga membatalkan banyak sekali jawaban di bawah ini, dan menjadikan pertanyaan ini "Terlalu Luas" oleh standar yang biasanya kita terapkan. Menurut saya ini berantakan, tapi sudah terlambat untuk memperbaikinya.
Mark Amery

Jawaban:

667

Kueri mungkin gagal karena berbagai alasan yang mana mysql_ * dan ekstensi mysqli akan kembali falsedari fungsi / metode kueri masing-masing. Anda perlu menguji untuk kondisi kesalahan itu dan menanganinya sesuai.

ekstensi mysql_ * :

CATATAN Fungsi mysql_ sudah usang dan telah dihapus dalam versi php 7.

Periksa $resultsebelum meneruskannya ke mysql_fetch_array. Anda akan menemukan bahwa itu falsekarena kueri gagal. Lihat mysql_querydokumentasi untuk kemungkinan nilai pengembalian dan saran untuk cara menanganinya.

$username = mysql_real_escape_string($_POST['username']);
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");

if($result === FALSE) { 
    die(mysql_error()); // TODO: better error handling
}

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

ekstensi
gaya prosedural mysqli :

$username = mysqli_real_escape_string($mysqli, $_POST['username']);
$result = mysqli_query($mysqli, "SELECT * FROM Users WHERE UserName LIKE '$username'");

// mysqli_query returns false if something went wrong with the query
if($result === FALSE) { 
    yourErrorHandler(mysqli_error($mysqli));
}
else {
    // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
    foreach( $result as $row ) {
        ...

oo-style :

$username = $mysqli->escape_string($_POST['username']);
$result = $mysqli->query("SELECT * FROM Users WHERE UserName LIKE '$username'");

if($result === FALSE) { 
    yourErrorHandler($mysqli->error); // or $mysqli->error_list
}
else {
    // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
    foreach( $result as $row ) {
      ...

menggunakan pernyataan yang disiapkan:

$stmt = $mysqli->prepare('SELECT * FROM Users WHERE UserName LIKE ?');
if ( !$stmt ) {
    yourErrorHandler($mysqli->error); // or $mysqli->error_list
}
else if ( !$stmt->bind_param('s', $_POST['username']) ) {
    yourErrorHandler($stmt->error); // or $stmt->error_list
}
else if ( !$stmt->execute() ) {
    yourErrorHandler($stmt->error); // or $stmt->error_list
}
else {
    $result = $stmt->get_result();
    // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
    foreach( $result as $row ) {
      ...

Contoh-contoh ini hanya menggambarkan apa yang harus dilakukan (penanganan kesalahan), bukan bagaimana melakukannya. Kode produksi tidak boleh digunakan or diesaat 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 .

Edward Dale
sumber
9
Benar, tetapi menggunakan die () jika kueri gagal sedikit banyak.
2ndkauboy
28
Saya akan merancang seluruh mekanisme penanganan kesalahan untuk OP, tetapi memutuskan bahwa mungkin di luar ruang lingkup jawaban saya.
Edward Dale
@ scompt.com Ya itu juga tercakup dalam beberapa jawaban lain. Saya kira saya baru saja menegaskan bahwa karena ini adalah jawaban yang diterima pada pertanyaan visibilitas tinggi, selain saran (sangat baik) tentang cara menangkap kesalahan dengan benar di masa mendatang, seharusnya (IMHO) benar-benar menjawab pertanyaan spesifik (yaitu jelaskan mengapa ada kesalahan dalam kasus ini).
Sepster
2
Alih-alih if($result === FALSE)bisa Anda gunakan if(! $result). Koreksi saya jika saya salah
anestv
1
mysql_query (): Ekstensi mysql sudah usang dan akan dihapus di masa depan: gunakan mysqli
Greg
165

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

    mysql_connect($host, $username, $password) or die("cannot connect"); 
    mysql_select_db($db_name) or die("cannot select DB");
    
    $sql = "SELECT * FROM table_name";
    $result = mysql_query($sql);
    
    if (false === $result) {
        echo mysql_error();
    }
  • 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_*dan mysql_*fungsi. Mereka bukan hal yang sama dan tidak dapat digunakan bersama. (Jika Anda akan memilih salah satu atau tongkat lainnya mysqli_*. 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 .

John Conde
sumber
1
Dengan pertanyaan ini hari ini stackoverflow.com/q/43804651/1415724 dan yang serupa lainnya belakangan ini; Saya pikir mungkin ada baiknya memperbarui jawaban Anda untuk mengandung sesuatu seperti "Kesalahan itu juga bisa disebabkan oleh tidak mengeksekusi kueri dengan mysql_query()/ mysqli_query($connection)dll." ; pikiran? Karena tidak ada jawaban lain dalam T&J ini menyebutkan ini.
Funk Forty Niner
111

Kesalahan yang terjadi di sini adalah karena penggunaan tanda kutip tunggal ( '). Anda dapat menempatkan pertanyaan Anda seperti ini:

mysql_query("
SELECT * FROM Users 
WHERE UserName 
LIKE '".mysql_real_escape_string ($username)."'
");

Ini digunakan mysql_real_escape_stringuntuk 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 lama mysql_real_escape_stringakan melakukan trik.

nik
sumber
5
Mengapa menambahkan derau dengan penggabungan string dan bukan hanya menempatkan variabel dalam string kueri?
Matteo Riva
1
@Matteo Riva Ya, tapi saya pikir ini adalah cara yang lebih bersih untuk memisahkan variabel dari string. :)
nik
60

Seperti yang dijelaskan scompt.com , kueri mungkin gagal. Gunakan kode ini untuk mendapatkan galat dari kueri atau hasil yang benar:

$username = $_POST['username'];
$password = $_POST['password'];

$result = mysql_query("
SELECT * FROM Users 
WHERE UserName LIKE '".mysql_real_escape_string($username)."'
");

if($result)
{
    while($row = mysql_fetch_array($result))
    {
        echo $row['FirstName'];
    }
} else {
    echo 'Invalid query: ' . mysql_error() . "\n";
    echo 'Whole query: ' . $query; 
}

Lihat dokumentasi untukmysql_query() informasi lebih lanjut.

Kesalahan aktual adalah tanda kutip tunggal sehingga variabel $usernametidak diuraikan. Tetapi Anda harus benar-benar menggunakannya mysql_real_escape_string($username)untuk menghindari injeksi SQL.

2ndkauboy
sumber
52

Beri tanda kutip $username. Nilai string, sebagai lawan dari nilai numerik, harus dilampirkan dalam tanda kutip.

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");

Juga, tidak ada gunanya menggunakan LIKEkondisi jika Anda tidak menggunakan wildcard: jika Anda memerlukan penggunaan sama persis =bukan LIKE.

Matteo Riva
sumber
1
Dan bagaimana jika $ username adalah: "'; DROP TABLES;" ? Itulah keuntungan menggunakan pernyataan yang disiapkan dan nilai-nilai terikat, yang menurut saya penanya ingin dipertahankan.
HoldOffHunger
42

Silakan periksa sekali database yang dipilih bukan karena beberapa kali database tidak dipilih

Memeriksa

mysql_select_db('database name ')or DIE('Database name is not available!');

sebelum permintaan MySQL dan kemudian lanjutkan ke langkah berikutnya

$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

f($result === FALSE) {
    die(mysql_error());
yasin
sumber
40

Kode Anda harus seperti ini

$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM Users WHERE UserName LIKE '$username'";
echo $query;
$result = mysql_query($query);

if($result === FALSE) {
    die(mysql_error("error message for the user")); 
}

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

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.

Chaitannya
sumber
3
Jangan gunakan kode ini. Ini terbuka lebar untuk serangan injeksi SQL.
Brad
34
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

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:

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

if( $result === FALSE ) {
   trigger_error('Query failed returning error: '. mysql_error(),E_USER_ERROR);
} else {
   while( $row = mysql_fetch_array($result) ) {
      echo $row['username'];
   }
}

http://us.php.net/manual/en/function.mysql-query.php untuk informasi lebih lanjut.

derokorian
sumber
2
Jangan gunakan kode ini, bahkan jika Anda menambahkan tanda kutip. Ini terbuka lebar untuk serangan injeksi SQL.
Brad
33

Kueri ini seharusnya berfungsi:

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'");
while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

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.

Enis P. Aginić
sumber
28
$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'") or die(mysql_error());

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

Terkadang menekan kueri sebagai @mysql_query(your query);

Dip Pokhrel
sumber
2
Jangan gunakan kode ini. Ini terbuka lebar untuk serangan injeksi SQL.
Brad
27

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_cidan semuanya baru saja diklik.

kolexinfos
sumber
25
$query = "SELECT Name,Mobile,Website,Rating FROM grand_table order by 4";

while( $data = mysql_fetch_array($query))
{
    echo("<tr><td>$data[0]</td><td>$data[1]</td><td>$data[2]</td><td>$data[3]</td></tr>");      
}

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.

Kode.of.kode
sumber
Ingatlah untuk menggunakan htmlspecialchars()saat menggunakan data arbitrer dalam konteks HTML. Jika tidak, Anda berisiko membuat HTML yang valid ketika karakter yang digunakan digunakan dalam data.
Brad
25

Coba ini, itu harus berhasil, jika tidak Anda perlu mencetak kesalahan untuk menentukan masalah Anda

$username = $_POST['username'];
$password = $_POST['password'];

$sql = "SELECT * from Users WHERE UserName LIKE '$username'";
$result = mysql_query($sql,$con);

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}
Amjad Omari
sumber
8
1) Terbuka lebar untuk injeksi SQL, 2) tidak termasuk penanganan kesalahan yang menyebabkan kesalahan dalam kasus OP.
tipuan
+1. @ menerima Ya itu terbuka lebar. Tetapi tidak lebih dari OP atau kode penjawab yang diterima ;-) Dan itu bukan kurangnya penanganan kesalahan dalam kode OP yang menyebabkan kesalahan ... itu adalah kesalahan , dan jawaban ini setidaknya upaya untuk menyelesaikannya (dengan meletakkan tunggal kutipan di sekitar string literal dalam LIKEekspresi).
Sepster
1
+1 Silakan tambahkan spasi antara LIKE dan '$ username', sisanya tampaknya baik-baik saja kecuali injeksi SQL. Mengapa tidak menggunakan = alih-alih LIKE nama pengguna operator harus sama persis
asim-ishaq
21

Mungkin ada dua alasan:

  1. Sudahkah Anda membuka koneksi ke database sebelum memanggil fungsi mysql_query? Saya tidak melihat itu dalam kode Anda. Gunakan mysql_connect sebelum membuat kueri. Lihatphp.net/manual/en/function.mysql-connect.php

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

asim-ishaq
sumber
20

Coba kode berikut. Itu mungkin bekerja dengan baik.

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName ='$username'");

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}
ravi
sumber
4
Kode ini tunduk pada injeksi SQL dan tidak boleh digunakan.
Brad
15

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.

pengguna2835116
sumber
15

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

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
        // code here 
    }
} else {
    echo "0 results";
}
$conn->close();
?>
Manoj Kumar
sumber
Posting Anda tidak berurusan dengan masalah yang ditangani oleh pertanyaan, yang merupakan permintaan yang tidak valid dan pelaporan kesalahan yang tidak memadai. Posting ini di luar topik.
Paul Spiegel
14
<?php
    $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'];
    }
?>

Dan jika ada pengguna dengan nama pengguna yang unik, Anda dapat menggunakan "=" untuk itu. Tidak perlu suka.

Kueri Anda akan:

mysql_query("SELECT * FROM Users WHERE UserName ='".$username."'");
Janak Prajapati
sumber
3
Kode ini terbuka lebar untuk injeksi SQL dan tidak boleh digunakan.
Brad
@AnujGarg Kode ini mengambil input langsung dan menggabungkannya ke dalam kueri. Seseorang dapat menulis SQL mereka sendiri untuk data posting usernamedan itu akan dieksekusi.
Brad
Jadi apa yang harus digunakan untuk mencegah kode dari injeksi SQL?
Anuj Garg
14

Sertakan variabel string koneksi sebelum permintaan MySQL. Misalnya, $conntdalam kode ini:

$results = mysql_query($connt, "SELECT * FROM users");
Durairaj
sumber
1
Ini tidak membahas masalah dalam pertanyaan. Itu juga salah dan akan memunculkan kesalahan lain.
Paul Spiegel
12

Setiap kali Anda mendapatkan ...

"Peringatan: mysqli_fetch_object () mengharapkan parameter 1 menjadi mysqli_result, boolean diberikan"

... kemungkinan karena ada masalah dengan permintaan Anda. The prepare()atau query()kekuatan kembali FALSE(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 <?phptag pembuka Anda :

error_reporting(E_ALL);
ini_set('display_errors', 1);

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 menggunakan tail -f /path/to/logdi 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:

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
$query = $mysqli->prepare($sql)); // assuming $mysqli is the connection
$query->bind_param('s', $definition);
$query->execute();

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.

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
if($query = $mysqli->prepare($sql)) { // assuming $mysqli is the connection
    $query->bind_param('s', $definition);
    $query->execute();
    // any additional code you need would go here.
} else {
    $error = $mysqli->errno . ' ' . $mysqli->error; // 1054 Unknown column 'foo' in 'field list'
    // handle error
}

Jika ada sesuatu yang salah, Anda dapat memuntahkan pesan kesalahan yang membawa Anda langsung ke masalah ini. Dalam hal ini, tidak ada fookolom 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.

Jay Blanchard
sumber
2
Bagaimana Anda dapat menulis "Pastikan Anda menangani kesalahan dengan baik dan tidak pernah mengungkapkan penyebab sebenarnya dari masalah apa pun kepada pengguna Anda." dan echo $error;dalam satu posting?
Paul Spiegel
Terima kasih atas pimpinan @PaulSpiegel. Sudah lama sejak saya menulis atau meninjau kembali jawabannya dan telah melewatkan bahwa saya telah meninggalkan gema di sana.
Jay Blanchard
11
<?php
      $username = $_POST['username'];
       $password = $_POST['password'];

     $result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '".mysql_real_escape_string($username)."'")or die(mysql_error());
while($row=mysql_fetch_array($result))
  {
 echo $row['FirstName'];
 }
 ?>
Dennis Kiptugen
sumber
11

Coba ini

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysqli_query('SELECT * FROM Users WHERE UserName LIKE $username');

if($result){
while($row = mysqli_fetch_array($result))
{
    echo $row['FirstName'];
}
}
SuReSh
sumber
4
@panjehra mysql_ * dihilangkan sekarang dan akan dihapus dari php 7. Gunakan mysqli_ * sebagai gantinya
Manoj Kumar
9

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:

if (isset($_GET['q1mrks']) && isset($_GET['marks']) && isset($_GET['qt1'])) {
    $Q1mrks = $_GET['q1mrks'];
    $marks = $_GET['marks'];
    $qt1 = $_GET['qt1'];

    $qtype_qry = mysql_query("
        SELECT *
        FROM s_questiontypes
        WHERE quetype_id = '$qt1'
    ");
    $row = mysql_fetch_assoc($qtype_qry);
    $qcode = $row['quetype_code'];

    $sq_qry = "
        SELECT *
        FROM s_question
        WHERE quetype_code = '$qcode'
        ORDER BY RAND() LIMIT $Q1mrks
    ";
    $sq_qry = mysql_query("
        SELECT *
        FROM s_question
        WHERE quetype_code = '$qcode'
        LIMIT $Q1mrks
    ");
    while ($qrow = mysql_fetch_array($sq_qry)) {
        $qm = $qrow['marks'] . "<br />";
        $total += $qm . "<br />";
    }
    echo $total . "/" . $marks;
}
Peter Mortensen
sumber
2
Jangan gunakan kode ini. Ini terbuka lebar untuk serangan injeksi SQL.
Brad
9

Pastikan Anda Tidak Menutup Basis Data Dengan menggunakan db_close () Sebelum Untuk Menjalankan Permintaan Anda:

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.

A.Aleem11
sumber
8

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.

pengguna1012181
sumber
7

Periksa koneksi Anda terlebih dahulu.

Kemudian jika Anda ingin mengambil nilai yang tepat dari database maka Anda harus menulis:

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName =`$usernam`");

Atau Anda ingin mengambil LIKEjenis nilai maka Anda harus menulis:

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'");
Omdev
sumber
3
Kode ini terbuka lebar untuk injeksi SQL dan tidak boleh digunakan.
Brad
6

Anda juga dapat memeriksa apakah $resultgagal seperti sebelum menjalankan array fetch

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');
if(!$result)
{
     echo "error executing query: "+mysql_error(); 
}else{
       while($row = mysql_fetch_array($result))
       {
         echo $row['FirstName'];
       }
}
pengguna28864
sumber
3
Jangan gunakan kode ini. Ini terbuka lebar untuk serangan injeksi SQL.
Brad
Tetapi jika kode berfungsi, saya merasa Anda harus mengedit kode dan memasukkan filter yang diperlukan alih-alih melakukan castigating kode.
user28864
Penggunaan sederhana filter tidak akan memperbaiki apa yang salah dengan kode ini. Solusi terbaik adalah menggunakan kueri yang disiapkan / parameter dengan PDO atau yang serupa. Saya tidak melihat ada gunanya memperbaikinya, karena jawaban yang benar telah diposting di sini. Idealnya, jawaban ini akan dihapus. Namun, Anda dipersilakan untuk memperbaiki jawaban Anda dan saya akan dengan senang hati memilihnya jika itu benar.
Brad
Nah, jika Anda merasa jawabannya tidak layak mempertimbangkan Anda dapat melanjutkan dan membacanya. Namun, saya pikir inti dari komunitas ini adalah untuk berbagi dan menyumbangkan pengetahuan. Jika Anda memiliki sesuatu untuk dibagikan daripada menunjukkan dan menunda orang.
user28864
2
Anda benar, inti dari komunitas ini adalah untuk berbagi pengetahuan. Itu sebabnya menambahkan penjelasan dengan downvote saya, dan selanjutnya menjelaskan mengapa saran filter Anda tidak cukup. Saya lebih suka mengingatkan Anda, bersama siapa pun yang menemukan jawaban Anda, bahwa kode di atas tidak aman. Lebih baik bagi semua orang untuk mempelajari metode yang benar daripada mengabadikan kode yang buruk. Dan, saya tidak dapat menghapus jawaban Anda, saya juga tidak. Itu terserah Anda, jika Anda memilih untuk melakukannya.
Brad
4

Biasanya kesalahan terjadi ketika konektifitas database Anda gagal, jadi pastikan untuk menghubungkan database Anda atau untuk memasukkan file database.

include_once(db_connetc.php');

ATAU

// Create a connection
$connection = mysql_connect("localhost", "root", "") or die(mysql_error());

//Select database
mysql_select_db("db_name", $connection) or die(mysql_error());

$employee_query = "SELECT * FROM employee WHERE `id` ='".$_POST['id']."'";

$employee_data = mysql_query($employee_query);

if (mysql_num_rows($employee_data) > 0) {

    while ($row = mysql_fetch_array($employee_data)){
        echo $row['emp_name'];
    } // end of while loop
} // end of if
  • Praktik terbaik adalah menjalankan kueri dalam sqlyog dan kemudian menyalinnya ke kode halaman Anda.
  • Selalu simpan kueri Anda dalam suatu variabel lalu gema variabel itu. Lalu diteruskan ke mysql_query($query_variable);.
Engr Zardari
sumber
2
1) Anda tidak tahu apakah saya punya atau belum memilih jawaban apa pun di sini, atas atau bawah. 2) Seperti yang saya jelaskan di komentar pertama saya; jawaban Anda tidak merujuk masalah ( boolean diteruskan ke mysql_fetch_array ) dan Anda memiliki kesalahan sintaksis
Phil
2
Anda memiliki kutipan yang salah dalam kedua contoh kode Anda. Penyorotan sintaks yang diterapkan pada blok kode kedua Anda adalah pemberian mati bahwa ada sesuatu yang salah
Phil
4
Kode ini tunduk pada injeksi SQL dan tidak boleh digunakan. @EngrZardari jika Anda menggunakan kode ini pada sistem produksi Anda, Anda pasti telah diretas dan harus memperbaiki situasi membeli menggunakan kueri yang disiapkan / parameter dengan PDO atau serupa. Ada bot yang memiliki pengujian otomatis untuk kerentanan semacam itu.
Brad
1
@EngrZardari Tentang Anda "tidak ada kesalahan apa pun, saya telah menempelkan kode di sini yang saat ini saya gunakan." komentar di atas. Ada kutipan yang hilang dalam kueri yang saya koreksi. Itu akan membuat kesalahan parse (PHP).
Funk Forty Niner
2

Coba kode ini berfungsi baik

tetapkan variabel pos ke variabel

   $username = $_POST['uname'];

   $password = $_POST['pass'];

  $result = mysql_query('SELECT * FROM userData WHERE UserName LIKE $username');

if(!empty($result)){

    while($row = mysql_fetch_array($result)){
        echo $row['FirstName'];
     }
}
Ritesh d joshi
sumber
3
Kode ini tunduk pada serangan injeksi SQL dan tidak boleh digunakan.
Brad
1

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. "').

$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'];
     }

$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'];
     }

tetapi penggunaan Mysql telah menyusut banyak, gunakan PDO sebagai gantinya. Itu sederhana tetapi sangat aman

Dennis Kiptugen
sumber
Tapi penggunaan Mysql telah terdepresiasi. Anda bisa menggunakan PDO sebagai gantinya. Biarkan saya memberi Anda contoh masuk.
Dennis Kiptugen
2
Kata sandi harus TIDAK PERNAH disimpan dalam bentuk teks biasa, memanfaatkan fungsi bawaan yang dimiliki PHP untuk menangani hashing kata sandi dan memverifikasi kata sandi hash!
SpacePhoenix