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
相关产品推荐
相关产品推荐

