You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

表单提交后bookings表更新正常,events表未更新的技术求助

问题排查与修复

核心原因:UPDATE语句未执行

你代码里只把更新bookable_events的SQL语句存在了$query变量中,但根本没调用mysqli_query()去执行这条命令——这就是该表没同步更新的直接原因。

修复方案

1. 先执行UPDATE语句

在定义$query之后,必须调用mysqli_query($link, $query)运行更新命令,同时要检查执行结果,避免更新失败却没报错的情况。

2. 优化建议(更安全可靠)

  • 用事务保证「插入预订记录」和「更新门票销量」两个操作要么都成功,要么都失败,防止数据不一致;
  • 换成预处理语句,比手动转义更安全,能彻底规避SQL注入风险;
  • 修正数据类型:$total别用字符串"60",直接用数值60更稳妥,避免潜在类型转换错误。

修复后的完整代码

<?php
/* 保存预订信息到数据库并同步更新门票销量 */
function queryMysqli($mysql_table, $bevent_id,$bevent_price,$att1title,$att1firstname,$att1surname,$att1email, $att1phone,$people,$payment,$dietry,$message) {

    $total = 60;
    $grandtotal = $total + $people;

    $error_exists = false;
    $error_mysql = "";

    // 连接数据库
    $link = mysqli_connect(SERVER, USER, PASSWORD, DATABASE);
    if (mysqli_connect_error()) {
        $error_mysql = "数据库连接失败 (" . mysqli_connect_errno() . ") " . mysqli_connect_error();
        return $error_mysql;
    }
    mysqli_set_charset($link, 'utf8');

    // 开启事务,保证操作原子性
    mysqli_begin_transaction($link);

    try {
        // 插入预订记录到bookings表(预处理语句防注入)
        $insertStmt = mysqli_prepare($link, "INSERT INTO `$mysql_table`(
            `bevent_id`, `bevent_price`, `att1title`, `att1firstname`, `att1surname`,
            `att1email`, `att1phone`, `people`, `payment`, `dietry`, `message`
        ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
        
        mysqli_stmt_bind_param($insertStmt, "sssssssssss", 
            $bevent_id, $bevent_price, $att1title, $att1firstname, $att1surname,
            $att1email, $att1phone, $people, $payment, $dietry, $message
        );
        mysqli_stmt_execute($insertStmt);

        $row_id = mysqli_insert_id($link);

        // 执行更新已售门票数的操作
        $updateStmt = mysqli_prepare($link, "UPDATE `bookable_events` SET `sold` = ? WHERE `bevent_id` = ?");
        mysqli_stmt_bind_param($updateStmt, "is", $grandtotal, $bevent_id);
        mysqli_stmt_execute($updateStmt);

        // 检查是否有匹配的活动被更新,避免bevent_id不存在的情况
        if (mysqli_stmt_affected_rows($updateStmt) === 0) {
            throw new Exception("找不到对应ID为 $bevent_id 的活动");
        }

        // 提交事务
        mysqli_commit($link);
    } catch (Exception $e) {
        // 出错就回滚,保证数据一致
        mysqli_rollback($link);
        $error_exists = true;
        $error_mysql = "操作失败: " . $e->getMessage();
    }

    mysqli_close($link);
    return $error_exists ? $error_mysql : $row_id;
}
?>

额外业务逻辑提醒

如果你的sold字段是累计已售数量(不是固定60加当前预订人数),那更新逻辑应该改成累加,而不是覆盖:

UPDATE `bookable_events` SET `sold` = `sold` + ? WHERE `bevent_id` = ?

这样每次预订都会把当前人数加到已售数量里,更符合实际业务场景。

内容的提问来源于stack exchange,提问作者Tilly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 22:47:38