【问题标题】:Dynamic amount of bindParambindParam 的动态数量
【发布时间】:2025-12-08 08:30:04
【问题描述】:

所以我试图在 foreach 中进行数量不定的 bindParam 调用,但由于某种原因它失败了。我知道 $sql 变量工作正常,但我很确定它在 bindParam 上失败了。这有什么原因吗?

$sql = "INSERT INTO " . $row1["rand"] . " (" . $areas . ") VALUES (" . $vals . ")";
echo $sql;
$entry2 = $conn->prepare("'".$sql."'");
//echo "swag";
foreach($splitHeader as $element){
    if(strlen($element)>0) {
        $thisVal = "':" . $element . "'";
        $entry2->bindParam($thisVal,$_POST[$element]);
    }
}
$entry2->execute();

【问题讨论】:

  • 在您的 prepare() 通话中删除 "'" 内容。只是$conn->prepare($sql);
  • 您是在检查prepare() 之后的错误还是启用了 PDO 异常?它会告诉您引号内的 SQL 语句是语法错误。
  • 当您创建$thisVal 时,您也在参数名称周围加上单引号。你不需要那些。您也不需要$thisVal 中的: 前缀。

标签: php mysql pdo prepared-statement


【解决方案1】:

您在查询中定义的参数数量必须与您绑定的参数数量相匹配。

您需要在数据中循环两次:一次是动态构造 sql 语句(然后您可以 prepare),然后第二次绑定参数,最后调用 execute

这是对您的代码的改编,展示了该原理:

$cols = "";
$vals = "";
foreach( $splitHeader as $element ) {
    if( strlen($element) > 0 ) {
        if ( strlen($cols) > 0 ) {
            $cols .= ", ";
            $vals .= ", ";
        }
        $cols .= $element;
        $vals .= "?";
    }
}

$sql = "INSERT INTO " . $row1["rand"] . " (". $cols . ") VALUES(". $vals . ")";
echo $sql;
$sth = $conn->prepare($sql);

$i = 1;
foreach($splitHeader as $element){
    if( strlen($element) > 0 ) {
        $sth->bindParam( $i, $_POST[$element] );
        $i++;
    }
}

$sth->execute();

【讨论】: