如何使用 PDO 准备语句绑定多个值?

问题描述

这是我的代码

$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 被插入到数据库中。对于每次插入,我都在数据库中成为王者。这是数据库的屏幕截图。如何在不重复的情况下成功插入数组中的两条记录。

enter image description here

解决方法

您可以简单地在 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();
}