【问题标题】:Why this SQL query return false when i try to bind values (even prepare statement)?当我尝试绑定值(甚至准备语句)时,为什么这个 SQL 查询返回 false?
【发布时间】:2018-09-25 10:27:48
【问题描述】:

我尝试使用 PDO 和 mysqli 准备语句来解决它,但它仍然返回 false。所以只有sql语句可能有问题,但我不知道具体是什么。

$query = $db->prepare('SELECT * FROM bricks WHERE "text" LIKE CONCAT("%", :phrase, "%") AND tags LIKE CONCAT("%", :tag, "%") ORDER BY hearts DESC LIMIT {$start},{$pagesOnSite}');
$query->bindValue(':phrase', $phrase, PDO::PARAM_STR);
$query->bindValue(':tag', $tag, PDO::PARAM_STR);
$query->execute();

我也试过这样:

$sql='SELECT * FROM bricks WHERE "text" LIKE CONCAT("%", ?, "%") AND tags LIKE CONCAT("%", ?, "%") ORDER BY hearts DESC LIMIT {$start},{$pagesOnSite}';
$stmt = $db->prepare($sql);
$stmt->bind_param("ss", $phrase, $tag);
$stmt->execute();

【问题讨论】:

  • 你为什么在通配符上使用 concat?
  • 为什么在您的查询中 text 周围有双引号?现在是字符串text,而不是列名。
  • 我认为我必须使用 concat 因为我不能使用 "%?%"
  • 我现在改了,它的文字
  • 致命错误:未捕获的 mysqli_sql_exception:查询/准备语句中未使用索引 SELECT * FROM blocks WHERE text LIKE CONCAT("%", ?, "%") AND tags LIKE CONCAT("%", ?, "%") ORDER BY heart DESC LIMIT 0,12

标签: php mysql sql mysqli pdo


【解决方案1】:

如果你想绑定一些被通配符包围的文本文字,那么你应该在你的 PHP 代码中构建整个字符串值。然后,将其绑定到您的语句。

$sql = "SELECT * FROM bricks ";
$sql .= "WHERE text LIKE :phrase AND tags LIKE :tag ";
$sql .= "ORDER BY hearts DESC LIMIT {$start}, {$pagesOnSite}";
$query = $db->prepare($sql);
$query->bindValue(':phrase', '%'.$phrase.'%', PDO::PARAM_STR);
$query->bindValue(':tag', '%'.$tag.'%', PDO::PARAM_STR);
$query->execute();

【讨论】:

  • 非常感谢!现在效果很好。你能告诉我如何使用 mysqli 准备好的语句(我尝试过的第二种方法,但失败了)吗?
  • 会不会是$stmt->bind_param("ss", "%".$phrase."%", "%".$tag."%"); ?
  • 当我以 stmt 方式尝试此操作时,我得到:致命错误:未捕获错误:无法通过引用传递参数 2
  • @Steve143 如果您需要其他 API 的帮助,您应该提出一个新问题。我已经回答了你原来的问题。
  • @Steve143 这是您应该在 PHP 逻辑中处理的事情。你到底为什么要把文字 % 绑定到你的声明中?
猜你喜欢
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 2022-11-20
  • 2015-07-13
相关资源
最近更新 更多