PDO生成占位符,用于从数组和多个INSERT语句的单个值进行绑定

问题描述 投票:2回答:3

我正在尝试生成一个插入语句,该语句将插入多行。我有一个值数组,这是我想要插入到均使用相同userkey的表中的内容。

我尝试使用一个命名的PDO参数并绑定到该参数,然后在执行期间传入角色数组,但这不起作用。因此,我继续使用占位符,但是我也无法使它起作用。

我叫我的函数,例如addUsersRoles(1, [100,101,102]);

并且查看生成的SQL,我得到:

INSERT user_roles (userkey, roleid) VALUES (?,?),(?,?),(?,?)

我认为插入多条记录的正确格式。

基于此,我试图生成的是:

INSERT user_roles (userkey, roleid) VALUES (1,100),(1,101),(1,102)

如何以这种方式结合PDO绑定到SQL语句的功能?

public function addUsersRoles($userkey, $roles = []){

        $in = str_repeat('?,', count($roles) - 1) . '?';

        $base_user_sql = 'INSERT user_roles (userkey, roleid) VALUES ';

        $sql = $base_user_sql;

        foreach ($roles as $role) {
            //$sql .= "(:USERKEY, $in),"; // Didn't Work
            $sql .= "($in),";
        }
        //Remove trailing comma
        $sql = rtrim($sql, ',');

        $db   = static::getDB();

        $stmt = $db->prepare($sql);
        //$stmt->bindValue(':USERKEY', $userkey, PDO::PARAM_STR);
        return $stmt->execute($roles);
    }

我正在尝试生成一个插入语句,该语句将插入多行。我有一个值数组,这就是我想要插入到均使用相同用户键的表中的值。我有...

php mysql pdo
3个回答
1
投票

制作count($roles)时,请勿使用$in。总是?, ?。在所有行重复该操作时,只需要角色计数即可。您可以使用array_fill创建由(?, ?)字符串组成的数组,然后使用implode在它们之间放置逗号。


0
投票

我已经简化了一点,但这分为两个部分,它们一起完成。首先是生成SQL ...


0
投票

您也可以使用占位符。看下面的例子:

© www.soinside.com 2019 - 2024. All rights reserved.