我有以下sql语句(对实际问题的简化):
SELECT *
FROM t
WHERE myname LIKE '%{$input}%';我如何逃脱$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\%';发布于 2009-04-12 02:28:59
最后一个选项对我来说效果很好,我没有经历过转义'%‘的情况。所以$db->quote('%'.$_GET['query'].'%')输出%queryvalue%
发布于 2011-03-23 03:55:16
解决方案非常简单。Zend_Db甚至有一个表达式类可以帮助你解决这个问题。
$select = $this->select()
->where('value LIKE("?")', new Zend_Db_Expr('%' . $value . '%'))
$this->fetchAll( $select );发布于 2009-04-12 00:50:12
您可以在SQL级别进行$input的连接:
$sql=$DB->quoteInto("SELECT * FROM t WHERE myname LIKE '%'|| ? ||'%'",$input);不幸的是,当您希望$input能够包含文字‘%’或‘_’字符时,这是不可用的。要解决此问题,请指定一个显式的类转义字符并自己转义它们:
$inputlike= '%'.preg_replace('[%_=]', '=$0', $input).'%';
$sql=$DB->quoteInto("SELECT * FROM t WHERE myname LIKE ? ESCAPE '='", $inputlike);(它可以是任何字符,不一定是'=‘。当未在MySQL中指定时,这也解决了转义默认为‘\’的错误。)
不幸的是,SQL Server还将‘[’字符视为特殊字符,以执行类似regexp的字符组。因此,如果您的数据库是SQL Server,则必须在preg_replace中的组中包含‘[’。不幸的是,在不需要转义的其他DBMS上转义‘[’不是有效的ANSL SQL。
https://stackoverflow.com/questions/741053
复制相似问题