У меня есть веб-служба, в которой пользователь передает динамическое количество вопросов.
На стороне php я использую explode с? чтобы вырезать каждый вопрос. Затем мне нужно сделать пакетную вставку.
То, что я сделал до сих пор, выглядит следующим образом:
$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"; }
Но не я не уверен, как управлять передачей в остальной части данных?
В конце концов, я решил использовать транзакции, фиксации и откаты для получения желаемого результата:
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); }