所以我需要通过查看一个字段从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]
但是这意味着它打破了我在这里的“和”链,并且需要在每个“或”中重复[更多地方......] ......这一定是错的,我一直在盯着这已经太久了。
有什么想法吗?
答案 0 :(得分: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();
注意到上面的代码没有经过测试,并且可能会引发警告(可能是由于引用问题而导致的),但它会给你一个想法。
另请查看this comment以获取可变数量变量绑定解决方案。