在mysql准备语句PHP中连接查询



我想在表中插入一个包含insert查询的项列表。我使用MySQL和PHP。

我收到练习名称列表与POST(以逗号分隔),并希望将它们保存在DB中,将它们关联到ID(我也从POST接收)。

与其运行几个INSERT查询,我想准备一个唯一的查询,只使用一次运行,以便整个查询运行或失败。

这是我的代码。

$exList= $_REQUEST['exList']; 
$routineID = $_REQUEST['routineID'];
$arrayEx = explode(',', $exList);
$countEx=count($arrayEx);
$placeholdersEx = implode(',', array_fill(0, $countEx, '?'));
$bindStrEx = str_repeat('si', $countEx);
$queryEx = str_repeat('INSERT INTO exercises_x_routines(exerciseID, routineID) VALUES(?,?);' ,$countEx);
$arrayRoutine = array_fill(0,$countEx,$routineID);
$stmt = mysqli_prepare($con, substr($queryEx, 0, -1));
mysqli_stmt_bind_param($stmt, $bindStrEx, ...$arrayEx,...$arrayRoutine));
if (!mysqli_stmt_execute($stmt))
{
//print mysqli_error($con);
$output[]=array("code" => 3003, "error" => mysqli_error($con));
print(json_encode($output));
mysqli_close($con);
exit;
}

然而,我不知道为什么,但是查询执行不成功,我没有从mysqli_error得到任何错误描述。

不能准备多个查询。相反,您可以只准备一次查询,然后多次执行它:

$exList= $_REQUEST['exList']; 
$routineID = $_REQUEST['routineID'];
$arrayEx = explode(',', $exList);
$queryEx = 'INSERT INTO exercises_x_routines(exerciseID, routineID) VALUES(?,?)';
$stmt = $con->prepare($queryEx);
$stmt->bind_param('si', $ex, $routineID);
foreach ($arrayEx as $ex) {
if (!$stmt->execute()) {
$output[]=array("code" => 3003, "error" => $con->error);
print(json_encode($output));
$con->close();
exit;
}
}

如果您想有效地使这是一个单一的插入,而不改变表,如果任何插入失败,您可以使用事务:

$con->beginTransaction();
foreach ($arrayEx as $ex) {
if (!$stmt->execute()) {
$output[]=array("code" => 3003, "error" => $con->error);
print(json_encode($output));
$con->rollBack();
$con->close();
exit;
}
}
$con->commit();

最新更新