【问题标题】:How can I use wildcards in this prepared statement? [duplicate]如何在这个准备好的语句中使用通配符? [复制]
【发布时间】:2020-01-04 14:23:53
【问题描述】:

我正在尝试为一个非常基本的搜索功能编写一个准备好的语句。基本上,我只需要在标题包含搜索词时返回“标题”(但也可能包含比搜索词更多的词)。

我可以在普通的 mysqli 中执行此操作,但不能使用准备好的语句(为了安全,我需要它,对吗?)

这可行,但没有准备好的声明:

$sql = "SELECT title, description FROM quiztime WHERE title LIKE '%".$query."%' OR description LIKE '%".$query."%'";

这不起作用:

$stmt = $conn->prepare("SELECT user, title FROM quiztime WHERE title LIKE %?%");

我进入日志: PHP 致命错误:未捕获的错误:

那么我怎样才能把它变成一个准备好的语句呢?非常感谢!

【问题讨论】:

  • 在执行时将 %% 添加到变量中,然后再将其传入。即execute(["%$variable%"])
  • 您使用的是 MySQLi 还是 PDO 扩展?
  • @Dharman mySQLi

标签: php mysql prepared-statement wildcard


【解决方案1】:

你必须使用串联:

$stmt = $conn->prepare("SELECT user, title FROM quiztime WHERE title LIKE concat('%', ?, '%')");

【讨论】:

  • 从数据库中返回每个用户和标题......但至少它返回了一些东西,这是一个改进!
  • 你用 concat() 试过了吗?如果是这样,您将传递什么作为参数?
  • 这成功了! $likeVar = "%" . $query. "%";$stmt = $mysqli->prepare("SELECT user, title FROM quiztime WHERE title LIKE ?");$stmt->bind_param("s", $likeVar);
  • 所以你做了连接并将其作为参数传递。如果您传递不带通配符的实际参数,则答案中的代码会进行连接。
  • 是的,我想我明白了!学习曲线...感谢您的帮助!
猜你喜欢
  • 2012-01-05
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
相关资源
最近更新 更多