使用Doctrine DBAL在预准备语句中的字符串列表

时间:2013-05-29 07:38:51

标签: php doctrine dbal

遵循Doctrine DBAL文档,我应该能够绑定一个字符串值列表,如下所示:

$sql = 'SELECT * FROM mytable WHERE myfield IN (?)';

$stmt = $conn->prepare($sql);
$stmt->bindValue('myfield', array('stringa', 'stringb', 'stringc'), \Doctrine\DBAL\Connection::PARAM_STR_ARRAY);

$stmt->execute();

这导致PHP通知并杀死我的脚本。

Notice: Array to string conversion in C:\www\eurocampings\vendor\doctrine\dbal\lib\Doctrine\DBAL\Statement.php on line 142

我做错了吗?

4 个答案:

答案 0 :(得分:8)

来自Doctrine DBAL文档:

  

参数列表支持仅适用于Doctrine \ DBAL \ Connection :: executeQuery()和Doctrine \ DBAL \ Connection :: executeUpdate(),而不适用于预准备语句的绑定方法。

这是在这个链接的末尾: http://doctrine-dbal.readthedocs.org/en/latest/reference/data-retrieval-and-manipulation.html#list-of-parameters-conversion

答案 1 :(得分:8)

来自学说文件:

$stmt = $conn->executeQuery('SELECT * FROM articles WHERE id IN (?)',
    array(array(1, 2, 3, 4, 5, 6)),
    array(\Doctrine\DBAL\Connection::PARAM_INT_ARRAY)
);

对于仍然存在绑定值数组问题的用户,请将PARAM_INT_ARRAY或PARAM_STR_ARRAY常量与'executeQuery'方法一起使用,而不是将其绑定到预准备语句。 这是它工作的唯一方式。

答案 2 :(得分:-2)

尝试更改以下代码:

$stmt->bindValue('fcodes', array('stringa', 'stringb', 'stringc'), \Doctrine\DBAL\Connection::PARAM_STR_ARRAY);

使用以下代码:

$stmt->bindValue('fcodes', "'stringa', 'stringb', 'stringc'", \Doctrine\DBAL\Connection::PARAM_STR_ARRAY)

希望它能在错误显示的基础上发挥作用。

答案 3 :(得分:-3)

使用Doctrine \ DBAL \ Types :: SIMPLE_ARRAY而不是\ Doctrine \ DBAL \ Connection :: PARAM_STR_ARRAY

例如

$values = ['stringa', 'stringb', 'stringc'];
$statement->bindValue ('column_name', $values, Doctrine\DBAL\Types::SIMPLE_ARRAY);