PDO 执行数组到字符串转换错误

Posted

技术标签:

【中文标题】PDO 执行数组到字符串转换错误【英文标题】:PDO execute array to string conversion error 【发布时间】:2014-03-29 17:58:45 【问题描述】:

当我尝试运行 PDO 执行时,出现数组到字符串的转换错误。执行必须输入一个是普通字符串,另一个是数组。这是我的代码:

$id = "1";    
$array = array("a",  "b",  "c");
$in  = str_repeat('?,', count($array) - 1) . '?';

$sql1 = "SELECT * FROM tbl1 AS tb1 RIGHT JOIN tbl2 AS tb2 ON (tb1.e_id = tb2.e_id)LEFT JOIN tbl3 AS tb3 ON (tb2.m_id = tb3.m_id) WHERE tb1.u_id = ? AND tb1.letters IN ($in)";


$statement1 = $db_handle->prepare($sql1);
$statement1->setFetchMode(PDO::FETCH_ASSOC);
$statement1->execute(array($id,$array));

$res = $statement1->fetchAll();

所以执行行给了我字符串转换错误。我已经打印了我的数组和问号,它们输出正常。 sql语句也很好,我在phpMyAdmin上试过了,它工作得很好,很明显我没有正确使用执行,但我不知道如何改变我执行它的方式。

谁能给我解释一下?

【问题讨论】:

->execute()的文档页面上的示例#5。 php.net/manual/en/pdostatement.execute.php 【参考方案1】:

execute() 方法需要一个数组。来自文档:

执行准备好的语句。如果准备好的语句包含参数标记,您必须:

(剪辑) 传递一个仅输入参数值的数组

使用array($id,$array),您将传递一个如下所示的多维数组:

Array
(
    [0] => 1
    [1] => Array
        (
            [0] => a
            [1] => b
            [2] => c
        )

)

这肯定不是它所期望的。它需要一个包含要插入的值的一维数组。

要解决此问题,您必须修改数组格式。将 ID 添加到数组的开头,如下所示:

$array = array(1, "a",  "b",  "c");

如果ID变量是动态生成的,那么你可以使用array_unshift()函数手动添加到数组start中:

$id = "1";    
$array = array("a",  "b",  "c");
$array = array_unshift($array, $id);

...然后像这样修改execute()调用:

$statement1->execute($array);

【讨论】:

你误解了那句话。检查文档页面上的示例 #5 以获取 ->execute()【参考方案2】:

->execute() 期望您向其发送一个数组,其中每个元素代表查询中的每个 ?

您只向它发送 2 个元素,因此它会尝试将整个数组用作第二个 ?,这就是它尝试将其转换为字符串的原因。然后它可能会抱怨没有足够的参数。

试试这样:

$dataArray = $array;
array_unshift($dataArray, $id);

$statement1->execute($dataArray);

【讨论】:

这确实消除了字符串转换错误,谢谢,但它会产生进一步的错误并给我这个错误Invalid parameter number: number of bound variables does not match number of tokens 这是完全归结为转换还是另一个错误? @user3144542:尝试echo $sql1; 看看其中有多少?。然后var_dump($dataArray) 并确保计数匹配。 @AmalMurali:你误解了那句话。就是说你不能这样做:SELECT * FROM table WHERE id IN (:ids) 然后尝试调用->execute(array(":ids" => array(1,2,3)) 不匹配?,但我确实找到了一个解决方案,用户发布了答案然后将其删除,但答案在下面link 我不得不通过执行以下操作来稍微重构查询IN= 之前,但现在它按预期工作。

以上是关于PDO 执行数组到字符串转换错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥 array_diff() 给出数组到字符串的转换错误?

“数组到字符串的转换”错误 Laravel - 尝试将数组保存到数据库

选择表单类型的数组到字符串转换错误

Laravel 雄辩的 all() 方法给出错误“数组到字符串的转换”[关闭]

Symfony2 - 数组到字符串转换错误

Symfony 表单 - Choicetype - 错误“数组到字符串转换”