0

したがって、MySQLテーブルから1つのフィールドを調べてデータを選択し、そのフィールドに特定の単語が含まれているかどうかを確認し、動的に生成されるwhere句で他の多くのことを行う必要があります。

古いmysql拡張機能を使用していた昔は、これを実行していました。

select [bunch of stuff] left join [bunch of stuff] where
`field` rlike "(?=.*word1)(?=.*word2)(?=.*word3)..."
and [more where..] order by [order stuff]

もちろん、mysqliとプリペアドステートメントを使用します...

select [bunch of stuff] left join [bunch of stuff] where
match(`field`) against(?,?,?...)
and [more where..] order by [order stuff]

残念ながら、私はInnoDBテーブルを取得しました。これは、次のようなステートメントを連鎖させるフルテキスト検索がないことを意味します。

select [bunch of stuff] left join [bunch of stuff] where
`field` like concat("%",?,"%") or `field` like concat("%",?,"%") ...
and [more where..] order by [order stuff]

しかし、これは私がここに行っている「and」チェーンを壊し、すべての「or」で[もっとどこで..]繰り返す必要があることを意味します...これは間違っている必要があり、私もこれを見つめています長い間。

何か案は?

4

1 に答える 1

1

配列を使用してクエリを作成できます。

$sql="SELECT...WHERE ";
$cond=array();
$bind=array();
$subCond=array()
foreach($searchQuery as $txt) //assumed you have stored search query
{
    $subCond[]="`field` LIKE concat('%',?,'%')";
    $bind[]=$txt;
}
$cond[]="(".implode(" OR ",$subCond).")";
/*...continue to build conditions...*/
$sql.=implode(" AND ",$cond);
$sql.=" SORT BY ...";
$stmt=$mysqli->prepare($sql);
call_user_func_array(array($stmt,"bind_param"),array_merge(array(str_repeat("s",count($bind))),$cond));
$stmt->execute();

上記のコードはテストされておらず、警告が発生する可能性があることに注意してください(参照渡しの問題が原因で発生する可能性があります)が、アイデアは得られます。

また、変数番号変数バインディングのソリューションについては、このコメントを確認してください。

于 2013-02-25T05:54:00.750 に答える