PHP查询无法更新数据库记录:客户余额扣除失败问题求助
我帮你梳理几个可能导致这个问题的原因,你可以逐一排查:
更新语句缺失或语法错误
从你贴的代码片段来看,只写到了SELECT credit的开头,很可能还没写后续的UPDATE语句?如果根本没执行更新数据库的代码,那credit肯定不会变。另外就算写了UPDATE,也要检查语法:比如字段名是不是拼错了(比如credits而不是credit)、WHERE条件有没有写对,毕竟只有匹配到对应的customer行,才会更新。WHERE条件不匹配,没找到目标行
你要扣的是发布job的用户(poster_id对应的用户)的credit吗?还是当前登录用户($id)的?如果UPDATE语句里的WHERE条件用错了ID,比如本该用poster_id却用了$id,那数据库找不到要更新的行,自然没变化。参数类型或值有问题
你说accepted_bid是整数类型,但如果从$_POST里取到的是字符串(比如表单提交的是文本),或者里面包含非数字字符,那计算credit - accepted_bid的时候可能会出问题——比如数据库把无效值当成0,等于没扣款。另外要确认credit字段本身是数值类型(INT、DECIMAL之类),如果是字符串类型,减法运算根本无法正常执行。SQL语句没正确执行,没报错提示
PHP默认可能不会显示数据库错误,你可以开启错误提示看看:error_reporting(E_ALL); ini_set('display_errors', 1);另外,如果用了预处理语句,要检查参数有没有正确绑定;如果是直接拼接SQL,可能因为转义问题导致语句失效,比如
accepted_bid里有特殊字符,破坏了SQL结构。事务未提交(如果用了事务)
要是你的代码里开启了数据库事务,但最后忘了执行commit(),那所有更新操作都会回滚,数据库里看不到任何变化。数据库权限不足
连接数据库的账号有没有UPDATE权限?如果没有,执行更新语句会悄悄失败,这时候也得看错误提示才能发现。代码流程被中断
比如更新语句前面有exit()、die(),或者某个条件判断(比如if语句)没满足,导致代码根本没走到更新的步骤。你可以在更新代码前后加个echo "执行到更新了";,看看有没有输出,确认代码是否执行到这里。
快速排查小技巧
把你最终要执行的
UPDATE语句打印出来(比如echo $update_sql;),然后手动复制到数据库客户端(比如phpMyAdmin)里执行,看看能不能生效。如果手动执行有效,那就是代码里的问题;如果手动也没效果,那大概率是表结构或数据本身的问题(比如credit字段是只读的,或者目标行不存在)。
内容的提问来源于stack exchange,提问作者James Wood

