【问题标题】:IMSSP "Tried to bind parameter number 0" error when binding array values in foreach loop在 foreach 循环中绑定数组值时,IMSSP“尝试绑定参数号 0”错误
【发布时间】: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:我正在查看评论列表,该工具没有在帖子中显示答案。

标签: php arrays pdo foreach


【解决方案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 变量的部分也有错误。我修好了,但你可能已经注意到了。
  • 糟糕,刚刚再次编辑以反映这一点!干杯。
  • 你不知道我有多高兴这终于奏效了,再次感谢!
猜你喜欢
  • 2021-04-22
  • 1970-01-01
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 2014-11-06
  • 2017-08-13
  • 1970-01-01
  • 2015-05-11
相关资源
最近更新 更多