2016-01-25 3 views
2

У меня есть веб-служба, в которой пользователь передает динамическое количество вопросов.php binding динамическое число переменных для запроса вставки пакета

На стороне 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"; 
} 

Но не я не знаю, как управлять переходящим в остальной части данных?

ответ

0

В конце концов, я решил использовать сделки, совершает и откаты, чтобы получить нужный мне результат:

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); 
    }  
+0

Я был бы удивлен, если бы это было где-нибудь рядом с такой скоростью, как массовая вставка, но из любопытства, хорошо ли он вам помог? –

+0

@ DanFarrell Это было хорошо для того, что мне было нужно. Обычно там было бы всего 3-5 вставок на вызов ws, поэтому он работал нормально для меня. Я все равно с удовольствием перейду к основному вставке, если я получил ответ о том, как безопасно связывать параметры с динамическим запросом – user2363025