2009-04-12 45 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); 
相關問題