web-dev-qa-db-ja.com

プリペアドステートメント-行数

プリペアドステートメントについて学び、複数行の結果を生成するクエリを操作しようとしています。今、私は行数を決定し、その数をhtmlに表示する方法を理解しようとしています。

私の準備したステートメントは次のようになります。

if($stmt = $mysqli -> prepare("SELECT field1, field2, field3 FROM table WHERE id= ?ORDER BY id ASC")) 
    {
    /* Bind parameters, s - string, b - blob, i - int, etc */
    $stmt -> bind_param("i", $id);
    $stmt -> execute();

    /* Bind results */
    $stmt -> bind_result($testfield1, $testfield2, $testfield3);

    /* Fetch the value */
    $stmt -> fetch();

    /* Close statement */
    $stmt -> close();
   }

最初に結果を保存してから、次のようにnum_rowsを使用することになっていることを理解しています。

$stmt->store_result();
$stmt->num_rows;

しかし、私は実行中であり、そのコードをそこに置くとページがバグアウトする問題が発生します。行数を表示する方法の次のステップに進むことさえできませんでした

したがって、問題は次のとおりです。プリペアドステートメント内の行数の計算に関して何が欠けているのでしょうか。それでは、<?php echo '# rows: '.$WHATGOESHERE;?>でどのように表示しますか。

ありがとう!

11
Kevin

num_rowsは数値を返します。変数に格納する必要があります。

/*.....other code...*/
$numberofrows = $stmt->num_rows;
/*.....other code...*/

echo '# rows: '.$numberofrows;

したがって、完全なコードは次のようになります。

if($stmt = $mysqli -> prepare("SELECT field1, field2, field3 FROM table WHERE id= ? ORDER BY id ASC")) 
    {
    /* Bind parameters, s - string, b - blob, i - int, etc */
    $stmt -> bind_param("i", $id);
    $stmt -> execute();

    /* Bind results */
    $stmt -> bind_result($testfield1, $testfield2, $testfield3);

    /* Fetch the value */
    $stmt -> fetch();
    $numberofrows = $stmt->num_rows;

    /* Close statement */
    $stmt -> close();
   }
echo '# rows: '.$numberofrows;
16
Kevin Pei

データの実際の行ではなく行数のみに関心がある場合は、エラーチェックポイントとSELECT句で推奨されるCOUNT(*)呼び出しを備えた完全なクエリブロックを次に示します。

_if (!$conn = new mysqli("Host", "user", "pass", "db")) {
    echo "Database Connection Error: " , $conn->connect_error;  // don't show this to the public
} else {
    if (!$stmt = $conn->prepare("SELECT COUNT(*) FROM `table` WHERE id= ?")) {
        echo "Prepare Syntax Error: " , $conn->error;  // don't show this to the public
    } else {
        if (!$stmt->bind_param("s", $id)              // if trouble while binding to ? placeholder
            || !$stmt->execute()                      // or if trouble while executing
            || !$stmt->bind_result($num_rows)         // or if trouble while binding to $num_rows
            || !$stmt->fetch()) {                     // or if trouble while fetching the one row.
            echo "Statement Error: " , $stmt->error;  // don't show this to the public
        }else{
            echo $num_rows;
        }
        $stmt->close();                               // no longer need statement
    }
    $conn->close();                                   // no longer need connection
}
_

または、行を反復/処理する前に行数を知りたい場合、1つの方法は、結果セット全体(多次元配列)を変数にまとめて、count()/sizeof()を呼び出すことです。繰り返す前に。

_if (!$conn = new mysqli("Host", "user", "pass", "db")) {
    echo "Database Connection Error: " , $conn->connect_error;
} else {
    if (!$stmt = $conn->prepare("SELECT field1, field2, field3 FROM table WHERE id= ? ORDER BY id ASC")) {
        echo "Prepare Syntax Error: " , $conn->error;
    } else {
        if (!$stmt->bind_param("s", $id)
            || !$stmt->execute()
            || !$result = $stmt->get_result()) {
            echo "Statement Error: " , $stmt->error;
        }else{
            $resultset = $result->fetch_all(MYSQLI_ASSOC);
            echo "<div>Num: " , sizeof($resultset) , "</div>";
            foreach ($resultset as $row) {
                echo "<div>Row: {$row['field1']} & {$row['field2']} & {$row['field3']}</div>";  // do what you like
            }
        }
        $stmt->close();
    }
    $conn->close();
}
_

*ローカルホストで成功するために、上記の両方のスニペットをテストしました。

1
mickmackusa

これは2020年2月の時点で機能します:

$number_of_records = $stmt->rowCount();
echo $number_of_records;

php.netマニュアルから:

PDOStatement :: rowCount()は、DELETE、INSERT、またはUPDATEステートメントの影響を受ける行数を返します。

ここに彼らのウェブサイトからの があります:

<?php
/* Delete all rows from the FRUIT table */
$del = $dbh->prepare('DELETE FROM fruit');
$del->execute();

/* Return number of rows that were deleted */
print("Return number of rows that were deleted:\n");
$count = $del->rowCount();
print("Deleted $count rows.\n");
?>

上記の例は次のように出力します。

Return number of rows that were deleted:
Deleted 9 rows.
0
Devner