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 - 尝试将数组保存到数据库