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

Concatenate query in MySqli prepared statement PHP

我有一个要插入到 table 中的项目列表,其中包含一系列 INSERT 查询。 我正在使用 MySQL 和 PHP.

我收到带有 POST 的练习名称列表(以逗号分隔),并希望将它们保存在数据库中,并将它们与一个 ID 相关联(我也从 POST 收到)。

而不是 运行 多个 INSERT 查询,我想准备一个唯一的查询并只使用一个 运行,这样整个查询 运行s 或失败。

这是我的代码。

$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;
    }
}

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

$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();