【问题标题】:mysqli prepared regular expression or other waymysqli准备正则表达式或其他方式
【发布时间】:2013-02-10 05:27:50
【问题描述】:

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

但这意味着它打破了我在这里的“和”链,需要在每个“或”中重复 [more where..]... 这一定是错误的,我一直在盯着这个太久了。

有什么想法吗?

【问题讨论】:

  • 您可能有兴趣知道从 MySQL 5.6.4 开始提供 InnoDB 全文搜索...当然,前提是您能够升级服务器上的 MySQL 版本。跨度>
  • 谢谢你,这是一件非常好的事情......我不认为我会升级,但无论如何都很高兴知道!
  • 在这种情况下,我的下一个建议是 (1) 用括号将所有 `field` like 语句括起来,这样您就可以在 WHERE 中添加其他 AND 条件,以及 (2) 放弃 CONCAT() 语句,您可以按此处所示完成:stackoverflow.com/a/1786656/560114
  • 嗯,这就是我要找的......你应该写一个答案而不是评论;)关于 concat() 有什么问题?我使用的是 mysqli 而不是 PDO,这就是它变得丑陋的地方
  • 啊好吧...用mysqli我不知道,也许你需要concat。我会把我的评论变成答案,但我认为@Passerby 已经做得很好了。

标签: php mysqli innodb sql-like


【解决方案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 了解变量编号变量绑定解决方案。

【讨论】:

  • 所以是的,基本上你所说的是围绕我的或括号中的陈述......;)干杯我一定是累了(老了)
  • @Dominik 哎呀...我不知道这就是您要找的东西...感觉就像我抢了马特的功劳。我使用这种技术已经有一段时间了,除了我的公司使用 Oracle 并且 IMO OCI 提供了比 MySQLi 更好的绑定接口。
  • 嘿嘿没害人!我很感激帮助。那些琐碎的事情有时只是隐藏在我疯狂的脑海中。仅供参考,我获得正确查询的代码大约有 200 行,所以我做了很多你在那里建议的事情;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
  • 2013-07-13
  • 2023-03-17
  • 1970-01-01
相关资源
最近更新 更多