Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Dlaczego mysql_query() zwraca TRUE z instrukcją SELECT?

Jeśli webbiedave nie jest na dobrej drodze, istnieje tylko jedna ścieżka kodu, która pozwala na taką sytuację w źródle 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
    }
}

Uznałbym to za błąd. Zwłaszcza, że ​​nie ma prawdziwego sposobu, aby to zweryfikować — mysql_num_fields w kodzie PHP wykorzystuje zasób, którego nie otrzymujesz, a nie połączenie.

Chociaż nadal dziwne jest to, że mysql_query w wersji C zwraca zero w przypadku utraty połączenia - jeśli możesz, wypróbuj następującą łatkę i ponownie zainstaluj rozszerzenie 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. Jak sprawić, by mysqli działał z DELIMITERami w instrukcjach SQL?

  2. Jak uzyskać rekordy między 2 datami w MySQL?

  3. Normy dotyczące dodawania daty/godziny?

  4. Włącz Entity Framework 6 dla MySql (C#) w WinForms Microsoft Visual Studio 2013

  5. Ostrzeżenie:mysqli::mysqli():(HY000/1045):Odmowa dostępu dla użytkownika 'database'@'localhost' (przy użyciu hasła:NIE) w