mysql — php привязка динамического числа переменных для запроса пакетной вставки

У меня есть веб-сервис, где пользователь пропускает динамическое количество вопросов.

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

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

2

Решение

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]