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

MySQLiプリペアドステートメントを使用すると、行数を取得してフェッチできません

    mysqli_stmt::$num_rowsを使用する場合 (つまり、プリペアドステートメントの行数を確認します)、$stmt->store_result()を使用する必要があります プリペアドステートメントを実行した後、行数を確認できるようになります。つまり、返された行数を確認する前に、結果がメモリに保存されます。

    $stmt = $conn->prepare($sql);
    $stmt->bind_param('ss',$log_username,$log_username);
    $stmt->execute();
    $stmt->store_result(); // Need to store the result into memory first
    if ($stmt->num_rows) {
        // ...
    

    ただし、mysqli_result::$num_rowsを使用する場合 (ステートメントの結果から変換するMySQLi-resultで)、$result = $stmt->get_result();を実行した後にそれを行う必要があります 、$result->num_rows;を使用します 、以下のように。

    $stmt = $conn->prepare($sql);
    $stmt->bind_param('ss',$log_username,$log_username);
    $stmt->execute();
    $result = $stmt->get_result();
    if ($result->num_rows) {
        while ($row = $result->fetch_assoc()) {
        // ....
    

    結局、それらは両方とも同じことをすることになります-元の準備されたクエリによって返される行の数を提供します。


    store_result()は使用できないことに注意してください。 およびget_result() 同じステートメントで。つまり、最初の例では、(get_result()を使用してmysqli-resultオブジェクトに変換することはできません。 、これにより、標準のfetch_assoc()を使用できます。 方法)。 store_result()として 結果をメモリに保存します。get_result()には何もありません 変換する、またはその逆。

    これは、store_result()を使用する場合を意味します 、ステートメントフェッチ、mysqli_stmt::fetch()を介してフェッチする必要があります mysqli_stmt::bind_result()を介して結果をバインドします 。 get_result()を使用する場合 、結果のMySQLi-resultオブジェクトの行数を確認する必要があります(2番目の例を参照)。

    そのため、そのうちの1つだけを使用する必要があるようにコードを作成する必要があります。

    そうは言っても、affected_rowsを使用する コメントで提案されているように、このジョブに適したツールではありません-mysqli_stmt::$affected_rowsのマニュアルによると (同じことが通常のクエリmysqli::$affected_rowsにも当てはまります ):




    1. 2つのテーブルを結合するためのクエリ

    2. MySQLからJSONデータを取得する方法は?

    3. 12.2 RAC/GIの新機能

    4. System.Data.OracleClientには、Oracleクライアントソフトウェアバージョン8.1.7が必要です。