2016-09-08 10 views
2

他のチュートリアルは行を数えますが、特定の行を数えずに特定の結果を得るには$row[scope]です。これはどうすればできますか?関数内のPDOで特定の行を数えるにはどうすればよいですか?

function counting(){ 
$query = "SELECT * 
      FROM  table"; 

$result->fetchAll($sql, $params); 
$num_rows = count($result); 

$counter = 0; 

    //while($row = mysql_fetch_array($result)){ //old code 
    foreach($result as $row){ 
     if($row[scope] == "all"){ 
      $counter++; 
     } 
    } 
    $return = ($counter > 0)?TRUE:FALSE; 
} 

protected function fetchAll($sql, $params) 
{ 
    $stmt = $this->dbh->prepare($sql); 
    $stmt->execute($params); 
    return $stmt->fetchALL(DatabaseAdapter::FETCH_ASSOC); 
} 
+2

でwhileループを必要としませんなぜあなたはそれを行うためにSQL言語を使用しないのですか?このケースでは、それは仕事のための非常に適切なツールです。 (例えば) 'SELECT * FROM table where scope = 'all';' - その時点でPHPをフィルタリングする必要はありません –

+0

これは、関数内の約5つの異なる行の単なる一片です私はそれを簡単にしましたが)、私は基礎を知りたいと思っていました。 –

+3

基本的なことは、sqlが100倍速くできるようにすることです。 'select count(*)from theCount from myTable from scope = 'all'' – Drew

答えて

2

これには2つの機能が必要です。

fetchAll()の代わりに、PDOStatementを必須とするクエリを実行するための汎用関数が必要です。それは、コードを変更することなく、あなたはfetchAll()関数とまったく同じように動作しますが、場合にあなたが明示的にそれから配列を取得する必要があり、ほとんどの場合、

protected function sql($sql, $params) 
{ 
    $stmt = $this->dbh->prepare($sql); 
    $stmt->execute($params); 
    return $stmt; 
} 

は、いつでも取り付けることができますfetchAllの()の呼び出しに:

$result = $this->sql($sql, $params)->fetchAll(); 

そして、あなたが必要とする第二の機能は、実際のカウントのためにある:あなたがこのような機能を使用して

function counting($value) 
{ 
    $query = "SELECT count(*) FROM table WHERE scope = ?"; 
    return $this->sql($sql, [$value])->fetchColumn(); 
} 

任意の範囲についてカウント(または存在を検出)することができます。

返されたPDOStatementのおかげで、配列の代わりに別のタイプの結果、スカラー値が得られることに注意してください。

アップグレードのループが時々痛みをすることができますが....

あなたが見

、SQLおよびPDOが正しくを使用ているとき、あなたはほとんど、ちょっとすべて

+0

だから、データベースを2回ヒットする必要があります。これはこれを明確にするのに役立ちました。他のユーザーにはこれを見てfethColumnを修正してください。 :) –

+0

申し訳ありませんが、なぜ2回ですか? –

+0

申し訳ありませんが、このロジックを別の関数内でカウントする機能に使用しましたが、質問自体には追加しませんでした。あなたはあなたのロジックで正しいです! –

関連する問題