PDO 为多个 INSERT 语句从数组和单个值绑定生成占位符

我正在尝试生成将插入多行的单个插入语句。我有一个值数组,这就是我想要插入到所有使用相同的表中的值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);

    }


慕森王
浏览 184回答 2
2回答

BIG阳

您也可以使用占位符。看下面的例子:public function addUsersRoles(string $userKey, array $roles = []): bool {    $values = [];    $inputParameters = [':user_key' => $userKey];    foreach ($roles as $index => $role) {        $rolePlaceholder = ':roleid' . $index;        $values[] = sprintf('(:user_key, %s)', $rolePlaceholder);        $inputParameters[$rolePlaceholder] = $role;     }    $sql = 'INSERT INTO user_roles (user_key, roleid) VALUES ';    $sql .= implode(', ', $values);    $db = static::getDB();    $stmt = $db->prepare($sql);    return $stmt->execute($inputParameters);}此代码将生成如下查询:INSERT INTO user_roles (user_key, roleid) VALUES (:user_key, :roleid0), (:user_key, :roleid1), (:user_key, :roleid2), (:user_key, :roleid3), (:user_key, :roleid4);$inputParameters 将是这样的:[    ':user_key' => 'some user key',    ':roleid0' => 1,    ':roleid1' => 2,]

ITMISS

count($roles)制作时不应该使用$in。它总是只是?, ?。对所有行重复该操作时,您只需要角色计数。您可以使用array_fill创建一个字符串数组(?, ?),然后implode在它们之间放置逗号。您还需要插入创建具有交替键和角色的数组,并在执行时将其用作参数。public function addUsersRoles($userkey, $roles = []){    $values = implode(',', array_fill(0, count($roles), '(?, ?)'));    $base_user_sql = 'INSERT user_roles (userkey, roleid) VALUES ';    $sql = $base_user_sql . $values;    $keys_and_roles = [];    foreach ($roles as $role) {        $keys_and_roles[] = $userkey;        $keys_and_roles[] = $role;    }    $db   = static::getDB();    $stmt = $db->prepare($sql);    return $stmt->execute($keys_and_roles);}
打开App,查看更多内容
随时随地看视频慕课网APP