You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:17:48