6

コード例;

$stmt = $db->prepare('SELECT u.username, u.display_name FROM users u WHERE u.id = :userId');
$stmt->bindValue(':userId', 10);
$stmt->execute();

準備->実行を使用します。クエリが最大1行を返すことが確実な場合。クエリが行を返したかどうかを確認する簡単な方法はありますか?全員が「rowCount」で検証しているのがわかりますが、よりクリーンな方法はありませんか?

この記事:http : //www.christiansouth.com/php/pdo-getting-started-part-2-pdostatement/states;

クエリが成功した場合はTRUE、失敗した場合はFALSE。ここでつまずくのは、SQLにエラーがある場合にのみFALSEを返すことです。したがって、SQLは有効であるが行セットを返さない場合でも、TRUEの戻り値が得られます。

このステートメントは正しいですか?php.netは以下についてのみ話しているので:

成功した場合はTRUEを返し、失敗した場合はFALSEを返します。

だから、もう一度質問をまとめます:

  • $ stmt(上記の例)をブール値として使用して行が返されたかどうかを検証できないのは本当ですか?
  • ifでラップされた「rowCount」よりもきれいに見えるこれに対する解決策はありますか?
4

3 に答える 3

5

結果セットを使用します(つまりfetch):行があったかどうか?

0レコードの結果セットは、「機能しましたか」という点ではまだ完全に有効であり、有効なクエリが実行されるたびexecuteにTRUEが返されるのはそのためです。この場合、FALSEは例外条件としてのみ扱われる必要があります。

一方、(最初の)結果はfetch、クエリが0..1行のみを返すという知識と組み合わせて、単一の行がフェッチされたかどうかを判断するために使用できます。これは、このようなクエリのデータにアクセスするための「標準的な」方法であるため、追加のチェックを実行する必要はありません。

于 2012-11-15T02:35:44.817 に答える
2

mysqlを使用している限り、rowCountは、別のクエリを実行しなくても、結果セット内の数値を提供します。他のデータベースはrowCountを正確にサポートしていない可能性があるため、最初に個別のselect count(*)...クエリを実行する必要があります。

実行時にのみtrueまたはfalseを取得するかどうかについては、行を返さないクエリの場合でも、絶対にtrueになります。これは、関係理論では、空の結果セットが完全に有効であり、行のない選択はエラーではないためです。

于 2012-11-15T02:22:52.523 に答える
-3

exec();を使用します。

PHPマニュアルから:

PDO :: exec()は、発行したSQLステートメントによって変更または削除された行の数を返します。影響を受けた行がない場合、PDO :: exec()は0を返します。

http://php.net/manual/en/pdo.exec.php

于 2013-10-02T14:38:40.550 に答える