Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Tại sao mysql_query () trả về TRUE với câu lệnh SELECT?

Nếu webbiedave không đi đúng hướng, chỉ có một đường dẫn mã cho phép tình trạng này xảy ra trong nguồn 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
    }
}

Tôi sẽ coi đây là một lỗi. Đặc biệt là vì không có cách thực sự nào để xác minh điều này - mysql_num_fields trong mã PHP sử dụng tài nguyên mà bạn không nhận được chứ không phải kết nối.

Mặc dù vẫn còn kỳ lạ khi phiên bản C của mysql_query trả về 0 khi mất kết nối - nếu bạn có thể làm vậy, hãy thử bản vá sau và cài đặt lại tiện ích mở rộng 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. Chuyển đổi ngày giờ JS thành ngày giờ MySQL

  2. Sao lưu lượt xem với Mysql Dump

  3. Kiểm tra xem một hàng có tồn tại hay không bằng cách sử dụng API mysql_ * cũ

  4. Chỉ mục MySQL cho MIN và MAX

  5. mysql - CẬP NHẬT hàng dựa trên các hàng khác