SQL执行返回True但未写入usage表的问题排查求助
问题分析:Signup函数无法插入usage表但无报错
你的代码能成功插入user表,但usage表无数据插入且调试无输出,主要有以下几个可能的原因:
1. 表名usage是MySQL保留关键字
MySQL中usage是内置保留关键字(常用于权限管理语句如GRANT USAGE),直接在SQL语句中使用未转义的表名会导致语法解析失败。但因为PDO默认错误模式为静默模式,不会抛出异常,仅返回执行失败,无法触发你的catch块。
解决方法:给表名加上反引号转义:
$usageQuery = "INSERT INTO `usage` (APIKey, todaysUsage, UsageDate, PremiumDate) VALUES (:APIKey, 0, CURDATE(), :premiumDate)";
2. PDO错误模式未配置为抛出异常
你的代码用了try-catch捕获PDOException,但如果数据库连接时未设置PDO错误模式为ERRMODE_EXCEPTION,PDO执行失败时不会抛出异常,只会静默返回false,导致你无法捕获错误信息。
解决方法:初始化PDO连接时添加以下配置:
$dbs->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
这样执行失败时会直接抛出异常,你就能在catch块中看到具体错误。
3. APIKey违反唯一约束
usage表的APIKey字段设置了唯一索引(UNIQUE KEY APIKey_UNIQUE),如果该APIKey已存在于表中,插入会失败。虽然你是新注册生成的APIKey,但可以检查表中是否已有相同记录。
4. 调试输出被屏蔽
你的调试代码print_r($usageErrorInfo)可能因为后续header("Location:../view/error.php")跳转、输出缓冲未刷新或页面重定向,导致调试内容无法显示。
调试建议:在调试代码后添加exit;终止脚本,确保输出可见:
$usageStatement->execute(); $usageErrorInfo = $usageStatement->errorInfo(); if ($usageErrorInfo[0] !== '00000') { print_r($usageErrorInfo); exit; // 终止脚本,避免跳转 }
额外代码逻辑问题
函数最后返回值逻辑错误:
$rowCount = $statement->rowCount(); if ($rowCount < 0) { return true; } else { return false; }
rowCount()插入成功返回1,失败返回0,永远不会小于0,导致判断逻辑完全错误。应修改为同时检查两张表的插入结果:
$userRowCount = $statement->rowCount(); $usageRowCount = $usageStatement->rowCount(); return ($userRowCount > 0 && $usageRowCount > 0);
内容的提问来源于stack exchange,提问作者Harsh Khatri
相关产品推荐
相关产品推荐

