AJAX请求时parse_ini_file读取config.ini失败,非AJAX场景正常求助
问题:AJAX请求时无法读取config.ini文件导致数据库连接失败
我在编写AJAX请求时,服务器返回如下错误:
Warning: parse_ini_file(config/config.ini): Failed to open stream: No such file or directory in C:\xampp\htdocs\php\eindwerk\src\Promptopolis\Framework\Db.php on line 9
该错误导致无法解析config.ini文件,进而无法建立数据库连接。但页面在发起AJAX请求前,能正常从数据库获取并展示数据,说明非AJAX场景下config.ini可被正常解析,不清楚为何仅AJAX请求时出现解析失败的问题。
相关代码
DB.php
<?php namespace Promptopolis\Framework; abstract class Db { private static $conn; private static function getConfig(){ // get the config file return parse_ini_file("config/config.ini"); } public static function getInstance() { if(self::$conn != null) { // REUSE our connection return self::$conn; } else { // CREATE a new connection // get the configuration for our connection from one central settings file $config = self::getConfig(); $database = $config['database']; $user = $config['user']; $password = $config['password']; $host = $config['host']; self::$conn = new \PDO("mysql:host=$host;dbname=".$database, $user, $password); return self::$conn; } } }
前端脚本
<script> //add click event to voted button const voted = document.querySelector('[name="voted"]'); //add eventlistener voted.addEventListener('click', (e) => { e.preventDefault(); //get user id let user_id = <?php echo $id ?>; //create formdata object let formData = new FormData(); //append user id to formdata formData.append('user_id', user_id); fetch("ajax/votes.php", { method: "POST", body: formData }) .then(function(response){ return response.json(); }) .then(function(json){ //update counter voting.innerHTML = json.votes; }); }); </script>
votes.php
<?php require_once('../vendor/autoload.php'); if (!empty($_POST)) { $user_id = $_POST['user_id']; $user = new \Promptopolis\Framework\User(); $moderator = new \Promptopolis\Framework\Moderator(); $moderator->updateVotes($user_id); $user->checkAdmin($user_id); $votes = $user->getVotes($user_id); $result = [ "status" => "success", "message" => "Vote was saved", "votes" => $votes ]; echo json_encode($result); }
解决方案
问题核心是相对路径的工作目录差异:
- 非AJAX请求时,入口文件(比如
index.php)位于项目根目录,此时config/config.ini的相对路径指向正确的文件位置。 - AJAX请求的入口是
ajax/votes.php,此时PHP的工作目录变为ajax/,程序会去ajax/config/config.ini寻找文件,自然找不到。
提供两种可靠的解决方法:
方法1:使用文件绝对路径定位配置文件
修改Db.php中的getConfig方法,利用__DIR__常量(当前PHP文件所在的绝对路径)来定位config.ini:
private static function getConfig(){ // 从Db.php所在目录回退到项目根目录,再指向config.ini $configPath = __DIR__ . '/../../../../config/config.ini'; return parse_ini_file($configPath); }
注:../../../../的层级需要根据你的项目目录结构调整,确保最终指向项目根目录下的config/config.ini。
方法2:定义项目根目录常量
在所有入口文件(比如index.php和ajax/votes.php)顶部添加根目录常量定义:
// 对于ajax/votes.php,回退到项目根目录 define('PROJECT_ROOT', realpath(__DIR__ . '/../')); // 对于项目根目录下的index.php,直接用当前目录 // define('PROJECT_ROOT', __DIR__);
然后修改Db.php中的getConfig方法:
private static function getConfig(){ return parse_ini_file(PROJECT_ROOT . '/config/config.ini'); }
两种方法都能确保无论哪个入口文件执行,都能精准定位到config.ini文件,解决路径错误问题。
内容的提问来源于stack exchange,提问作者Tibo Mertens
相关产品推荐
相关产品推荐

