sql >> データベース >  >> RDS >> Mysql

mysql_query()がSELECTステートメントでTRUEを返すのはなぜですか?

    webbiedaveが正しい方向に進んでいない場合、phpソースでこの状況を可能にするコードパスは1つだけです:

    #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
        }
    }
    

    これはバグだと思います。特にこれを確認する実際の方法がないため、PHPコードのmysql_num_fieldsは、接続ではなく、取得していないリソースを使用します。

    Cバージョンのmysql_queryが接続が失われたときにゼロを返すのはまだ奇妙ですが、可能であれば、次のパッチを試して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. PostgreSQLでピボットテーブルを作成する方法

    2. PHP:星評価システムのコンセプト?

    3. SQLServerで重複する行を削除する

    4. PHP Laravel:ターゲットマシンが積極的に拒否したため、接続できませんでした