2009-04-12 12 views
11

Mam następujące SQL (uproszczenie rzeczywistego problemu):Jak mogę uniknąć złożonego sql w Zend Framework?

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

Jak mogę uciec wejście $?
Nie mogę użyć quoteInto (chyba, że ​​coś pominę).
Jak

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

da mi

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

i

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

da mi coś na liniach:

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

Odpowiedz

15

Ostatnia opcja działa dobrze dla mnie, nie doświadczyłem tego ucieczki "%". Tak więc $db->quote('%'.$_GET['query'].'%') wyjścia %queryvalue%

+0

To jest najlepszy sposób :) –

+3

FWIW, wyświetla "% queryvalue%", w tym pojedyncze cudzysłowy. –

2

można wykonać następujące połączeniem $ wejscie na poziomie SQL:

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

Niestety nie jest użyteczna, gdy chcemy $ input, aby móc zawierać dosłowne „%” lub „_” znaków. Aby obejść ten określić wyraźny charakter podobnie uciec i ucieczka je samodzielnie.

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

(może to być dowolna postać, niekoniecznie „=” To działa również wokół błąd, gdzie domyślnie uciec do „\” jeśli nie podano w MySQL.)

Niestety SQL Server przyjmuje również znak "[jako specjalny, aby utworzyć grupę znaków podobną do regexp. Więc jeśli twój DB to SQL Server, musisz dodać '[' w grupie w preg_replace. Niestety nie jest prawidłowy ANSL SQL, aby uciec "[" w innych DBMS, gdzie nie musi być escaped.

+0

Łączenie ciągów znaków zależy od DBMS, dlatego należy sprawdzić dokumentację DBMS. –

+0

Hmm, tak ... + to SQL Server i || to ANSI/wszyscy inni, IIRC. Gah, co za bałagan. – bobince

+0

Naprawdę bałagan. Zobaczę, co się stanie, jeśli otworzę błąd w projekcie ZF. –

-1

można po prostu użyć funkcji, która zf używa w łańcuchu, który jest addcslashes (wartość $, "\ 000 \ n \ r \ '\" \ 032 "), która zastąpiłaby ciąg w taki sam sposób, jak zf zastosowania lub można (w przypadku MySQL) używać mysql_real_escape_string.

Tak czy inaczej nie byłoby użyć jednej z funkcji db cytując

zastanawiam się, czy jest to metoda w klasie db to zrobić, ale Nie wiem, który z nich powinien być.

1

Jest bardzo prosty:

$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' 

Jaki jest prolem?

:)

1

Problem polega na tym, chcielibyśmy uciec LIKE znaków specjalnych Ręcznie zastępując je będzie trochę brudna, ale jeśli nie ma rozwiązania ...

1

Jest bardziej prosty:

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

Rozwiązanie jest naprawdę proste.Zend_Db ma klasę Expression, która pomaga w jej pracy.

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

$this->fetchAll($select);