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

Docker化Codeigniter4项目mysqli_connect报错求助

问题排查:Docker化Codeigniter4中AJAX脚本无法连接MySQL

错误信息

mysqli::__construct(): (HY000/2002): No such file or directory in <b>/var/www/html/get_koltuk_listesi.php</b> on line <b>13</b><br />

相关代码

数据库连接代码(第13行)

$conn = new mysqli($servername, $username, $password, $dbname,3306);

AJAX请求代码

function getKoltukListesi(plaka, tarih) {    
 var xhr = new XMLHttpRequest();            
var url = "get_koltuk_listesi.php"; 
 xhr.onreadystatechange = function () {                
 if (xhr.readyState == 4) {                    
         if (xhr.status == 200) {                        
               try {                                                     
                    console.log("Response from server:", xhr.responseText);
                    var koltukListesi = JSON.parse(xhr.responseText);
                     koltukListesiniIsle(koltukListesi);                        } 
               catch (e) {                            
                        console.error("Parsing error:", e);                            }                }else {                            
             console.error("Server responded with status code", xhr.status);                    }                }            };
            xhr.open("POST", url, true);            
            xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            var params = "plaka=" + plaka + "&tarih=" + tarih;            
            xhr.send(params);        }

关键背景

  • 仅AJAX调用的独立PHP脚本出现错误,项目其他数据库操作模块正常
  • 本地运行无问题,仅Docker环境下触发错误
  • 确认数据库连接参数与其他正常模块完全一致

原因分析

1. 数据库主机名配置错误

Docker容器环境中,localhost指向容器自身,而非宿主机或数据库容器。项目其他正常的Codeigniter模块大概率使用了Docker服务名(如mysql、db)作为数据库主机名,但这个独立的get_koltuk_listesi.php脚本可能硬编码了localhost或127.0.0.1,导致无法定位到数据库容器。

2. 独立脚本未复用框架配置

Codeigniter的数据库配置通常存放在.env或app/Config/Database.php中,会自动适配Docker环境的服务名。但该AJAX调用的脚本独立于框架,直接硬编码连接参数,未读取框架的环境变量或配置文件,导致参数与框架内的有效配置不一致。


解决方法

方法1:修正数据库主机名

将$servername的值替换为Docker Compose中数据库服务的名称。例如你的docker-compose.yml中数据库服务定义如下:

services:
  db:
    image: mysql:8.0
    # 其他配置...

则$servername应设为'db':

$servername = 'db'; // 替换为你的数据库服务名
$conn = new mysqli($servername, $username, $password, $dbname, 3306);

方法2:复用Codeigniter的数据库配置

在get_koltuk_listesi.php开头引入Codeigniter初始化文件,直接使用框架的数据库连接,避免硬编码参数:

<?php
// 根据项目结构调整路径,引入Codeigniter入口文件
require_once __DIR__ . '/index.php';

// 使用框架自带的数据库连接
$db = \Config\Database::connect();
// 后续查询直接使用$db对象,示例:
// $query = $db->query("SELECT * FROM your_table");

方法3:验证容器网络连通性

确保Web容器与数据库容器处于同一Docker网络:

  • 若使用Docker Compose,默认会自动创建共享网络,无需额外配置
  • 若手动创建容器,需显式将两者加入同一网络:
# 创建共享网络
docker network create ci4-network
# 启动数据库容器时加入网络
docker run --name mysql --network ci4-network -e MYSQL_ROOT_PASSWORD=your_password mysql:8.0
# 启动Web容器时加入同一网络
docker run --name ci4-web --network ci4-network -p 80:80 your_ci4_image

内容的提问来源于stack exchange,提问作者kubicix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 02:20:31