Codeigniter 查询在远程 MySQL 服务器上返回 Null
Posted
技术标签:
【中文标题】Codeigniter 查询在远程 MySQL 服务器上返回 Null【英文标题】:Codeigniter query return Null on remote MySQL Server 【发布时间】:2013-08-15 12:40:55 【问题描述】:我正在使用 Codeigniter 来开发 Web 应用程序。通常 apache 和 mysql 服务器托管在同一台服务器上。今天我必须把它们分开。
10.10.10.1 - apache
10.10.10.2 - mysql
这两个现在可以互相ping通。这是我在 mysql 服务器上的 my.cnf 文件。
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
bind-address=10.10.10.2
old_passwords=0
我正在将 mysql 服务器绑定到 10.10.10.2 ip 地址。因为这两个服务器有两个不同的接口。
之后,我使用该查询在 mysql 服务器上创建了一个用户。
GRANT ALL ON appdb.* TO appuser@'10.10.10.2' identified by 'passw0rd';
为了测试,我编写了那个小 php 脚本并在具有 10.10.10.1 ip 地址的 apache 服务器上运行..
<?php
$username = "appuser";
$password = "passw0rd";
$hostname = "10.10.10.2";
//connection to the database
$dbhandle = mysql_connect($hostname, $username, $password)
or die("Unable to connect to MySQL");
//select a database to work with
$selected = mysql_select_db("appdb",$dbhandle)
or die("Could not select examples");
$result = mysql_query("SELECT @@version");
print_r(mysql_fetch_array($result));
mysql_close($dbhandle);
?>
一切都好!结果回来找我了。我在 mysql 服务器上启动 tcpdump,我看到了响应 tcp 流。
这是我的 codeigniter database.php 文件
$db['default']['hostname'] = '10.10.10.2';
$db['default']['port'] = '3306';
$db['default']['username'] = 'appuser';
$db['default']['password'] = 'passw0rd';
$db['default']['database'] = 'appdb';
$db['default']['dbdriver'] = 'mysqli';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = FALSE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;
确保控制器和模型文件上的一切正常。我在控制器中编写了测试方法。
public function test()
$query = $this->db->query("select @@version");
print_r($query->result());
并在浏览器上输出
Array ( )
我在 mysql 服务器上启动 tcpdump -vvv -i eth1 以确保任何 tcp 连接都到达 db 服务器?我确定当我在浏览器上调用测试功能时没有打开 tcp 连接。不久; CI 不连接 MySQL 服务器。我不知道为什么?
有什么想法吗?
谢谢你们。
PS : 首先 $db['default']['db_debug'] 为 TRUE。当我在浏览器上获取页面而 db_debug 定义为 TRUE 时,我收到了该错误。我更改为 FALSE 以解决该问题。但我确信当我使用 locahost 作为 mysql 服务器时 db_debug 没有问题。当我将其更改为远程服务器时,出现了错误。
Unable to connect to your database server using the provided settings.
Filename: core/Loader.php
Line Number: 346
【问题讨论】:
嗨,只需在 db 主机名中提供 localhost 即可尝试 【参考方案1】:当您的应用在 ip 10.10.10.1
上运行时,您还应该 GRANT ALL ON appdb.* TO appuser@'10.10.10.1' identified by 'passw0rd';
【讨论】:
是的,我的应用服务器在 10.10.10.1 中运行,而且我没有本地 dns 服务器,所以我不能使用 fdqn 代替 IP 地址。但我尝试将 /etc/hosts 文件 mydbdomain 添加为 10.10.10.2 并更改了 codeigniter 配置。还是一样。【参考方案2】:我解决了问题。如果您使用 centos 6.x 或其他 RHEL 版本的 linux 作为应用服务器。你应该知道,selinux 是默认启用的。当我尝试连接数据库服务器我的小 php 脚本并以 root 权限在命令行上执行它时,没有问题。但是您的应用程序运行 www-data 或其他没有 root 权限的东西。所以当 selnix 启用时,其他用户无法打开 tcp 套接字。这就是 CI 查询返回 null 的原因。如果你禁用 selinux,问题就解决了。
【讨论】:
以上是关于Codeigniter 查询在远程 MySQL 服务器上返回 Null的主要内容,如果未能解决你的问题,请参考以下文章
使用 PHP/CodeIgniter 在 MySQL 中获取最后执行的查询
如何测试我的 MySQL 更新查询在 CodeIgniter 中是不是成功? [复制]
Mysql 查询在 Codeigniter 中返回空结果,但在本机 PHP 中工作正常