Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Mengapa mysql_query() mengembalikan TRUE dengan pernyataan SELECT?

Jika webbiedave tidak berada di jalur yang benar, hanya ada satu jalur kode yang memungkinkan situasi ini di sumber php:

#if MYSQL_VERSION_ID < 32224
#define PHP_MYSQL_VALID_RESULT(mysql)       \
    (mysql_num_fields(mysql)>0)
#else
#define PHP_MYSQL_VALID_RESULT(mysql)       \
    (mysql_field_count(mysql)>0)
#endif

...

if (!mysql_result) {
    if (PHP_MYSQL_VALID_RESULT(mysql->conn)) { /* query should have returned rows */
        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to save result set");
        RETURN_FALSE;
    } else {
        RETURN_TRUE; // <<< this case
    }
}

Saya akan menganggap ini bug. Terutama karena tidak ada cara nyata untuk memverifikasi ini - mysql_num_fields dalam kode PHP menggunakan sumber daya yang tidak Anda dapatkan, bukan koneksinya.

Meskipun masih aneh bahwa mysql_query versi C mengembalikan nol pada koneksi yang hilang - jika Anda bisa, coba patch berikut dan instal ulang ekstensi mysql:

Index: ext/mysql/php_mysql.c
===================================================================
--- ext/mysql/php_mysql.c       (revision 311719)
+++ ext/mysql/php_mysql.c       (working copy)
@@ -1485,6 +1485,9 @@
                if (PHP_MYSQL_VALID_RESULT(mysql->conn)) { /* query should have returned rows */
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to save result set");
                        RETURN_FALSE;
+               } else if( mysql_errno(mysql->conn) != 0 ) {
+                       php_error_docref("http://www.mysql.com/doc" TSRMLS_CC, E_WARNING, "%s", mysql_error(mysql->conn));
+                       RETURN_FALSE;
                } else {
                        RETURN_TRUE;
                }


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL TIDAK DALAM permintaan

  2. Menghitung jumlah baris yang dikelompokkan di mysql

  3. MySQL CURRENT_TIMESTAMP saat membuat dan memperbarui

  4. Cara mereset AUTO_INCREMENT di MySQL

  5. Kotak centang formulir PHP dan indeks tidak terdefinisi