Php 如何在Zend框架中转义复杂的sql?

Php 如何在Zend框架中转义复杂的sql?,php,zend-framework,zend-db-table,Php,Zend Framework,Zend Db Table,我有以下sql(真实问题的简化): 如何转义$input? 我不能使用引号(除非我遗漏了什么)。 作为 会给我 SELECT * FROM t WHERE myname LIKE '%'my input'%'; 及 请给我一些在线信息: SELECT * FROM t WHERE myname LIKE '\%my input\%'; 您可以在SQL级别连接$input: $sql=$DB->quoteInto("SELECT * FROM t WHERE myname LIKE '%

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

如何转义$input?
我不能使用引号(除非我遗漏了什么)。
作为

会给我

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

请给我一些在线信息:

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

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

$sql=$DB->quoteInto("SELECT * FROM t WHERE myname LIKE '%'|| ? ||'%'",$input);
遗憾的是,如果希望$input能够包含文字“%”或“\u1”字符,则此选项不可用。要解决此问题,请指定一个显式的类似转义字符,然后自己转义:

$inputlike= '%'.preg_replace('[%_=]', '=$0', $input).'%';
$sql=$DB->quoteInto("SELECT * FROM t WHERE myname LIKE ? ESCAPE '='", $inputlike);
(它可以是任何字符,不一定是“=”。这也可以解决一个错误,即在MySQL中未指定转义时,转义默认为“\”。)


不幸的是,SQL Server还将“[”字符作为特殊字符,用于创建类似regexp的字符组。因此,如果数据库是SQL Server,则必须在preg_replace的组中包含“[”。不幸的是,要转义ANSL SQL无效[”在其他不需要转义的DBMS上。

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

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


我确实想知道db类中是否有这样的方法,但我不知道应该有这样的方法。

最后一个选项对我来说很好,我没有经历过它转义“%”。因此
$db->quote(“%”.$\u GET['query'].%')
输出
%queryvalue%

非常简单:

$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'
问题是什么


:)

问题是,我们想像特殊角色一样逃逸 手动更换会有点脏,但如果没有解决方案…

则更简单:

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

这个解决方案非常简单。Zend_Db有一个表达式类,可以帮助您在它周围工作

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

$this->fetchAll( $select );

字符串连接依赖于DBMS,所以请检查您的DBMS文档。嗯,是的…+是SQL Server,| |是ANSI/everyone,IIRC.Gah,真是一团糟。如果我在ZF project.FWIW中打开一个bug,会发生什么。它输出“%queryvalue%”,包括单引号。
$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'
$table->select()->where("myname LIKE ?", '%'.$input.'%');
$select = $this->select()
->where('value LIKE("?")', new Zend_Db_Expr('%' . $value . '%'))

$this->fetchAll( $select );