在 MySQLi 准备的 Insert 语句 PHP 中绑定一个数组

Binding an array in MySQLi prepared Insert statement PHP

我尝试了多种方法来创建将动态数组值绑定到 MySQLi 准备语句中的函数。但是我收到错误 'Uncaught mysqli_sql_exception: No data supplied for parameters in prepared statement'

这是我的代码:

if (count($fields) == count($values)) {
    $fielddata = implode(", ", $fields);
    $questions = rtrim(str_repeat("?, ", count($values)), ", ");
    $typedata = implode("", $type);

    foreach ($values as $index => $current_val){ // build type string and parameters
        $value .= '$values['.$index.'],';
    }
    $value = rtrim($value,',');

    $statement = "INSERT INTO ".$table." (".$fielddata.") VALUES (".$questions.")";
    $stmt = $db->prepare($statement);
    $stmt->bind_param("sss", $value);

    $stmt->execute();
    $stmt->close();
    echo "inserted";
}

当我替换

时相同的代码有效
$stmt->bind_param("sss", $value);

$stmt->bind_param("sss",$values[0],$values[1],$values[2]);
        

bind_param() 不采用以逗号分隔的值列表的字符串,这似乎是您要传递的内容。

将您的 foreach 循环移到 prepare() 下方,并在循环内绑定值。

if (count($fields) == count($values)) {
    $fielddata = implode(", ", $fields);
    $questions = rtrim(str_repeat("?, ", count($values)), ", ");
    $typedata = implode("", $type);

    //NOTE: You should verify that `$table` contains a valid table name.
    $statement = "INSERT INTO {$table} ({$fielddata}) VALUES ({$questions})";
    $stmt = $db->prepare($statement);
    
    //bind parameters using variable unpacking (PHP 5.6+), assuming `$typedata` actually contains the proper types.
    $stmt->bind_param($typedata, ...$values);
    
    $stmt->execute();
    $stmt->close();
    echo "inserted";
}

您似乎将单个字符串绑定为 bind_param() 中的第二个参数。此方法通过引用获取多个变量并将它们绑定到查询中的占位符,并且由于您绑定了单个字符串,因此绑定参数的数量不匹配。

您需要将值存储在一个数组中,然后使用 .

解压它们
if (count($fields) == count($values)) {
    $fielddata = implode(", ", $fields);
    $questions = rtrim(str_repeat("?, ", count($values)), ", ");

    $statement = "INSERT INTO ".$table." (".$fielddata.") VALUES (".$questions.")";
    $stmt = $db->prepare($statement);
    $stmt->bind_param(str_repeat("s", count($values)), ...$values);
    $stmt->execute();
}

此外,类型应该是一个字母列表,表示每个被绑定变量的类型。最好的情况是将它们全部绑定为字符串,因此只需为每个绑定变量重复 s

注意 SQL 注入。您需要确保字段名称已正确列入白名单。如果这些可以是任意值,您可能容易受到 SQL 注入的攻击。