在 foreach 循环中绑定数组值时,IMSSP“尝试绑定参数号 0”错误
Posted
技术标签:
【中文标题】在 foreach 循环中绑定数组值时,IMSSP“尝试绑定参数号 0”错误【英文标题】:IMSSP "Tried to bind parameter number 0" error when binding array values in foreach loop 【发布时间】:2015-12-27 00:33:06 【问题描述】:我有一个 php 关联数组,我想在 foreach 循环中将其值与 PDO 绑定。到目前为止,我有这个:
$sqlSecondaryInsert = "INSERT INTO TCMS_Documents ";
// Table Fields
$sqlSecondaryFields = " (DocumentID, ";
$sqlSecondaryValues = "VALUES (:lastDocumentInsertID, ";
foreach ($intersectArray as $key => $value)
if (trim($value) != '')
$sqlSecondaryFields.= trim($key) . ", ";
$sqlSecondaryValues.= ":" . trim($key) . ", ";
$sqlSecondaryFields = rtrim($sqlSecondaryFields, ", ");
$sqlSecondaryFields.= ") ";
$sqlSecondaryValues = rtrim($sqlSecondaryValues, ", ");
$sqlSecondaryValues.= ")";
$sqlSecondaryStmt = $sqlSecondaryInsert . $sqlSecondaryFields;
$stmt2 = $connPDO->prepare($sqlSecondaryStmt);
$stmt2->bindValue(':lastDocumentInsertID', $lastDocumentInsertID);
foreach ($intersectArray as $key => $value)
error_log("attempting to bind " . $key . " to value " . $value);
$stmt2->bindValue(':' . $key, $value, PDO::PARAM_STR);
$stmt2->execute();
虽然正确生成了 SQL INSERT 语句,但在尝试执行它时,我在 PHP 错误日志中收到以下内容:
"IMSSP",-29,"Tried to bind parameter number 0. SQL Server supports a maximum of 2100 parameters."
PHP 日志显示了 foreach 循环中 error_log 中的正确键和值,所以我不明白为什么 PDO bindValues 不起作用。
$intersectArray
的示例 print_r
可以在这里看到:
[DocumentNumber] => 123
[ValidFromDate] => 02/09/2015
[ValidExpiryDate] => 26/09/2015
编辑:一些可能有用也可能没用的附加信息:我们使用的是 SQL Server 2008。我不知道这是否相关,我不了解 PDO 驱动程序有何不同对于 SQLSRV 和 mysql...
【问题讨论】:
DocumentID
和DocumentNumber
一样吗?
不,DocumentID 是 $lastDocumentInsertID 值。
FWIW, implode()
通常比做类似事情的自定义循环要好得多。
@Smar,很高兴你喜欢我的回答。也许给一个upvote而不是在cmets中重复它:P
@Adelphia:我正在查看评论列表,该工具没有在帖子中显示答案。
【参考方案1】:
试试这个:
这是example。
function generateInsert($table, $data)
$sql = "INSERT INTO $table (".implode(", ", $data).") VALUES (:".implode(", :", array_keys($data)).")";
$exe = array();
foreach($data as $k=>$v)
$exe[":$k"] = $v;
return array("sql"=>$sql, "exe"=>$exe);
$q = generateInsert("TCMS_Documents", $intersectArray);
$sql = $q['sql'];
$exe = $q['exe'];
$stmt = $connPDO->prepare($sql);
$stmt->execute($exe);
请确保将 lastDocumentInsertID
列添加到 $intersectArray
数组中。
【讨论】:
不错,效果非常好!我不得不稍微编辑它以使其在我的 Windows/SQLSRV/PHP 堆栈上工作,但感谢您的所有帮助!希望我能给你投票,但我还没有足够高的声誉。 哦,是的,反引号是 MySQL 的东西:P 很高兴能帮上忙 :) 我发现生成$exe
变量的部分也有错误。我修好了,但你可能已经注意到了。
糟糕,刚刚再次编辑以反映这一点!干杯。
你不知道我有多高兴这终于奏效了,再次感谢!以上是关于在 foreach 循环中绑定数组值时,IMSSP“尝试绑定参数号 0”错误的主要内容,如果未能解决你的问题,请参考以下文章
KnockoutJS 3.X API 第四章 数据绑定 控制流foreach绑定
laravel:当计数达到给定值时如何从 foreach 循环中删除选定的数据