问题描述
这是我的代码
$bindParams = [
'name1' => 'Law','name2' => 'King'
];
$sql = "INSERT INTO users (name) VALUES (:name1),(:name2);";
$db->prepared_query($sql,$bindParams);
class Database
{
public function __construct
(
public \PDO $PDO
)
{}
public function prepared_query(string $sql='',$bindParams=[]): bool
{
$stmt = $this->PDO->prepare($sql);
if(count(value:$bindParams) !=0)
{
foreach ($bindParams as $k => $v)
{
$stmt->bindParam(param:":$k",var:$v);
}
}
$x = $stmt->execute();
if($x)
{
return true;
}else{
return false;
}
}
}
我面临的问题是,在 foreach 循环中,具有键 name2 和 value king 的数组 $bindParams 中的第二个值覆盖了 $stmt->bindParam 并且只有 name2 king 被插入到数据库中。对于每次插入,我都在数据库中成为王者。这是数据库的屏幕截图。如何在不重复的情况下成功插入数组中的两条记录。
解决方法
您可以简单地在 execute()
中传递参数。无需使用 bindParam()
,它通过引用绑定并会在循环内覆盖您的值。
用这个替换你的代码:
public function prepared_query(string $sql,array $bindParams=[]): void
{
$stmt = $this->PDO->prepare($sql);
$stmt->execute($bindParams);
}
如果你真的想要一个你真的不需要的循环,那么你必须按值绑定,而不是按引用绑定。例如
public function prepared_query(string $sql,array $bindParams = []): void
{
$stmt = $this->PDO->prepare($sql);
foreach ($bindParams as $param => $var) {
$stmt->bindValue($param,$var);
}
$stmt->execute();
}