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

CodeIgniter连接MariaDB报错:Access denied for user 'codeI'@'localhost'

解决CodeIgniter连接MariaDB报Access Denied的问题

以下是针对你遇到的问题的排查和解决步骤:

1. 强制指定连接方式(Socket/TCP)

命令行和Python可能默认用Unix Socket连接本地数据库,而PHP(包括CodeIgniter)可能默认走TCP/IP,两种连接方式对应的主机权限是分开的:

  • 若用Socket连接:找到MariaDB的Socket路径(通常是/var/run/mysqld/mysqld.sock或/tmp/mysql.sock),在app/config/Database.php中添加socket参数:
    $default = [
        'hostname' => 'localhost',
        'username' => 'codeI',
        'password' => '1234',
        'database' => 'DBSite',
        'DBDriver' => 'MySQLi',
        'socket'   => '/var/run/mysqld/mysqld.sock', // 替换为你的实际Socket路径
        // 其他原有配置保持不变
    ];
    
  • 若用TCP/IP连接:将hostname改为127.0.0.1,强制走TCP协议:
    'hostname' => '127.0.0.1',
    

2. 验证用户权限的主机范围

执行以下SQL查看用户codeI的权限主机:

SELECT user, host FROM mysql.user WHERE user = 'codeI';
  • 如果只有codeI@localhost(对应Socket连接),但PHP用TCP的话,需要添加127.0.0.1的权限:
    GRANT ALL PRIVILEGES ON DBSite.* TO 'codeI'@'127.0.0.1' IDENTIFIED BY '1234';
    FLUSH PRIVILEGES;
    
  • 反之,如果只有codeI@127.0.0.1,则需要添加localhost的权限。

3. 检查PHP扩展的Socket配置

查看PHP的php.ini文件,确认mysqli.default_socket或mysql.default_socket的值是否和MariaDB的Socket路径一致。如果不一致,要么修改php.ini,要么直接在CodeIgniter配置中指定socket参数(步骤1)。

4. 测试独立PDO连接验证

用单独的PHP脚本测试连接,明确指定连接方式,定位问题:

  • TCP连接测试:
    <?php
    try {
        $pdo = new PDO('mysql:host=127.0.0.1;dbname=DBSite', 'codeI', '1234');
        echo "连接成功";
    } catch (PDOException $e) {
        echo $e->getMessage();
    }
    
  • Socket连接测试:
    <?php
    try {
        $pdo = new PDO('mysql:unix_socket=/var/run/mysqld/mysqld.sock;dbname=DBSite', 'codeI', '1234');
        echo "连接成功";
    } catch (PDOException $e) {
        echo $e->getMessage();
    }
    

哪种方式能成功,就对应到CodeIgniter的配置中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 01:03:16