【问题标题】:PDO execute array to string conversion errorPDO 执行数组到字符串转换错误
【发布时间】: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上试过了,它工作得很好,很明显我没有正确使用执行,但我不知道如何改变我执行它的方式。

谁能给我解释一下?

【问题讨论】:

标签: php mysql arrays pdo


【解决方案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= 之前,但现在它按预期工作。
猜你喜欢
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 2017-05-27
  • 2015-02-26
  • 2012-07-15
  • 1970-01-01
  • 2017-12-02
  • 2013-06-23
相关资源
最近更新 更多