SQL INSERT/UPDATE在XAMPP正常但网站服务器不生效问题求助
问题排查与解决思路
1. 开启PDO错误抛出(优先排查,无报错核心原因)
当前PDO初始化未配置错误模式,默认静默失败,线上环境关闭错误显示后自然无日志输出。修改DB.php的PDO初始化代码,开启错误抛出即可看到具体报错:
$ConnectingDB = new PDO($DSN,'myUsername','myPass', array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8", PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION // 新增错误抛出配置 ) );
开启后复现操作,就能直接在error_log中看到SQL执行失败的具体原因。
2. 修正DSN配置错误
当前DSN中存在两个明显问题:
useUnicode、characterEncoding、useFastDateParsing是Java JDBC的连接参数,MySQL PDO完全不识别这些参数- 参数间的多余空格(
host = localhost中的空格)在PHP7.3低版本中会导致连接参数解析异常
修正后的规范DSN写法:
$DSN='mysql:host=localhost;dbname=myDB;charset=utf8';
DSN中直接指定charset是更稳定的写法,原有SET NAMES配置可删除。
3. 检查数据库账号权限
确认线上使用的myUsername账号是否对myDB库的admins表有INSERT、UPDATE权限,很多线上环境为了安全默认只给业务账号开通SELECT权限。
可登录线上MySQL执行以下命令验证权限:
SHOW GRANTS FOR 'myUsername'@'localhost';
如果没有写入权限,用root账号执行授权即可:
GRANT INSERT,UPDATE ON myDB.admins TO 'myUsername'@'localhost'; FLUSH PRIVILEGES;
4. 修正代码逻辑缺陷
- 执行
header("Location: login.php");后未加exit;终止代码执行,PHP发送跳转头后仍会运行后续代码,若后续存在事务回滚、变量覆盖逻辑,会导致已执行的写入操作被撤销,修改如下:
$Execute=$stmt->execute(); header("Location: login.php"); exit; // 必须新增,终止后续代码运行
- 若代码中开启了事务,需确认执行完INSERT/UPDATE后调用了
$ConnectingDB->commit()提交事务,否则脚本结束后会自动回滚未提交的写入操作。
5. 验证前端逻辑影响
你提供的JS过渡代码只会拦截<a>标签的点击事件,若你使用常规<button type="submit">提交表单,这段JS不会产生任何影响。若你使用<a>标签触发表单提交,需确认点击事件未被JS拦截、导致表单未提交就跳转。
内容的提问来源于stack exchange,提问作者Ivan Sibinovic
相关产品推荐
相关产品推荐

