迁移至AWS Docker LAMP环境后,MySQL可UPDATE却无法执行INSERT INTO?
嘿,我之前迁移Docker化的LAMP环境时也踩过类似的坑!结合你说的情况——后台能修改文章但没法新增,phpMyAdmin却能正常执行INSERT,大概率是这几个方向的问题,一个个排查就行:
1. 数据库用户权限不匹配
先确认下网站后台用的数据库账号和phpMyAdmin的是不是同一个?如果不是,那后台的账号很可能没有被授予INSERT权限——毕竟迁移的时候很容易漏了权限配置。
- 进MySQL容器执行:
SHOW GRANTS FOR '你的网站DB账号'@'%'; - 要是结果里没看到
INSERT权限,就补授权:GRANT INSERT ON 你的目标数据库.* TO '账号'@'%';然后别忘了执行FLUSH PRIVILEGES;生效。
2. 容器映射目录的权限坑
网站新增内容时,会不会涉及上传附件(比如文章配图)或者生成临时文件?Docker里的Apache/PHP进程一般用www-data用户运行,要是你本地映射到容器的目录权限不对,进程写不了文件,会触发隐性错误打断INSERT操作。
- 进容器看目录权限:
ls -l /var/www/html/重点看后台的上传目录(比如uploads/)是不是属于www-data:www-data - 不对的话就改:
chown -R www-data:www-data /var/www/html/uploads/ - 另外也检查下PHP的
upload_max_filesize和post_max_size,要是值太小,提交表单时会静默失败,加个phpinfo()页面就能看到这些参数。
3. 没开PHP错误日志,隐性报错被吞了
有时候后台的INSERT操作因为PHP代码报错(比如变量未定义、SQL拼接错了)中断,但前端没提示,看起来像是没执行;而phpMyAdmin是直接跑SQL,所以不受影响。
- 打开容器里的
php.ini,把display_errors设为On,error_reporting设为E_ALL,重启Apache容器后再试新增,就能看到具体报错了 - 也可以直接看Apache的错误日志:
cat /var/log/apache2/error.log,里面大概率藏着问题线索。
4. MySQL的SQL模式限制
AWS Docker里的MySQL默认SQL模式可能和你之前的虚拟主机不一样,比如开了STRICT_TRANS_TABLES或者NO_AUTO_VALUE_ON_ZERO,导致INSERT时因为字段默认值、非空约束等问题失败。
- 执行
SELECT @@sql_mode;对比之前旧主机的SQL模式,差异大的话就改MySQL配置文件里的sql_mode,重启MySQL容器就行。
5. 事务代码没提交
如果后台新增逻辑用到了数据库事务,可能代码里只开了事务但忘了commit(),或者遇到异常后回滚了但没给前端提示。
- 翻下后台的代码,找INSERT相关的逻辑,看看有没有
commit()语句,或者有没有try-catch块吞掉了异常信息。
6. 容器网络的隐性验证
虽然网站能读数据库,但偶尔Docker的bridge网络会导致数据库连接的某些特性异常,你可以在Web容器里直接用后台的DB账号执行INSERT,验证下是不是代码的问题:
mysql -u 你的DB账号 -p 目标数据库 -e "INSERT INTO 你的表名 (字段名) VALUES ('测试内容');"
要是这条命令能成功,那问题肯定在网站代码里;要是失败,就回到前面的权限/模式排查。
内容的提问来源于stack exchange,提问作者F. Esposito

