Codeigniter查询在远程MySQL Server上返回Null


Codeigniter query return Null on remote MySQL Server

我正在使用Codeigniter开发web应用程序。通常apache和mysql服务器托管在同一台服务器上。今天我不得不把他们分开。

10.10.10.1 - apache
10.10.10.2 - mysql 

这两个人现在可以互相打电话了。这是我在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.2ip-adress。因为这两个服务器有一个2困难的接口。

之后,我在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流。

这是我的代码点火器数据库.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-ieth1,以确保有任何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

当你的应用程序在ip 10.10.10.1 上运行时,你也应该使用GRANT ALL ON appdb.* TO appuser@'10.10.10.1' identified by 'passw0rd';

我解决了这个问题。如果您使用centos6.x或其他RHEL版本的linux作为应用程序服务器。您应该知道,selinux是默认启用的。当我尝试连接数据库服务器我的小php脚本并作为root权限在命令行上执行它时,没有问题。但是您的应用程序运行的是www数据或其他没有root权限的东西。因此,当启用selnix时,其他用户无法打开tcp套接字。这就是CI查询返回null的原因之一。如果禁用selinux,问题已解决。