【问题标题】:How to have more than one search criteria in a SELECT FROM PDO Prepared Statement for a search box?如何在 SELECT FROM PDO Prepared Statement 中为搜索框设置多个搜索条件?
【发布时间】:2017-12-19 15:41:58
【问题描述】:

我有一个准备语句,可以根据我的数据库查找搜索条件,其中包含一个 Articles 表以及 Text 和 Title 列。

$stmt = $pdo->prepare('SELECT * FROM articles WHERE text OR title LIKE :search');

我的问题是该语句仅按标题搜索而完全忽略了文本。

我试过了,它有效,但我还需要标题

$stmt = $pdo->prepare('SELECT * FROM articles WHERE text LIKE :search');

【问题讨论】:

  • WHERE text LIKE :search1 OR title LIKE :search2
  • 在两列中搜索相同的词:.. WHERE text LIKE :search OR title like :search
  • @FirstOne 如果我没记错你不能使用相同的名字,即:search 两次
  • @FirstOne 这些对我有用,非常感谢!
  • @RiggsFolly 你有时可以* (?) php pdo prepare repetitive variables。我之前的评论是基于本地测试的 - 正如我之前使用过的那样。但后来我决定搜索有关它的相关帖子并找到链接的问题。来自PDO::prepare您不能在准备好的语句中多次使用同名的命名参数标记,除非打开了仿真模式。

标签: php select pdo prepared-statement


【解决方案1】:

您可以根据需要多次使用同一个占位符 *.您只需要使用正确的 SQL 语法。见下文:

$stmt = $pdo->prepare('SELECT * FROM articles WHERE text LIKE :search OR title LIKE :search');
//                                                       ^^^^^^^^^^^^

然后只绑定一次:

$stmt->bindValue(':search', $searchTerm); // replace $searchTerm with your variable name

该值将填充两个位置。

我假设您已经将% 添加到您要绑定的变量中。


* 来自PDO::prepare:

您不能在准备好的语句中多次使用同名的命名参数标记,除非打开了仿真模式。

所以,只要仿真模式处于开启状态,您就可以开始了。否则,您必须分别命名和绑定它们:

$stmt = $pdo->prepare('SELECT * FROM articles WHERE text LIKE :search1 OR title LIKE :search2');
$stmt->bindValue(':search1', $searchTerm);
$stmt->bindValue(':search2', $searchTerm);

【讨论】:

  • 这和我做的差不多,再次感谢$stmt->bindValue(':search', '%' . $search1 . '%', PDO::PARAM_INT);
  • @MarisTinyD 你确定PDO::PARAM_INT 吗?搜索词通常是字符串。
  • PARAM_INT 在实践中不会造成伤害,但将其更改为 STR 甚至完全省略肯定是明智的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-10
  • 1970-01-01
  • 1970-01-01
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多