作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有这个简单的例子:
$names = ['a', 'b'];
$query = $dbConnection->createQueryBuilder();
$query->select('*')
->from('foo')
->where($query->expr()->in('name', $names));
print $query->getSQL();
输出
SELECT * FROM foo WHERE name IN (a, b)
而不是预期的
SELECT * FROM foo WHERE name IN ('a', 'b')
我该如何解决?
最佳答案
虽然我对查询构建器相当陌生,但我确实认为您最好使用准备好的语句等,除非您知道用户输入永远不会在此查询中使用。进一步阅读后,我发现了这一点:
因此,使用那里的信息,您可以更改必须进行的查询:
$query->select('*')
->from('foo')
->where($query->expr()->in('name', ':names'))
->setParameter('names', $names, \Doctrine\DBAL\Connection::PARAM_STR_ARRAY);
我自己对其进行了测试,它按预期工作,现在还有一个额外的好处,那就是可以安全地免受 SQL 注入(inject)攻击。如果您想使用不同的变量类型或混合使用变量类型,上面链接的文档页面会向您展示如何做到这一点。
关于php - DBAL 查询构建器为 IN 子句创建的表达式没有将值设置为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42570031/
我是一名优秀的程序员,十分优秀!