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

时间:2014-02-26 17:51:50

标签: php mysql arrays pdo

当我尝试运行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上尝试了它并且工作得很好,所以我没有正确使用执行但我不知道如何改变我执行它的方式。

有人可以向我解释一下吗?

2 个答案:

答案 0 :(得分:5)

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()函数手动将其添加到数组中:

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

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

$statement1->execute($array);

答案 1 :(得分:1)

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

你只发送了2个元素,所以它会尝试将整个数组用作第二个?,这就是为什么它试图将它转换为字符串。然后它可能会抱怨没有足够的参数。

试试这样:

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

$statement1->execute($dataArray);