0

サイト ユーザーは検索フォームを使用して、製品のデータベースにクエリを実行します。入力したキーワードで、データベース内の製品のタイトルを検索します。

    public function startSearch($keywords){
        $keywords = preg_split('/[\s]+/', $keywords);
        $totalKeywords = count($keywords);

        foreach($keywords as $key => $keyword){
            $search .= '%'.$keyword.'%';
            if($key != ($totalKeywords)-1){
                $search .= ' AND itemTitle LIKE ';
            }
        }
$sql=$this->db->prepare("SELECT * FROM prodsTable WHERE itemTitle LIKE ?");
$sql->bindParam(1, $search);        
$sql->execute ();
$sql->fetchALL(PDO::FETCH_ASSOC);

ユーザーが単一のキーワードを入力した場合は検索が機能しますが、複数のキーワードが使用された場合、クエリは実行されません。

if: $keywords = 'Apple iPod'; $search = '%apple% AND itemTitle LIKE %ipod%';

したがって、準備されたステートメントは次のようになります。

「SELECT * FROM prodsTable WHERE itemTitle LIKE %apple% AND itemTitle LIKE %ipod%」

タイトルに「apple」と「ipod」の両方が含まれる 2 つの製品が返される場合、結果は返されません。

私は何を間違っていますか?

4

1 に答える 1

8

準備済みステートメントは SQL インジェクションから保護するため、パラメーター内の SQL コードは解釈されません。 AND itemTitle LIKE ?prepare() を呼び出す前に、正しい数の SQL クエリを作成する必要があります。

  $keywords = preg_split('/[\s]+/', $keywords);
  $totalKeywords = count($keywords);
  $query = "SELECT * FROM prodsTable WHERE itemTitle LIKE ?";

  for($i=1 ; $i < $totalKeywords; $i++){
    $query .= " AND itemTitle LIKE ? ";
  }

  $sql=$this->db->prepare($query);
  foreach($keywords as $key => $keyword){
    $sql->bindValue($key+1, '%'.$keyword.'%');
  }
  $sql->execute ();
于 2012-11-04T00:54:29.567 に答える