【问题标题】:How can I insert multiple values using a loop?如何使用循环插入多个值?
【发布时间】:2018-04-11 08:03:22
【问题描述】:

这是我的代码:

$post_id = 10;
$tags_id = [23, 55, 155, 15];

$stmt = $dbh_conn->prepare("INSERT INTO post_tags  (post_id, tag_id) VALUES (?, ?)");
$stmt->execute([$post_id, $tags_id[0]]);
if ( !$stmt->rowCount() ){
    throwErrorMessage("Something went wrong while inserting tags");
}

如您所见,我的代码只插入一行。我可以计算count($tags_id) 的数量并根据该数字复制粘贴整个代码。但这种方法对我来说似乎并不好。知道在其上使用循环的最佳方法是什么吗?

【问题讨论】:

    标签: php mysql sql loops


    【解决方案1】:

    准备一次并循环插入:

    $stmt = $dbh_conn->prepare("INSERT INTO post_tags  (post_id, tag_id) VALUES (?, ?)");
    foreach ($tags_id as $tag) {
        $stmt->execute([$post_id, $tag]);
        if ( !$stmt->rowCount() ){
            throwErrorMessage("Something went wrong while inserting tag " . $tag);
        }
    }
    

    【讨论】:

    • 他们是错误的。准备好的语句可以准备一次并多次使用,这就是利润。
    • @MartinAJ 是的,这应该是要走的路
    【解决方案2】:

    你可以……

    A) 使用单个语句并在循环中生成 VALUES (…) 部分。

    $values = [];
    foreach ($tags_id as $tag) {
        $values[] = sprintf( '(%d, %s)', (int)$post_id, $dbh_conn->quote($tag) );
    }
    
    $stmt = $dbh_conn->prepare(
        sprintf(
            'INSERT INTO post_tags  (post_id, tag_id) VALUES %s;',
            implode(',', $values)
        ));
    
    if(!$stmt->execute()) {
        // something went wrong
    }
    

    B) 重复使用每个INSERT 一行的语句并在循环内调用执行。 (如其他答案中所建议)

    【讨论】:

    • 谢谢,如何动态生成values()部分?
    • @MartinAJ 添加了快速示例
    【解决方案3】:

    准备插入查询并执行一次。试试下面的代码,可能会有帮助

    $post_id = 10;
    $tags_id = [23, 55, 155, 15];
    $lastElement = end($tags_id);
    $insert = "INSERT INTO post_tags  (post_id, tag_id) VALUES";
    foreach ($tags_id as $key => $value) 
    {
        if ($value == $lastElement) {
            $insert .= "(".$post_id.", ".$value.")";
        } else {
            $insert .= "(".$post_id.", ".$value."),";
        }        
    }
    $stmt = $dbh_conn->prepare($insert);
    $stmt->execute();
    if ( !$stmt->rowCount() ){
        throwErrorMessage("Something went wrong while inserting tags");
    }
    

    【讨论】:

    • 这么乱的准备语句和直接串联,请不要这样做。
    • 看似复杂,但逻辑很好,谢谢,点赞
    猜你喜欢
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    相关资源
    最近更新 更多