为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕森王 2022-07-29 15:17:36
我正在尝试生成将插入多行的单个插入语句。我有一个值数组,这就是我想要插入到所有使用相同的表中的值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);    }
查看完整描述

2 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

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


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,

]


查看完整回答
反对 回复 2022-07-29
?
ITMISS

TA贡献1871条经验 获得超8个赞

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);

}



查看完整回答
反对 回复 2022-07-29
  • 2 回答
  • 0 关注
  • 89 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信