Как я могу избежать сложных SQL в Zend Framework? - PullRequest
11 голосов
/ 12 апреля 2009

У меня есть следующий 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\%';

Ответы [ 7 ]

16 голосов
/ 12 апреля 2009

Последний вариант хорошо работает для меня, я не видел, чтобы он уклонялся от "%". Итак $db->quote('%'.$_GET['query'].'%') вывод %queryvalue%

3 голосов
/ 22 марта 2011

Решение действительно простое. Zend_Db имеет класс Expression, который помогает вам работать вокруг него.

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

$this->fetchAll( $select );
2 голосов
/ 12 апреля 2009

Вы можете сделать конкатенацию $ input на уровне SQL:

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

К сожалению, это невозможно использовать, если вы хотите, чтобы $ input мог содержать буквенные символы "%" или "_". Чтобы обойти это, укажите явный символ LIKE-ESCAPE и экранируйте его самостоятельно:

$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 для экранирования «[» в других СУБД, где его не нужно экранировать.

1 голос
/ 19 февраля 2011

Это проще:

$table->select()->where("myname LIKE ?", '%'.$input.'%');
1 голос
/ 28 января 2010

Проблема в том, что мы хотим экранировать, КАК специальные символы Замена их вручную была бы немного грязной, но если нет решения ...

1 голос
/ 25 июня 2009

Это очень просто:

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

Что такое пролем?

:)

0 голосов
/ 12 апреля 2009

вы можете просто использовать функцию, которую zf использует для строки, которая является addcslashes ($ value, "\ 000 \ n \ r \ '\" \ 032 "); она заменит строку так же, как zf использует или вы можете (в случае mysql) использовать mysql_real_escape_string.

в любом случае вы бы не использовали одну из функций цитаты БД

Мне интересно, есть ли метод в классе db для этого, но я не знаю, какой должен быть.

...