在 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...

【问题讨论】:

DocumentIDDocumentNumber一样吗? 不,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 循环中删除选定的数据

不能在 swift 中使用 for...in 或 forEach 循环来快速打印视图

如何在敲除时在 foreach 循环中绑定输入值

从数组中删除值

PDO::bindParam 在 foreach 循环中,所有值都设置为相同吗?