微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何使用 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();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。