11

我有以下 sql(实际问题的简化):

SELECT *
FROM t
WHERE myname LIKE '%{$input}%';

如何转义 $input?
我不能使用 quoteInto (除非我错过了什么)。
作为

$sql=$DB->quoteInto("SELECT *
                     FROM t
                     WHERE myname LIKE '%?%'",$input);

会给我

SELECT *
FROM t
WHERE myname LIKE '%'my input'%';

$sql=$DB->quoteInto("SELECT *
                     FROM t
                     WHERE myname LIKE ?",'%'.$input.'%');

会给我一些东西:

SELECT *
FROM t
WHERE myname LIKE '\%my input\%';
4

7 回答 7

16

最后一个选项对我来说效果很好,我没有经历过它转义'%'。所以$db->quote('%'.$_GET['query'].'%')输出%queryvalue%

于 2009-04-12T02:28:58.853 回答
3

解决方案非常简单。Zend_Db 有一个可以帮助您围绕它工作的 Expression 类。

$select = $this->select()
->where('value LIKE("?")', new Zend_Db_Expr('%' . $value . '%'))

$this->fetchAll( $select );
于 2011-03-22T19:55:15.827 回答
2

您可以在 SQL 级别连接 $input:

$sql=$DB->quoteInto("SELECT * FROM t WHERE myname LIKE '%'|| ? ||'%'",$input);

不幸的是,当您希望 $input 能够包含文字 '%' 或 '_' 字符时,这不可用。为了解决这个问题,指定一个明确的 LIKE-ESCAPE 字符并自己转义它们:

$inputlike= '%'.preg_replace('[%_=]', '=$0', $input).'%';
$sql=$DB->quoteInto("SELECT * FROM t WHERE myname LIKE ? ESCAPE '='", $inputlike);

(它可以是任何字符,不一定是 '='。这也适用于在 MySQL 中未指定 ESCAPE 默认为 '\' 的错误。)

不幸的是,SQL Server 也将 '[' 字符视为特殊字符,以执行类似正则表达式的字符组。因此,如果您的数据库是 SQL Server,您必须在 preg_replace 的组中包含“[”。不幸的是,在不需要转义的其他 DBMS 上转义 '[' 不是有效的 ANSL SQL。

于 2009-04-12T00:50:12.303 回答
1

这很简单:

$sql=$DB->quoteInto("SELECT *
                     FROM t
                     WHERE myname LIKE ?",'%' . $input . '%');

//Will output: SELECT FROM t WHERE myname LIKE '%inputtedvalue%'


$sql=$DB->quoteInto("SELECT *
                     FROM t
                     WHERE myname LIKE ?",'%' . $input);

//Will output: SELECT FROM t WHERE myname LIKE '%inputtedvalue'


$sql=$DB->quoteInto("SELECT *
                     FROM t
                     WHERE myname LIKE ?", $input . '%');

//Will output: SELECT FROM t WHERE myname LIKE 'inputtedvalue%'


$sql=$DB->quoteInto("SELECT *
                     FROM t
                     WHERE myname LIKE ?", $input);

//Will output: SELECT FROM t WHERE myname LIKE 'inputtedvalue'

有什么问题?

:)

于 2009-06-25T04:30:09.460 回答
1

问题是,我们想转义 LIKE 特殊字符手动替换它们会有点脏,但如果没有解决方案......

于 2010-01-28T09:10:21.337 回答
1

它更简单:

$table->select()->where("myname LIKE ?", '%'.$input.'%');
于 2011-02-19T08:26:29.470 回答
-1

您可以只使用 zf 在字符串上使用的函数 addcslashes($value, "\000\n\r\'\"\032"); 这将以 zf 使用的相同方式替换字符串,或者您可以(在 mysql 的情况下)使用 mysql_real_escape_string。

无论哪种方式,您都不会使用其中一个 db quote 函数

我确实想知道 db 类中是否有一种方法可以做到这一点,但我不知道应该有一个方法。

于 2009-04-12T01:41:14.863 回答