好的,既然无法在服务器端改变设置或增加扩展,我们可以采取另一种方法来并发执行SQL语句。这种情况下,比较常见的方法是将多个 SQL 语句放在一个事务中执行,虽然它们会顺序执行,但是在一个事务提交之前都是相互独立的,这样可以保证数据的一致性。
以下是更新后的 PHP 脚本和前端代码:
execute_sql.php
)<?php
header('Content-Type: application/json');
$data = json_decode(file_get_contents("php://input"), true);
require_once 'database.php'; // 包含数据库连接配置文件
// 创建数据库连接
$conn = new mysqli(DB_SERVER, DB_USER, DB_PASS, DB_NAME);
// 检测连接
if ($conn->connect_error) {
die(json_encode(['success' => false, 'error' => "Connection failed: " . $conn->connect_error]));
}
// 开启事务
$conn->begin_transaction();
try {
$sqls = [
"UPDATE fa_ask_question SET title = REPLACE(title, ?, ?) WHERE title LIKE CONCAT('%', ?, '%')",
"UPDATE fa_ask_question SET content = REPLACE(content, ?, ?) WHERE content LIKE CONCAT('%', ?, '%')",
"UPDATE fa_ask_question SET content_fmt = REPLACE(content_fmt, ?, ?) WHERE content_fmt LIKE CONCAT('%', ?, '%')"
];
// 一次预处理所有查询
$stmts = [];
foreach ($sqls as $index => $sql) {
$stmt = $conn->prepare($sql);
$stmt->bind_param("ssss", $data['oldValue'], $data['newValue'], $data['oldValue']);
$stmts[$index] = $stmt;
}
// 执行所有查询
foreach ($stmts as $stmt) {
$stmt->execute();
$stmt->close();
}
// 提交事务
$conn->commit();
echo json_encode(['success' => true]);
} catch (Exception $e) {
$conn->rollback();
echo json_encode(['success' => false, 'error' => $e->getMessage()]);
}
$conn->close();
?>
前端代码部分不需要修改,因为逻辑仍然只是发送请求到服务器。
database.php
)相同,不需要任何修改,只需确保包含了正确的数据库信息。
通过上述PHP脚本的修改,所有的 SQL 语句都会被打包进一个事务中。这意味着如果任何一个 SQL 语句失败,整个事务都会回滚。这样虽然不能实现完全的并行执行,但是提供了一种安全的方式来批量更新数据库记录。当事务中的所有更新顺利完成后才会提交事务,这可以保证数据库状态的完整性。