PHP通过配置文件变量连接SQL出现访问拒绝错误,求助排查
这个问题的核心是PHP中相对路径是基于当前执行脚本的工作目录,而不是包含它的文件的目录,咱们一步步拆解来理清楚:
为什么会出现密码为空的错误?
当loginCode.php(位于admin/目录)调用db_functions.php(位于public_html/目录)时,db_functions.php里的parse_ini_file('../config.ini')会以loginCode.php的执行目录(也就是admin/)为基准解析路径,最终变成admin/../config.ini——也就是public_html/config.ini,但你的config.ini实际在root/目录下,所以这个路径根本找不到配置文件!
当parse_ini_file找不到文件时会返回false,此时$config['password']属于未定义状态,传递给mysqli_connect的密码参数为空,自然就会报Access denied ... (using password: NO)的错误。
为什么其他场景能正常工作?
对应你测试的几种情况逐一分析:
- 把db_functions的代码复制到loginCode.php并改路径:此时
parse_ini_file('../../config.ini')是以loginCode.php的目录(admin/)为基准,../../会直接定位到root/,能正确找到config.ini。 - 把loginCode.php移到public_html目录:此时调用
db_functions.php时,db_functions里的../config.ini是以public_html/为基准,../直接指向root/,路径完全正确。 - 把db_functions.php移到admin目录:这种情况如果没改路径理论上会出错,但你说能正常工作,大概率是移过去时顺手调整了路径,本质还是路径基准匹配上了配置文件的位置。
解决方案:使用绝对路径(推荐)
在db_functions.php里,用PHP的__DIR__常量构建绝对路径,这个常量表示当前文件所在目录的绝对路径,不管哪个脚本调用它,路径解析都是准确的。
修改db_functions.php里的配置文件加载行:
$config = parse_ini_file(__DIR__ . '/../config.ini');
__DIR__在这里就是public_html/的绝对路径,加上/../config.ini正好指向root/config.ini,完美解决路径问题。
另外,建议加个判断确保配置文件加载成功,避免后续的隐性错误:
$config = parse_ini_file(__DIR__ . '/../config.ini'); if (!$config) { die("Failed to load configuration file"); }
内容的提问来源于stack exchange,提问作者software developer

