如何在Zend Framework中避免复杂的SQL语句?

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\%';
7个回答

16
最后一个选项对我来说效果不错,我没有遇到它转义 '%' 的情况。因此$db->quote('%'.$_GET['query'].'%')输出%queryvalue%

4
这句话的意思是,这个程序输出包括单引号在内的“%queryvalue%”内容。 - Bill Karwin

3
解决方案非常简单。Zend_Db有一个Expression类,可以帮助你解决这个问题。
$select = $this->select()
->where('value LIKE("?")', new Zend_Db_Expr('%' . $value . '%'))

$this->fetchAll( $select );

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。


字符串连接取决于数据库管理系统,因此请查阅您的DBMS文档。 - Milen A. Radev
哼,是的... + 是 SQL Server,|| 是 ANSI / 其他所有人,如果我没记错的话。 哎呀,真是一团糟。 - bobince
确实有些混乱。如果我在ZF项目中提交一个错误报告,会发生什么呢? - Itay Moav -Malimovka

1

这更简单:

$table->select()->where("myname LIKE ?", '%'.$input.'%');

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'

有什么问题吗?

:)


1
问题是,我们想要转义LIKE特殊字符。手动替换可能会有点麻烦,但如果没有解决方案...

-1

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

无论哪种方式,都不会使用db引用函数之一

我想知道是否有一种方法在db类中执行此操作,但我不知道是否有这样的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接