0

所以我需要通过查看一个字段来从 MySQL 表中选择数据,看看它是否有某个单词,并在动态生成的 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]

但这意味着它打破了我在这里的“和”链,需要在每个“或”中重复[更多地方..]......这一定是错误的,我也一直在盯着这个现在很久了。

有任何想法吗?

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 回答