【问题标题】:php binding dynamic number of variables for batch insert queryphp绑定动态数量的变量以进行批量插入查询
【发布时间】:2016-01-25 09:31:19
【问题描述】:

我有一个网络服务,用户可以在其中传递动态数量的问题。

在 php 方面,我使用了 ?去掉每个问题。然后我需要进行批量插入。

到目前为止我所做的如下:

$checkInQs = explode("?", trim($_POST['checkInQs'], "?"));
    $checkInSql = "INSERT INTO CheckListQs (ID, GeofenceID, type, question) VALUES ";
    $checkInInsertQuery = array();
    $checkInInsertData = array();
    foreach($checkInQs as $q){
         $checkInInsertQuery[] = "('',?, 1, ?)";
         $checkInData[] = $geofenceID;
         $checkInData[] = $q;
    }

基于另一个类似的例子,下面是如何用 pdo 完成它:

if (!empty($checkInInsertQuery)) {
        $checkInSql .= implode(', ', $checkInInsertQuery);
        $stmt = $db->prepare($checkInSql);
        $stmt->execute($checkInData);
    }

我不确定如何在我的情况下绑定参数。我正在使用程序绑定。我通常会像这样绑定参数:

mysqli_stmt_bind_param($stmt, "is", $geofenceID, $question);
mysqli_stmt_execute($stmt);

我认为类型部分很简单:

$bindVar = '';

for ($i = 0; $i < count($checkInQs); $i++){
    $bindVar .= "is";
}

但不是我不确定如何管理其余数据的传递?

【问题讨论】:

    标签: php mysql mysqli prepared-statement bulkinsert


    【解决方案1】:

    最后,我选择利用事务、提交和回滚来获得我想要的结果:

    mysqli_query($con, "start transaction;");
    
    $allQueriesOK = true;
    $checkInQs = explode("?", trim($_POST['checkInQs'], "?"));
    $checkInSql = "INSERT INTO CheckListQuestions (ID, GeofenceID, type, question) VALUES ('',?,0,?)";
    mysqli_stmt_prepare($stmt, $checkInSql);
    
    foreach ($checkInQs as $q) {            
        mysqli_stmt_bind_param($stmt, "is", $geofenceID, $q);
            if (!mysqli_stmt_execute($stmt)){
                $allQueriesOK = false;
                $message = mysqli_error($con);
                break;
            }
        }
    
        mysqli_stmt_close($stmt);
    
        if ($allQueriesOK){
            mysqli_query($con, "commit;");
        }
        else{
            mysqli_rollback($con);
        }       
    

    【讨论】:

    • 如果这与批量插入的速度几乎一样快,我会感到惊讶,但出于好奇,它对您来说表现良好吗?
    • @DanFarrell 这对我的需要来说很好。通常每个 ws 调用只有 3-5 次插入,所以对我来说没问题。如果我得到关于如何安全地将参数绑定到动态查询的答案,我仍然很乐意更改为批量插入准备好的语句
    猜你喜欢
    • 2023-01-14
    • 2010-10-14
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多