0

PDO を使用して mysql で検索を作成する方法について、Google で検索して多くのことを読みましたが、自分で検索を作成しようとしてもまだ失敗しています。

テーブルの 2 つのフィールドで同じキーワード セットを検索しています。

$str = explode(' ','app ban');
$p_id = 5;
$search_term = '';
$stmt = $db->prepare('SELECT id from the_table WHERE p_id=:p_id AND (name LIKE :search_term1 OR text LIKE :search_term2)');
$stmt->bindValue(':p_id',$p_id, PDO::PARAM_INT);
$stmt->bindValue(':search_term1',$search_term, PDO::PARAM_STR);
$stmt->bindValue(':search_term2',$search_term, PDO::PARAM_STR);
foreach($str as $key => $value)
{
    $search_term = '%'.$value.'%';
    $stmt->execute();
    while($row = $stmt->fetchObject())
    {
        if(!isset($res[$row->id]))
            $res[$row->id] = 0;
        $res[$row->id] = $res[$row->id] + 1*strlen($value);
    }
}
print_r($res);

名前とテキストの両方のいくつかのフィールドに文字列 'app' と 'ban' があるにもかかわらず、空の結果が得られます。phpmyadmin で同じ検索を行うと、多くの結果が得られます。

キーワードの前後にいくつかの引用符を追加してみました: '"%'.$value'%"'; 成功せずに。選択肢がなくなったような気がします。助けてください!

4

3 に答える 3

2

bindValue に関しては、上記の 2 つの回答は正しいです。値は、実行時に 1 回だけ解決されます。->execute() が発生したときに解決される bindParam を使用できます。

PHP bindParam マニュアルページに従って

PHP 変数を、ステートメントの準備に使用された SQL ステートメント内の対応する名前付きプレースホルダーまたは疑問符プレースホルダーにバインドします。PDOStatement::bindValue() とは異なり、変数は参照としてバインドされ、PDOStatement::execute() が呼び出されたときにのみ評価されます。

于 2013-02-20T23:44:17.383 に答える
1

$search_term = '';を定義しました。空の文字列にするには、bindValue を使用し、空の文字列の値を持つ同じ変数を使用しました。

割り当てようとしたループ内

$search_term = '%' . $value . '%'; 

ただし、既にバインドされているため、変更することはできません。あなたの移動

$stmt->bindValue(':search_term1',$search_term, PDO::PARAM_STR);
$stmt->bindValue(':search_term2',$search_term, PDO::PARAM_STR);

後の foreach ループ内

$search_term = '%' . $value . '%'; 
于 2013-02-20T23:32:59.830 に答える
0
  1. $search_term空白の文字列に設定します
  2. 両方の検索語を空白文字列としてバインドします
  3. 次に、 の値を再設定するループに入りますが、$search_term再バインドはしません。
  4. 次に、何らかの理由で、まだ #3 のループ内にある間に、クエリを実行して結果を取得します。
于 2013-02-20T23:33:16.960 に答える