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


Saya mencoba untuk memilih data dari tabel MySQL, tetapi saya mendapatkan salah satu pesan kesalahan berikut:

mysql_fetch_array () mengharapkan parameter 1 menjadi sumber daya, boolean diberikan

atau

mysqli_fetch_array () mengharapkan parameter 1 menjadi mysqli_result, boolean diberikan

atau

Panggilan ke fungsi anggota fetch_array () pada boolean / non-objek

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

Hal yang sama berlaku untuk kode seperti

$result = mysqli_query($mysqli, 'SELECT ...');
// mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given
while( $row=mysqli_fetch_array($result) ) {
    ...

dan

$result = $mysqli->query($mysqli, 'SELECT ...');
// Call to a member function fetch_assoc() on a non-object
while( $row=$result->fetch_assoc($result) ) {
    ...

dan

$result = $pdo->query('SELECT ...', PDO::FETCH_ASSOC);
// Invalid argument supplied for foreach()
foreach( $result as $row ) {
    ...

dan

$stmt = $mysqli->prepare('SELECT ...');
// Call to a member function bind_param() on a non-object
$stmt->bind_param(...);

dan

$stmt = $pdo->prepare('SELECT ...');
// Call to a member function bindParam() on a non-object
$stmt->bindParam(...);

864
2018-06-04 10:18


asal


Jawaban:


Kueri dapat gagal karena berbagai alasan dalam hal ini baik mysql_ * dan ekstensi mysqli akan kembali false dari fungsi / metode kueri masing-masing. Anda perlu menguji kondisi kesalahan itu dan menanganinya dengan benar.

ekstensi mysql_ *:

CATATAN Itu fungsi mysql_ sudah ditinggalkan dan telah dihapus dalam php versi 7.

Memeriksa $result sebelum meneruskannya mysql_fetch_array. Anda akan menemukannya false karena kueri gagal. Lihat mysql_query dokumentasi untuk kemungkinan nilai kembali dan saran untuk bagaimana menghadapinya.

$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 mysqli
gaya prosedural:

$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 harus dilakukan (penanganan kesalahan), bukan bagaimana melakukannya. Kode produksi tidak boleh digunakan or die ketika menghasilkan HTML, yang lain akan (setidaknya) menghasilkan HTML yang tidak valid. Juga, pesan kesalahan basis data tidak boleh ditampilkan kepada pengguna non-admin, karena itu mengungkapkan terlalu banyak informasi.


614
2018-06-04 10:19



Pesan kesalahan ini ditampilkan ketika Anda memiliki kesalahan dalam permintaan Anda yang menyebabkannya gagal. Ini akan memanifestasikan dirinya saat menggunakan:

  • mysql_fetch_array/mysqli_fetch_array()
  • mysql_fetch_assoc()/mysqli_fetch_assoc()
  • mysql_num_rows()/mysqli_num_rows()

Catatan: Kesalahan ini terjadi tidak muncul jika tidak ada baris yang terpengaruh oleh permintaan Anda. Hanya permintaan dengan sintaks yang tidak valid yang akan menghasilkan kesalahan ini.

Langkah-Langkah Pemecahan Masalah

  • Pastikan Anda memiliki server pengembangan Anda dikonfigurasi untuk menampilkan semua kesalahan. Anda dapat melakukan ini dengan menempatkan ini di bagian atas file Anda atau di file konfigurasi Anda: error_reporting(-1);. Jika Anda memiliki kesalahan sintaks, ini akan menunjukkannya kepada Anda.

  • Menggunakan mysql_error(). mysql_error() akan melaporkan kesalahan apa pun yang ditemui MySQL saat melakukan kueri Anda.

    Contoh penggunaan:

    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 permintaan Anda dari baris perintah MySQL atau alat seperti phpMyAdmin. Jika Anda memiliki kesalahan sintaks dalam permintaan Anda ini akan memberi tahu Anda apa itu.

  • Pastikan kutipan Anda sudah benar. Kutipan yang hilang di sekitar kueri atau nilai dapat menyebabkan kueri gagal.

  • Pastikan Anda melarikan diri dari nilai-nilai Anda. Kutipan di kueri Anda dapat menyebabkan kueri gagal (dan juga membiarkan Anda terbuka untuk injeksi SQL). Menggunakan mysql_real_escape_string() untuk menghindari masukan Anda.

  • Pastikan Anda tidak bercampur mysqli_* dan mysql_* fungsi. Mereka bukan hal yang sama dan tidak bisa digunakan bersama. (Jika Anda akan memilih satu atau yang lain dengan tongkat mysqli_*. Lihat di bawah untuk alasannya.)

Tips lainnya

mysql_* fungsi tidak boleh digunakan untuk kode baru. Mereka tidak lagi dipertahankan dan komunitas telah memulai proses depresiasi. Sebaliknya, Anda harus belajar pernyataan siap dan gunakan juga PDO atau MySQLi. Jika Anda tidak bisa memutuskan, artikel ini akan membantu memilih. Jika Anda peduli untuk belajar, ini dia tutorial PDO yang bagus.


159
2017-07-26 17:00



Kesalahan terjadi di sini adalah karena penggunaan tanda kutip tunggal ('). Anda dapat memasukkan kueri seperti ini:

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

Itu menggunakan mysql_real_escape_string untuk pencegahan injeksi SQL. Meskipun kita harus menggunakan ekstensi MySQLi atau PDO_MYSQL untuk versi PHP yang ditingkatkan (PHP 5.5.0 dan yang lebih baru), tetapi untuk versi yang lebih lama mysql_real_escape_string akan melakukan trik.


106
2018-06-04 10:24



Sebagai scompt.com dijelaskan, kueri mungkin gagal. Gunakan kode ini untuk mendapatkan kesalahan permintaan 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 untuk mysql_query() untuk informasi lebih lanjut.

Kesalahan sebenarnya adalah tanda kutip tunggal sehingga variabel $username tidak diurai. Tetapi Anda harus benar-benar menggunakannya mysql_real_escape_string($username) untuk menghindari injeksi SQL.


59
2018-06-04 10:31



Taruh tanda kutip $username. Nilai string, yang bertentangan dengan nilai numerik, harus diapit tanda kutip.

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

Juga, tidak ada gunanya menggunakan LIKE kondisi jika Anda tidak menggunakan wildcard: jika Anda memerlukan penggunaan pencocokan tepat = dari pada LIKE.


53
2018-06-04 10:22



Silakan periksa setelah database yang dipilih tidak karena beberapa kali database tidak dipilih

Memeriksa

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

sebelum kueri MySQL dan kemudian lanjut ke langkah berikutnya

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

f($result === FALSE) {
    die(mysql_error());

43
2018-04-25 05:14



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 waktu kesalahan dalam kueri. Sisa kode sudah benar.


40
2018-06-04 11:28



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

Anda mendefinisikan string menggunakan tanda kutip tunggal dan PHP tidak mengurai string kutipan terbatas tunggal. Untuk memperoleh interpolasi variabel, Anda perlu menggunakan tanda kutip ganda ATAU penggabungan string (atau kombinasi dari). Lihat http://php.net/manual/en/language.types.string.php untuk informasi lebih lanjut.

Juga Anda harus memeriksa bahwa mysql_query mengembalikan sumber daya hasil yang valid, jika tidak fetch_ *, num_rows, dll tidak akan bekerja 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.


35
2018-01-08 03:48