在 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();
我有一个要插入到 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();