SELECTステートメントを使用する場合、PDOはデータベース内の行数を返すことができますか? また、php は名前付きパラメータをサポートしていますか?
4 に答える
SELECTステートメントを使用する場合、PDOはデータベース内の行数を返すことができますか?
db からのデータの選択に制限はありません。
PDO は、テーブル内の行数と、データベースから選択したいその他の情報を返すことができます。選択するだけです。そして、あなたは何の問題もなくそれを手に入れるでしょう。それで全部です。
SELECTステートメントを使用する場合、PDOはデータベース内の行数を返すことができますか?
混乱は、マニュアルの次の文に起因すると思います。
関連する PDOStatement によって実行された最後の SQL ステートメントが SELECT ステートメントであった場合、一部のデータベースは、そのステートメントによって返された行数を返すことがあります。ただし、この動作はすべてのデータベースで保証されているわけではなく、移植可能なアプリケーションに依存するべきではありません。
この機能をサポートする、またはサポートしないのはデータベースです。ステートメントを発行すると、 [いくつかの条件に従って] テーブルSELECT * FROM foo ...
内のすべてのデータを取得したいことをデータベースに伝えます。foo
ここで重要なのはdataです。データベースは、そのテーブルのすべてのデータを評価して、要求したものを返します。これはいくつかのインデックスによって助けられるかもしれないし、助けられないかもしれません。これは非同期的に起こるかもしれませんし、そうでないかもしれません。データベースは、それが提供できる結果の数を知らないかもしれません。これはすべて、データベースの内部に依存します。ストレージの形式によっては、実際にすべての結果をフェッチするまで、データベースが結果の数を認識できない場合があります。
したがって、 を呼び出すと、データベースによってPDOStatement::rowCount
結果が正確である場合とそうでない場合があります。PDO API は、データベースが提供するものをすべて公開するだけです。PDO はさまざまなデータベースと対話するために使用できるため、その機能は正確にどのデータベースと対話しているかによって異なります。
また、php は名前付きパラメータをサポートしていますか?
PHP ?! はい、PHP には、名前付きパラメーターを使用したパラメーター化されたクエリをサポートする多くのデータベース APIがあります。PDOはその中にあります。
次の例は、PDO で選択または影響を受けた行を取得する方法を示しています。
<?php
$selectsql = $database->prepare('SELECT * FROM table');
$selectsql->execute();
$count = $selectsql->rowCount();
?>
また
<?php
$selectsql = $database->prepare('SELECT COUNT(*) FROM table');
$selectsql->execute();
?>
名前付きパラメータについて
https://wiki.php.net/rfc/namedparameters
名前付きパラメータは、長年にわたって何度も取り上げられてきたトピックです。長所と短所はさまざまな電子メールに記録されており、(明らかに) この機能はサポートされておらず、実装されていません。トピックは絶えず再提起され、現在 PHP には RFC プロセスがあるため、議論は RFC に記録する必要があります (これはまだ行われていないことに注意してください)。同じ議論を再検討する必要はありません。
しかし、私はそれをシミュレートするいくつかの方法を見つけました:
MySQL ドライバーを使用する場合、これらのコードは同等です。
// using rowcount
$stmt = $pdo->prepare('SELECT * from `foo` WHERE `bar` = :bar');
$stmt->execute(array('bar' => 'bar'));
$count = $stmt->rowCount();
// using a COUNT query
$stmt = $pdo->prepare('SELECT COUNT(1) from `foo` WHERE `bar` = :bar');
$bar = 'bar';
$stmt->bindParam('bar', $bar);
$stmt->execute();
$count = $stmt->fetchColumn();
また、クエリで名前付きプレースホルダーを使用することも示しました (これは完全に可能です)。
最初のコードはおそらく別の DBMS では動作しませんが、2 番目のコードは動作します。