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

