PDO DELETE语句无法生效问题排查求助
排查PDO DELETE语句失效的问题
别急,咱们一步步来找出问题所在,你的DELETE语句没生效大概率是这几个原因:
1. 直接拼接$_GET参数导致的语法错误/安全风险
你直接把$_GET[d]拼进SQL语句里,不仅有严重的SQL注入风险,还可能因为username里的特殊字符(比如单引号')导致SQL语法错误,而且PDO默认是静默模式,出错了也不会主动提示你。
解决方法:用PDO预处理语句绑定参数
这是最安全也最可靠的写法,还能彻底避免语法拼接问题:
// 先开启PDO错误提示,方便排查问题 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); try { // 准备预处理语句 $deleteStmt = $db->prepare("DELETE FROM Projet_Client WHERE username = :username"); // 绑定参数,指定参数类型为字符串 $deleteStmt->bindParam(':username', $_GET['d'], PDO::PARAM_STR); // 执行语句 $deleteStmt->execute(); // 检查受影响行数,确认是否真的删除了记录 if ($deleteStmt->rowCount() > 0) { echo "<div class='alert alert-success text-middle'><strong>Succès</strong>, le client a été supprimé.</div>"; } else { echo "<div class='alert alert-warning text-middle'><strong>Avertissement</strong>, aucun client avec ce username n'existe.</div>"; } } catch(PDOException $e) { // 捕获错误并显示具体信息 echo "<div class='alert alert-danger text-middle'><strong>Erreur</strong>: " . $e->getMessage() . "</div>"; }
2. PDO错误模式未开启,看不到报错
默认情况下PDO不会主动抛出错误,就算SQL写错了、权限不够,你也只会看到自己写的成功提示,但实际操作根本没执行。上面的代码已经加了开启错误模式的语句,这样任何数据库错误都会被捕获并显示出来,帮你快速定位问题。
3. 确认$_GET['d']的实际值是否正确
可能你传递的参数值和数据库里的username不匹配:
- 先加一句
var_dump($_GET['d']);看看实际拿到的参数是什么,是不是和数据库里的记录完全一致 - 注意大小写问题:如果你的数据库表是区分大小写的引擎(比如Linux下的MySQL用了
utf8_bin编码),username的大小写不匹配也会导致删不到数据
4. 数据库权限或表/字段名错误
- 检查连接数据库的账号有没有
DELETE权限,有些账号只有SELECT权限,执行DELETE会静默失败 - 确认表名
Projet_Client、字段名username拼写完全正确,有没有少写字母或者大小写错误
按照上面的方法排查,应该就能找到问题啦!
内容的提问来源于stack exchange,提问作者Maneta Alexandre Maneta
相关产品推荐
相关产品推荐

