Как я могу избежать сложного 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\%';

Ответ 1

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

Ответ 2

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

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

$this->fetchAll( $select );

Ответ 3

Вы можете выполнить конкатенацию $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 также принимает символ [[] как специальный, чтобы создать группу символов, похожую на regexp. Поэтому, если ваша БД - это SQL Server, вы должны включить "[в группу в preg_replace. К сожалению, не удалось ANSL SQL сбежать '[на другие СУБД, где это не нужно экранировать.

Ответ 4

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

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

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

:)

Ответ 5

Проблема заключается в том, что мы хотели бы избежать специальных символов LIKE Вручную заменить их будет немного грязно, но если нет решения...

Ответ 6

Это проще:

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

Ответ 7

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

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

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