PHP执行MySQL查询仅首个生效:Delete成功但Update失败求助
问题分析与修复方案
首先,你的第二个UPDATE语句不生效,核心问题出在WHERE子句的字段匹配错误,还有几个潜在的语法和安全问题,我给你逐一拆解:
1. 最直接的原因:WHERE条件字段不匹配
你从$_SESSION['user_id']拿到的是用户ID(通常是数字类型),但你的UPDATE语句里写的是:
mysqli_query($conn, "UPDATE users SET post = post - 1 WHERE username=$user_id");
这里用username字段去匹配$user_id,如果你的users表中,存储用户唯一标识的字段是id或者user_id(而不是username),那这个条件根本找不到对应的用户行,UPDATE自然不会生效。
修复方法:
根据你的表结构修正WHERE条件,比如如果用户ID存在id字段里,改成:
mysqli_query($conn, "UPDATE users SET post = post - 1 WHERE id = $user_id");
如果确实是用username匹配,那$user_id应该是用户名(字符串类型),必须加单引号包裹,否则SQL会把它当成数字解析:
mysqli_query($conn, "UPDATE users SET post = post - 1 WHERE username = '$user_id'");
2. 语法错误:第一个DELETE语句的引号未闭合
你写的DELETE语句末尾少了一个双引号:
mysqli_query($conn,"Delete from post where id=".$_POST['post_id'].");
正确的写法应该是:
mysqli_query($conn,"Delete from post where id=".$_POST['post_id']."");
虽然你说DELETE能执行,可能是输入时的笔误,但这个语法错误可能会影响后续代码的执行,必须修正。
3. 严重安全问题:SQL注入风险
直接把$_POST['post_id']和$user_id拼接到SQL语句里,会导致严重的SQL注入攻击风险。建议使用预处理语句来避免这个问题,同时也能避免引号、类型转换之类的语法错误。
示例代码(用预处理语句重构):
<?php session_start(); $user_id = $_SESSION['user_id']; // 处理删除请求 if($user_id && !empty($_POST['post_id'])){ include 'connect.php'; // 1. 处理POST删除 $deleteStmt = mysqli_prepare($conn, "DELETE FROM post WHERE id = ?"); mysqli_stmt_bind_param($deleteStmt, "i", $_POST['post_id']); mysqli_stmt_execute($deleteStmt); // 2. 更新用户的post计数 $updateStmt = mysqli_prepare($conn, "UPDATE users SET post = post - 1 WHERE id = ?"); mysqli_stmt_bind_param($updateStmt, "i", $user_id); mysqli_stmt_execute($updateStmt); // 检查执行结果(可选,用于调试) if(mysqli_stmt_affected_rows($updateStmt) == 0){ echo "没有找到匹配的用户,更新失败"; // 可以在这里添加日志或其他处理 } } header("Location: ."); ?>
4. 调试建议:添加错误处理
在开发阶段,你可以给每个SQL执行添加错误检查,这样能快速定位问题:
// 执行UPDATE后检查错误 $updateResult = mysqli_query($conn, "UPDATE users SET post = post - 1 WHERE id = $user_id"); if(!$updateResult){ die("UPDATE执行失败: " . mysqli_error($conn)); }
这样如果SQL有语法错误或者字段不存在,会直接输出错误信息,帮助你排查问题。
内容的提问来源于stack exchange,提问作者Hurrem
相关产品推荐
相关产品推荐

