2009-04-12 40 views
11

我有以下SQL(真正的问题简单化):如何在Zend Framework中转义复杂的sql?

SELECT * 
FROM t 
WHERE myname LIKE '%{$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\%'; 

回答

15

最后一个选项对我来说工作得很好我没有经历它逃避'%'。所以$db->quote('%'.$_GET['query'].'%')输出%queryvalue%

+0

这是最好的方法:) – 2009-04-12 23:40:35

+3

FWIW,它输出'%queryvalue%',包括单引号。 – 2009-08-05 22:16:27

2

你可以做在SQL级$输入的串联:

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

不幸的是,当你想$输入可以包含文字“%”或“_”字符,这是不可用的。为了避免这种情况发生,指定一个明确的LIKE转义字符和自己逃脱他们:

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

(它可以是任何字符,不一定是“=”这也围绕着一个臭虫ESCAPE默认为“\”当在MySQL中未指定时)。

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

+0

和字符串连接是一个DBMS依赖,所以检查您的DBMS文档。 – 2009-04-12 01:01:28

+0

嗯,是的...... +是SQL Server和||是ANSI /其他人,IIRC。呃,真是一团糟。 – bobince 2009-04-12 01:26:24

+0

确实是一团糟。如果我在ZF项目中打开一个bug,会看到会发生什么。 – 2009-04-12 01:36:20

-1

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

你不会使用的DB报价功能之一

我也知道无论哪种方式,如果有在DB类的方法来做到这一点,但我不知道应该有一个。

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' 

什么prolem?

:)

1

的问题是,我们想逃避特殊字符,例如 手动更换起来会有点脏,但如果没有解决......

1

更简单:

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

该解决方案非常简单。Zend_Db拥有een Expression类,可以帮助你围绕它工作。

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

$this->fetchAll($select); 
相关问题