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 中工作正常

mysql慢查询中的Codeigniter会话查询

我如何在 codeigniter 模型中编写简单的 mysql 查询

使用 CodeIgniter 的 MySQL 查询问题