我刚开始研究一个遗留的 PHP 应用程序,发现自己在与一种奇怪的行为作斗争。我将尝试解释场景/代码/错误:
所有查询都通过一个单例类执行,该类打开一个连接并在整个会话中保持打开状态(据我所知代码)
每次 a
mysql_query
返回时false
,都会引发异常。许多查询执行“很好”,甚至抱怨不存在表(我的任务之一是清理混乱的剪辑器继承数据库方案,所以我正在运行代码并根据需要创建表)。创建缺失表后,查询通常运行良好。
一些查询返回
1045
错误:Access denied for user 'appuser'@'localhost' (using password: YES)
这是“奇怪”的行为:
我已经在我的 MySQL 安装中启用了常规日志,但是没有提到拒绝访问错误。应用程序查询似乎运行良好(我说“似乎”是因为我实际上在理解日志格式的某些部分时遇到了问题)。
在单例类中配置的用户名/密码是可以的。我可以使用 MySQL CLI 界面登录,除了许多其他查询运行良好。如果我尝试在 MySQL CLI 上使用错误的用户名/密码,则拒绝访问会正确记录在常规日志中。
抛出异常的堆栈跟踪(显然是在 PHP 中)表明异常确实来自处理查询的单例类。
“拒绝”查询中似乎没有模式。它们是大
SELECT
查询,但仅此而已。有些有LEFT OUTER
连接,有些有 24 个FROM
子句。我正在记录
mysql_stat
每个查询的结果,它会在工作查询和失败查询之前打印服务器状态。虽然,我不确定这个函数是否真的依赖于与 MySQL 服务器的有效凭证/会话。
那么,你们认为这里发生了什么?有什么线索吗?任何有根据的猜测?
如果有人需要更多信息/背景,我很乐意提供...... :)