0

(MySqlテーブルで)PDOを使用してアイテムの数を取得しようとしています。私はどこかでrowCountがMySqlで機能しないことを読みました。これは正しいです?

これまでのところ、count = 0を取得し続けているため、確実に機能させることはできません。

毎回データベースに戻らないようにするためのアイデアを誰かに教えてもらえますか?これに似たクエリが複数あります。

    $items = $con -> prepare("SELECT * FROM item_descr ORDER BY $sortBy DESC");
    $count = $items -> rowCount();
    $items -> execute();
while($info = $items->fetch(PDO::FETCH_ASSOC)) { ... }

余分なクエリを避けたいSELECT COUNT (*)

ありがとう!

4

7 に答える 7

7

最初 executeにクエリを実行する必要があります。そうして初めてデータベースはその作業を行い、その場合にのみ、見つかった結果のカウントを取得できます。

于 2012-08-23T15:24:57.693 に答える
2

@decezeが示したように、

$items = $con -> prepare("SELECT * FROM item_descr ORDER BY $sortBy DESC");
$items -> execute();
$count = $items -> rowCount();
while($info = $items->fetch(PDO::FETCH_ASSOC)) { ... }
于 2012-08-23T15:27:50.460 に答える
1

rowCountの後にのみ機能しexecuteます。rowCountMySQLで問題が発生したことはありません。

を使用するrowCountのは良いことですが、とにかく結果を反復処理する場合は、独自のカウンター変数を使用することもできます。

于 2012-08-23T15:25:26.040 に答える
1

これを追加するだけで、PHPのドキュメントを参照してください。

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

特に:

ほとんどのデータベースでは、PDOStatement :: rowCount()はSELECTステートメントの影響を受ける行数を返しません。代わりに、PDO :: query()を使用して目的のSELECTステートメントと同じ述語でSELECT COUNT(*)ステートメントを発行し、次にPDOStatement :: fetchColumn()を使用して返される行数を取得します。その後、アプリケーションは正しいアクションを実行できます。

そして、上記のページからの例:

<?php
$sql = "SELECT COUNT(*) FROM fruit WHERE calories > 100";
if ($res = $conn->query($sql)) {

    /* Check the number of rows that match the SELECT statement */
  if ($res->fetchColumn() > 0) {

        /* Issue the real SELECT statement and work with the results */
         $sql = "SELECT name FROM fruit WHERE calories > 100";
       foreach ($conn->query($sql) as $row) {
           print "Name: " .  $row['NAME'] . "\n";
         }
    }
    /* No rows matched -- do something else */
  else {
      print "No rows matched the query.";
    }
}

$res = null;
$conn = null;
?>
于 2012-10-30T20:30:05.350 に答える
0

PDOを使用している場合は、次のようにコードを大幅に簡略化できます。

$items = $conn->query("SELECT * FROM item_descr ORDER BY $sortBy DESC")->fetchAll(PDO::FETCH_ASSOC);

if(count($items))
{
    // You can count the array to see how many records you got and you can iterate trough it using foreach / for loops 
}
else 
{
    // 0 records returned
}

この特定のケースでは、プリペアドステートメントや、を使用して行が戻ったかどうかを確認する必要はありませんrowCount。MySQLでも失敗する可能性があるのは事実です。それはrowCountすべて、バッファリングされていないクエリを使用しているかどうかによって異なります。

于 2012-08-23T15:32:26.987 に答える
-1

これは私のために働きます:

$my_query = $db->query('SELECT COUNT(*) AS Count FROM the_table');
$c = $my_query->fetch(PDO::FETCH_OBJ);

return $c->Count;
于 2014-01-31T07:44:15.220 に答える
-1

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

ほとんどのデータベースでは、PDOStatement :: rowCount()はSELECTステートメントの影響を受ける行数を返しません。代わりに、PDO :: query()を使用して目的のSELECTステートメントと同じ述語でSELECT COUNT(*)ステートメントを発行し、次にPDOStatement :: fetchColumn()を使用して返される行数を取得します。その後、アプリケーションは正しいアクションを実行できます。

于 2014-06-16T07:18:09.560 に答える