3

PHPv。5.2.14およびPDO-MySQL拡張機能を使用します。

プリペアドステートメントは初めてです。検索フォーム(ユーザー入力)と「Xが好きなすべてのXを選択...」という種類の実用的なクエリを作成する必要があります。

コードと結果:

$sql = 'SELECT COUNT(*) as num_books from t_books where title LIKE :search_term';
// Later access as num_books
$prep = $dbh->prepare($sql);
$num = $prep->execute(array(':search_term' => '%'.$search_term. '%'));
$total=$num->fetchColumn();

$ prepのVarダンプ:object(PDOStatement)#2(1){["queryString"] => string(58) "SELECT COUNT(*)from t_books where title LIKE:search_term"}

致命的なエラー:非オブジェクトでのメンバー関数fetchColumn()の呼び出し

$ prepがオブジェクトの場合、$numはオブジェクトである必要があります。しかし、それはブール値(true)です。ここで何が起こったのですか?

しかし、もっと重要なのは、どうすればカウントできますか?

PDO-で行数を読み取りました。プリペアドステートメントが必要なため、そこにある提案はうまくいきません。ユーザー入力があります。

ご協力いただきありがとうございます。

4

1 に答える 1

5

PDOStatement::execute()成功または失敗を示すブール値のみを返すため、変数$numはフェッチしたいものではありません。結果をに割り当てることにより$num、オブジェクトを割り当てるの$prepではなく、メソッド呼び出しの戻り値のみをexecute()TRUE)に割り当てることになります。

代わりに、fetchColumn()から$prep、PDOStatementオブジェクト。

$num = $prep->execute(array(':search_term' => '%'.$search_term. '%'));
if ($num) {
  $total = $prep->fetchColumn();
}

それを超えると、SQLは正しく実行され、SQLが返す1つの列に必要なカウントが含まれている必要があります。

この場合(特にfetchColumn()引数なしで呼び出しているため)、それは問題ではありませんが、将来の読者のためCOUNT()に、アソシエートまたはオブジェクトフェッチで使用できるエイリアスを使用してアグリゲートに名前を付けることをお勧めします。

$sql = 'SELECT COUNT(*) AS num_books from t_books where title LIKE :search_term';
// Later access as num_books
于 2012-08-22T20:30:48.367 に答える