【问题标题】:PDO parameterized query with a LIKE statement in Cloud SQL在 Cloud SQL 中使用 LIKE 语句的 PDO 参数化查询
【发布时间】:2018-07-28 16:56:28
【问题描述】:

当我在 Google Cloud Shell 中运行此查询时,它运行良好并按预期返回 5 行数据:

SELECT * FROM tblData WHERE Address LIKE '%123 Queen%' LIMIT 5;

但是当我将相同的搜索词 123 Queen 传递给这个参数化 PDO 查询时,它不会返回任何结果:

$conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$stmt = $conn->prepare("SELECT * FROM tblData WHERE Address LIKE :term LIMIT 5");
$stmt->execute(array(':term' => '%'.$_GET['term'].'%'));

我做错了什么?

【问题讨论】:

  • 这行得通吗? $stmt->execute(array(':term' => '%123 Queen%'));
  • 谢谢@SeanBright,是的,我稍后在代码中调用$stmt->fetch()$array = array(); foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) AS $x) { $array[] = $x; }
  • 我尝试使用$stmt->execute(array(':term' => '%123 Queen%'));,但仍然没有结果。
  • 您的语法看起来不错,所以我的另一个想法是您的手动测试和基于 PHP 的测试可能使用不同的数据库,但我不知道。
  • @SeanBright,您的第一条评论是正确的。事实证明,我的原始语法或您建议的测试都没有问题。一旦我在json_encode 语句中使用了正确的变量名,两者都按预期工作。那是我的错误。感谢您帮助我找到答案。

标签: php mysql google-app-engine pdo google-cloud-sql


【解决方案1】:

尝试类似:SELECT * FROM tblData WHERE Address LIKE CONCAT('%',:term,'%') LIMIT 5

【讨论】:

  • 感谢@Kubwimana Adrien。我尝试了您对CONCAT('%',:term,'%') 的建议,但没有奏效。我相信你的建议相当于'%'.$_GET['term'].'%'
  • 我认为这是你的价值绑定不正确。查看 bindValue() 并尝试使用“?”如果可以的话,用于占位符。我一直在使用它,我没有遇到任何问题。
【解决方案2】:

我最初的问题是为什么这个参数化的 PDO 查询没有返回任何记录:

$conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$stmt = $conn->prepare("SELECT * FROM tblData WHERE Address LIKE :term LIMIT 5");
$stmt->execute(array(':term' => '%'.$_GET['term'].'%'));

$array = array();
foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) AS $x) {
   $array[] = $x;
}

事实证明,上面的代码绝对没有问题。我的错误是我在下面的 json_encode 语句中引用了错误的变量名。我错误地引用了array,而我应该像这样引用$array

$array = $array ?: array('Not Found');
echo json_encode($array);

我应@LundinCast 的要求提供此答案。

【讨论】:

    猜你喜欢
    • 2021-05-28
    • 2015-06-03
    • 2015-12-03
    • 2014-05-13
    • 2010-12-19
    相关资源
    最近更新 更多