1

私は古いmysql_XサイトをPDOで動作するように変換している最中であり、これまでのところ、とても良いです(私は思います)。ただし、クエリの結果をカウントする信頼性について質問があります。

現在、私はすべてをこのように進めています(これを読みやすくするために、try / catchエラーコードを削除しました):

$stm = $db->prepare("SELECT COUNT(*) FROM table WHERE somevar = '1'");
$stm->execute();
$count = $stm->fetchColumn();

if ($count > 0){
    $stm = $db->prepare("SELECT * FROM table WHERE somevar = '1'");
    $stm->execute();
    $result = $stm->fetchAll();
}

この方法でそれを行うことには愚かな問題があるかもしれません、そして私はあなたにそれがあるかどうか教えてください、しかし私の質問は本当にデータベースクエリを減らすことについてです。最初のステートメントを切り取り、2番目のステートメントを単独で実行し、PHPのcount()を使用して結果をカウントすると、次のように1つのクエリだけで信頼できる行カウントが得られるようです。

$stm = $db->prepare("SELECT * FROM table WHERE somevar = '1'");
$stm->execute();
$result = $stm->fetchAll();

$count = count($result);
if ($count > 0){
    //do whatever
}

代わりにこの方法でそれを行うことの落とし穴はありますか?信頼できますか?そして、ここで私のPDOに明白で愚かな間違いはありますか?助けてくれてありがとう!

4

4 に答える 4

2

特にカウント値が関心のある唯一の結果である場合は、MySQLでカウントを実行することをお勧めします。バージョンを同等の質問「食料品店にはチョコレートバーの在庫がいくつありますか?」と比較してください。

1)データベースで数える:SELECT count(*) ....店まで車で行き、チョコレートバーを数え、番号を書き留め、家に帰り、紙片から番号を読みます

2)PHPでカウント:SELECT * ...。店まで車で行きます。すべてのチョコレートバーを購入します。それらを家にトラックします。あなたの居間の床でそれらを数えなさい。結果を一枚の紙に書きます。チョコレートバーを捨てる。紙から番号を読みます。

どちらがより効率的/低コストですか?db / tableにレコードが数個しかない場合は、大したことではありません。数千/数百万のレコードに到達し始めると、バージョン2)は絶対にばかげており、帯域幅を使い果たし、PHPのメモリ制限を超え、CPU使用率を成層圏に追いやる可能性があります。

そうは言っても、2つのクエリを実行しても意味がありません。1つは、取得できるレコードの数を数えるだけです。このようなシステムは、競合状態に対して脆弱です。たとえば、カウントを行い、(たとえば)1つのレコードを取得します。2番目のクエリを実行してそのレコードをフェッチするまでに、他の並列プロセスが実行されて別のレコードが挿入されたか、必要なレコードが削除されました。

于 2013-01-18T18:25:23.170 に答える
0

最初のケースではMYSQLを使用してカウントし、2番目のケースではPHPを使用してカウントしています。どちらも本質的に同じ結果です。

于 2013-01-18T18:13:08.073 に答える
0

クエリの使用法は正しいです。COUNT(*)とcount($ result)が異なるため、LIMITを使用すると唯一の問題が発生します。

COUNT(*)は、クエリが返すすべての行をカウントします(カウントクエリが同じであり、LIMITを使用していない場合)

count($ result)は返された行だけをカウントするため、LIMITを使用すると、指定された制限までの結果が得られます。

于 2013-01-18T18:13:22.320 に答える
0

はい、このユースケースでは信頼できます。

于 2013-01-18T18:14:05.120 に答える