• 智能AI问答!更聪明、更完整、原创作!
  • 一款基于GPT的超级AI机器人,可以回答问题、聊天、创作、写文案!

改不了服务器 换个方法

发布于 2025-01-19 21:32:17

好的,既然无法在服务器端改变设置或增加扩展,我们可以采取另一种方法来并发执行SQL语句。这种情况下,比较常见的方法是将多个 SQL 语句放在一个事务中执行,虽然它们会顺序执行,但是在一个事务提交之前都是相互独立的,这样可以保证数据的一致性。

以下是更新后的 PHP 脚本和前端代码:

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

Vue.js 前端代码

前端代码部分不需要修改,因为逻辑仍然只是发送请求到服务器。

数据库连接文件(database.php

相同,不需要任何修改,只需确保包含了正确的数据库信息。

通过上述PHP脚本的修改,所有的 SQL 语句都会被打包进一个事务中。这意味着如果任何一个 SQL 语句失败,整个事务都会回滚。这样虽然不能实现完全的并行执行,但是提供了一种安全的方式来批量更新数据库记录。当事务中的所有更新顺利完成后才会提交事务,这可以保证数据库状态的完整性。

0 条评论

发布
问题

在线
客服