首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Zend Framework中转义复杂的sql?

如何在Zend Framework中转义复杂的sql?
EN

Stack Overflow用户
提问于 2009-04-12 00:28:09
回答 7查看 14.4K关注 0票数 11

我有以下sql语句(对实际问题的简化):

代码语言:javascript
运行
复制
SELECT *
FROM t
WHERE myname LIKE '%{$input}%';

我如何逃脱$input?

我不能使用quoteInto (除非我遗漏了什么)。

作为

代码语言:javascript
运行
复制
$sql=$DB->quoteInto("SELECT *
                     FROM t
                     WHERE myname LIKE '%?%'",$input);

将会给我

代码语言:javascript
运行
复制
SELECT *
FROM t
WHERE myname LIKE '%'my input'%';

代码语言:javascript
运行
复制
$sql=$DB->quoteInto("SELECT *
                     FROM t
                     WHERE myname LIKE ?",'%'.$input.'%');

会给我一些线索:

代码语言:javascript
运行
复制
SELECT *
FROM t
WHERE myname LIKE '\%my input\%';
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-04-12 02:28:59

最后一个选项对我来说效果很好,我没有经历过转义'%‘的情况。所以$db->quote('%'.$_GET['query'].'%')输出%queryvalue%

票数 16
EN

Stack Overflow用户

发布于 2011-03-23 03:55:16

解决方案非常简单。Zend_Db甚至有一个表达式类可以帮助你解决这个问题。

代码语言:javascript
运行
复制
$select = $this->select()
->where('value LIKE("?")', new Zend_Db_Expr('%' . $value . '%'))

$this->fetchAll( $select );
票数 3
EN

Stack Overflow用户

发布于 2009-04-12 00:50:12

您可以在SQL级别进行$input的连接:

代码语言:javascript
运行
复制
$sql=$DB->quoteInto("SELECT * FROM t WHERE myname LIKE '%'|| ? ||'%'",$input);

不幸的是,当您希望$input能够包含文字‘%’或‘_’字符时,这是不可用的。要解决此问题,请指定一个显式的类转义字符并自己转义它们:

代码语言:javascript
运行
复制
$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。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/741053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档