Ответ 1
Последний вариант работает хорошо для меня, я не испытывал этого, избегая "%". Итак $db->quote('%'.$_GET['query'].'%')
выводит %queryvalue%
У меня есть следующий 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\%';
Последний вариант работает хорошо для меня, я не испытывал этого, избегая "%". Итак $db->quote('%'.$_GET['query'].'%')
выводит %queryvalue%
Решение действительно просто. Zend_Db имеет een класс Expression, который помогает вам работать вокруг него.
$select = $this->select()
->where('value LIKE("?")', new Zend_Db_Expr('%' . $value . '%'))
$this->fetchAll( $select );
Вы можете выполнить конкатенацию $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 сбежать '[на другие СУБД, где это не нужно экранировать.
Это очень просто:
$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'
Что такое пролема?
:)
Проблема заключается в том, что мы хотели бы избежать специальных символов LIKE Вручную заменить их будет немного грязно, но если нет решения...
Это проще:
$table->select()->where("myname LIKE ?", '%'.$input.'%');
вы можете просто использовать функцию, которую zf использует для строки, которая является addcslashes ($ value, "\ 000\n\r\'\" \032 "), которая заменит строку так же, как zf использует или вы могли (в случае mysql) использовать mysql_real_escape_string.
в любом случае вы не использовали бы одну из функций кавычек db
Я действительно задаюсь вопросом, есть ли способ в классе db для этого, но я не знаю, что это должно быть.