表单提交后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
相关产品推荐
相关产品推荐

