在 dbal 上限制 sql 结果
Posted
技术标签:
【中文标题】在 dbal 上限制 sql 结果【英文标题】:Limit sql result on dbal 【发布时间】:2013-06-13 08:56:21 【问题描述】:我在 Symfony2 上使用 dbal 从我的表中检索一些信息:
$social = $conn->fetchAll('SELECT * FROM page WHERE brand_id = :brand LIMIT :start,:limit', array('brand'=>$brand, 'start'=>(int) $start, 'limit'=>(int) $limit));
仅当我添加最后一部分(LIMIT ....)时才出现错误,这让我认为我无法限制 sql 查询内部的结果,但在外部使用某种命令。我该如何解决这个问题?
错误:
An exception occurred while executing 'SELECT * FROM page WHERE brand_id = :brand LIMIT :start,:limit' with params "brand":1,"start":0,"limit":4:
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your mysql server version for the right syntax to use near ''0','4'' at line 1
【问题讨论】:
PDO prepared statement causes an error in LIMIT statement @YourCommonSense 在 Symfony 上使用该解决方案我得到:致命错误:在 /var/www/vhosts/blabla.com/httpdocs/src/Done 中找不到类 'Done\PunctisBundle\Controller\PDO' /PunctisBundle/Controller/AjaxController.php 【参考方案1】:$statement = $connection->prepare(
'SELECT ... LIMIT :limit'
);
$statement->bindValue('limit', $limit, \PDO::PARAM_INT);
$statement->execute();
$result = $statement->fetchAll();
【讨论】:
这种方法对 SQL 注入仍然安全吗?附:我正在使用 OCI8 和 Oracle,所以必须稍微修改一下。试图将其直接粘贴到 SQL 字符串中,但效果不佳。 doctrine-orm.readthedocs.org/projects/doctrine-dbal/en/latest/… 和 doctrine-orm.readthedocs.org/projects/doctrine-dbal/en/latest/… 但是有跑题的风险,请回答问题的 SQL 注入部分。 是的,准备好的语句 (PDO) 不会受到 SQL 注入的影响,因为它们是通过值绑定转义的 - SQL 本身已经预编译。【参考方案2】:或者您可以像这样简单地使用 fetchAll($sql, array $params = array(), $types = array()) 中的第三个参数:
$social = $conn->fetchAll('SELECT * FROM page WHERE brand_id = :brand LIMIT :start,:limit', array('brand'=>$brand, 'start'=>(int) $start, 'limit'=>(int) $limit), array(\PDO::PARAM_STR, \PDO::PARAM_INT, \PDO::PARAM_INT));
【讨论】:
这不适用于从学说 2.6.0 开始的限制/偏移和命名参数。我得到无效的 SQL 异常。但是,如果您将 ? 用于参数,它确实有效。以上是关于在 dbal 上限制 sql 结果的主要内容,如果未能解决你的问题,请参考以下文章
具有数组值的 Doctrine DBAL setParameter()
如何在 Oracle SQL 中将结果限制为 1 行 [重复]