【问题标题】:How to use PDO::quote without getting string surrounded by quotes?如何使用 PDO::quote 而不让字符串被引号包围?
【发布时间】:2011-12-01 12:55:10
【问题描述】:

我尝试使用PDO::quote 转义LIKE 表达式中的字符串,因此用户字符串不能像以下那样被包围:

LIKE "%userStringToEscape%"

有没有办法做到这一点?

【问题讨论】:

  • 为什么不把" 去掉呢?让%userStringToEscape%“拥有”引号?
  • 只使用substr($str, 1, -1) 吗?不过,这似乎是一件愚蠢的事情。
  • % 将被我认为的函数转义 - 删除这样的引用有点脏:)
  • % 不会被引号转义。 quote() 只逃避 SQL 注入,而不是 LIKE 查询。

标签: php sql pdo


【解决方案1】:
$var = "%userStringToEscape%";
$var = $stmt->quote($var);
$sql = "SELECT * FROM table WHERE field LIKE $var";

准备好的语句也是如此

【讨论】:

  • 问题的答案是“你不能这样做(而且似乎没有必要——参见 Shrapnel 的回答——除非你将多个“转义”输入连接成一个字符串)" :)
  • 好的,是否有一个函数可以为 LIKE 语句转义 % 和 _ ?与报价不同?
  • 我猜str_replace 会这样做
【解决方案2】:

使用substr($db->quote($var), 1, -1)

真的,不要。你最终会遇到比开始时更大的问题。

这样做的干净解决方案当然是$db->quote('%'.$var.'%')

【讨论】:

  • 嘿,没必要投反对票!至少这是对这个问题的直接回答。改为对问题投反对票;-)
  • 我不明白“实际上不”之类的问题。如果您发布它,您实际上是推荐它。为什么不先下定决心,写一个不自相矛盾的答案呢?
  • 好吧,我会用“真的”来代替它
  • Heps,这个问题对我来说很清楚,也很简单。我对其他解决方案持开放态度,我只是在问一个问题,也许方向不好,但不是一个坏问题。
【解决方案3】:

只要做:

$like = $pdo->quote("%{$userStringToEscape}%");
$sql  = "SELECT * FROM field LIKE {$like}";

http://php.net/manual/en/pdo.quote.php

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-18
    • 2012-03-29
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 2016-09-18
    相关资源
    最近更新 更多