亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 (?,?),(?,?),(?,?)我認為這是插入多條記錄的正確格式?;诖耍蚁胍傻氖牵篒NSERT 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個贊

您也可以使用占位符??聪旅娴睦樱?/p>


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 關注
  • 139 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號