2011-12-14 21 views
1

最近まで私はmysql_real_escape_string()を使用してデータベースにSQLクエリを作成する前にほとんどの変数を修正していました。友人は代わりに私はPDOの準備文を使うべきだと言ったので、それらについて少し読んだら、今私はそれらに切り替えるつもりです。Selectステートメントから効率的に行数を取得

これまでのところ、切り替え時に1つの問題が発生しました。これは、SELECTステートメントによって返される行数をカウントしています。場合によっては私のコードで、私はSQLクエリを実行し、SELECTステートメントから返された行の数を数えます。結果セットが返されたかどうかによって、私は別のアクションをとるでしょう。時々、私はそれから結果セットを使用する必要があります。 MySQLはmysql_num_rows()の後に直接mysql_fetch_assoc()に行きますが、問題はありません。しかし、PDOはmysql_num_rows()のようには見えません。

SQL文でCOUNT()を使用するか、またはPHPの関数count()を結果セットに使用するために、私に解決策を教えてくれたSOの回答を読んできました。 COUNT()は、結果セットにcount()を使用するとかなり非効率的であると言及している人がいますが、いくつかの場所で結果セットが必要ない場合はSQL文で正常に動作します。

私の質問は、選択した行の数を数えなければならない場合はどうしたらいいですか?結果にcount()を使用しているのはこの場合の唯一の方法ですか、より効率的な方法がありますか?

$query=mysql_query('SELECT ID FROM Table WHERE Name='Paul' LIMIT 1); 

if(mysql_num_rows($query)>0) 
{ 
    print_r(mysql_fetch_assoc($query)); 
} 
else 
{ 
    //Other code. 
} 

ありがとう:

以下は私の以前のSQLコードのようなものの短い例です。私はあなたが(私は必要なものを私に与えます)結果セットをカウントする前に文でfetchAll()を使用することを知っていますが、私はちょうど行うための最も効率的な方法を把握しようとしている

EDIT

もの。

答えて

2
$stmt->rowCount(); 

http://php.net/manual/en/pdostatement.rowcount.php

それを動作させるための行は(メモリにバッファ、または反復)フェッチしなければなりません。 pdoドライバがこれを自動的に行うように設定されていることは珍しいことではありません。

+0

マニュアルには、すべてのデータベースで機能しないと記載されています。私はそれを試して傷つけないだろうと思う、私はちょうど私のデータベースがおそらくそれで動作しないことを受け入れた。試してみましょう。 – Phillip

+0

それは、チップのおかげで、動作しました。 – Phillip

1

Count()を使用する必要があります。あなたは、あなたがCOUNT(ID)のようにそれを使用している場合、機能は全く非効率的ではありません

Count()

SELECT ID FROM Table WHERE Name='Paul' LIMIT 1 
select句でクエリを実行

そして、あなたがカウントを取得してい1

SELECT COUNT(ID) FROM Table WHERE Name='Paul' 

のような2つのクエリを実行するためにすることができますおそらくidがプライマリキーでインデックスを持っています。 MYSQLはテーブルにアクセスする必要もありません。

+0

したがって、1つのクエリではなく2つのクエリを実行し、結果セットを数えるのが効率的でしょうか? * EDIT * PHP関数 'count()'がSQL関数 'COUNT()'ではなく非効率であると言っていました。 – Phillip

+0

この例では、どちらの場合も結果を1要素に制限しています。だから、少なくともいくつかの点では、非常にうまくいくかもしれません。 – Jonathon

関連する問題