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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 04:17:14