Nasıl Zend Framework karmaşık sql kaçabilir?

6 Cevap php

Ben aşağıdaki sql (gerçek sorunun bir basitleştirme) var:

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

How do I escape the $input?
I can't use the quoteInto (unless I miss something).
As

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

Bana verecek

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

ve

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

Bana vereceksomething on the lines:

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

6 Cevap

Son seçenek Ben '%' kaçan yaşadığınız değil benim için iyi çalışıyor olduğunu. Bu yüzden $db->quote('%'.$_GET['query'].'%') çıkışları %queryvalue%

SQL düzeyinde $ girdi birleştirme yapabilirsiniz:

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

Eğer $ girdi literal '%' ya da '_' karakterleri içeren muktedir istiyorum Ne yazık ki bu kullanışlı değildir. Bu almak için, bir açık GİBİ-KAÇIŞ karakterini belirtin ve bunları kendiniz kaçış:

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

(Bu '=' ille, herhangi bir karakter olabilir. Bu da KAÇIŞ varsayılan için '\' MySQL belirtilen zaman değil. Bir hata etrafında çalışır)

Ne yazık ki SQL Server da bir sıradanifade gibi karakter grup yapmak için, özel olarak '[' karakterini alır. DB, SQL Server Yani eğer preg_replace yılında grup '[' içermek zorunda. Ne yazık ki o kaçtı olması gerekmez diğer DBMSs üzerine kaçmak için geçerli ANSL SQL '[' değildir.

Çözüm çok basit. Zend_Db bunun etrafında çalışmasına yardımcı olur een İfade sınıfı vardır.

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

$this->fetchAll( $select );

Bu çok basit:

$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 nedir?

:)

Daha basit:

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

Sadece zf addcslashes dize üzerinde kullandığı işlevini kullanabilirsiniz ($ değer, "\ 000 \ n \ r \ '\" \ 032 "); ki aynı şekilde dizesini değiştirmek olacağını zf kullanır ya da sen (MySQL durumunda) mysql_real_escape_string kullanın.

iki yolu db alıntı işlevlerinden birini kullanabilirsiniz olmaz

Bunu yapmak için db sınıfındaki bir yöntem var mi merak ediyorum ama ben biri olsa orada olması gerektiğini bilmiyorum.