【问题标题】:PDO prepare statement and match against in boolean modePDO 准备语句并在布尔模式下匹配
【发布时间】:2017-06-07 08:44:13
【问题描述】:

如果我通过直接输入从控制台运行这个简单的查询

 SELECT COUNT(*) AS total FROM articles WHERE MATCH(title) AGAINST ('+php +mysql' IN BOOLEAN MODE)

我得到了很多结果。 现在我正在尝试在 php 中准备这个语句。

$keywords = ['php', 'mysql'];
$against = '';
for($i = 0; $i < count($keywords); $i++){
    $against .= '+? ';  
}
$query = 'SELECT COUNT(*) AS total FROM articles WHERE MATCH(title) AGAINST ('.$against.' IN BOOLEAN MODE)';

//my query is now 'SELECT COUNT(*) AS total FROM articles WHERE MATCH(title) AGAINST (+? +?  IN BOOLEAN MODE)'

$stmt = $pdo->prepare($query);
$stmt->execute($keywords);

此脚本仅在仅使用 1 个关键字时返回结果。使用 2 个关键字,它不返回任何值且不返回错误(但在控制台中有效)。所以我怀疑这是我用 pdo 准备我的陈述的方式。有什么想法吗?

【问题讨论】:

  • 间距重要吗?在控制台中运行的查询在两个关键字之间有空格,而为 PDO 生成的查询会将所有关键字创建为仅由“+”分隔的单个字符串。
  • 为适当的间距编辑。
  • 控制台中的查询将所有关键字封装在引号中 ('+php +mysql'),而您准备好的查询看起来像 AGAINST (+php +mysql IN BOOLEAN MODE) - 也许就是这样?尝试使用单个占位符并将字符串构建为 1 个参数?

标签: php mysql pdo


【解决方案1】:

你应该简单地创建一个这样的语句:

$query = 'SELECT COUNT(*) AS total FROM articles WHERE MATCH(title) AGAINST (:query IN BOOLEAN MODE)';
$stmt = $pdo->prepare($query);

然后绑定参数:

$keywords = ['php', 'mysql'];
$against = '';
for($i = 0; $i < count($keywords); $i++){
    $against .= ' +' . $keywords[$i];   
}
$stmt->execute(array(
    ':query' => $against
));

【讨论】:

  • 我需要用这样的方式来反对:AGAINST (' "john doe " ' IN BOOLEAN MODE)。我不知道如何写 $against。我试过 $against="\"joh doe\"";但它不起作用。你知道我该如何处理吗?
  • 我在这篇文章中找到了解决方案:stackoverflow.com/questions/27053879/…
  • 这个答案中的绑定发生在哪里?或者他们是在你准备()之后说 THAN 绑定?
  • @twinaholic 我刚刚注意到我的答案中有一个错误(3 年前) - 这是错误的:$stmt = $pdo-&gt;prepare(array(':query' =&gt; $against));,应该是 $stmt-&gt;execute(array(':query' =&gt; $against));
  • @AlonEitan 你会修复你的错误吗?另外,请考虑从您的答案中删除$stmt = $pdo-&gt;prepare(array( ':query' =&gt; $against ));,您提出两次,我担心新用户会感到困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
  • 2010-11-30
  • 2014-04-19
  • 2010-11-18
相关资源
最近更新 更多