mysqli准备正则表达式或其他方式

时间:2013-02-25 05:30:31

标签: php mysqli innodb sql-like

所以我需要通过查看一个字段从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]

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

有什么想法吗?

1 个答案:

答案 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以获取可变数量变量绑定解决方案。