在 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 注入的攻击。
我尝试了多种方法来创建将动态数组值绑定到 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 注入的攻击。