DBAL 查询生成器为 IN 子句创建的表达式未将值设置为字符串?

baa*_*a2w 5 php sql doctrine dbal

我有这个简单的例子:

$names = ['a', 'b'];
$query = $dbConnection->createQueryBuilder();
$query->select('*')
      ->from('foo')
      ->where($query->expr()->in('name', $names));

print $query->getSQL();
Run Code Online (Sandbox Code Playgroud)

输出

SELECT * FROM foo WHERE name IN (a, b)
Run Code Online (Sandbox Code Playgroud)

而不是预期的

SELECT * FROM foo WHERE name IN ('a', 'b')
Run Code Online (Sandbox Code Playgroud)

我该如何修复它?

Jon*_*Jon 6

虽然我对查询生成器相当陌生,但我确实认为使用准备好的语句等会更好,除非您知道用户输入永远不会在此查询中使用。进一步阅读后我发现:

http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/data-retrieval-and-manipulation.html#list-of-parameters-conversion

因此,使用那里的信息,您可以更改必须的查询:

$query->select('*')
      ->from('foo')
      ->where($query->expr()->in('name', ':names'))
      ->setParameter('names', $names, \Doctrine\DBAL\Connection::PARAM_STR_ARRAY);
Run Code Online (Sandbox Code Playgroud)

我自己测试了它,它按预期工作,现在还有一个额外的好处,那就是可以安全地免受 SQL 注入攻击。如果您想使用不同的变量类型或混合变量类型,上面链接的文档页面将向您展示如何做到这一点。