使用pdo_mysql连接mysql,在Windows中运行成功,但在CentOS 5.8中失败

时间:2012-10-24 07:14:52

标签: mysql pdo centos database-connection

我有两台电脑,一台安装Windows 7,另一台是CentOS 5.8


在CentOS ......

我使用yum命令安装httpd(apache2.2),php5.3.3和mysql。

  • yum install httpd
  • yum install php53
  • yum install pdo
  • yum install php53-mysql

首先我查看phpinfo,pdo,pdo_mysql是否成功扩展,

然后我也检查了CentOS终端中的php -m,也扩展了pdo和pdo_mysql。

enter image description here enter image description here


我在Windows 7和CentOS之间运行相同的代码

窗口成功,但是centos失败

两个文件,db.php和dbtest.php

这是db.php:

<?php

    class DB
    {
        private $conn;

        #### construct ####
        public function __construct( $dsn , $db_user , $db_password , $showError = false )
        {                       
            try
            {               
                $this->conn = new PDO( $dsn , $db_user , $db_password );

                if( $showError ) // set error information show or not. 
                {
                    $this->conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
                }
                else
                {
                    $this->conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT );
                }

                $setUtf8 = $this->conn->prepare( 'set names utf8' ); // set encoded by utf8
                $setUtf8->execute();
            }
            catch( PDOException $err )
            {
                return false;
            }
        }
    }
?>

这是dbtest.php:

<?php

    require_once( "db.php" );

    $link_test = new DB( "mysql:dbname=pdotest;port=3306;host=192.168.1.127", "root" , "123456" );  

    var_dump($link_test);
?>

在Windows中转储时,结果为:

object(DB)#1 (1) { ["conn":"DB":private]=> object(PDO)#2 (0), { } }

在CentOS中转储,结果是:

object(DB)#1 (1) { ["conn":"DB":private]=> NULL }

谁能告诉我为什么连接在CentOS中失败?


编辑于2012/10/24 16:10(亚洲/台北)

对于测试很多小时,我猜是php pdo有问题...

因为在我的局域网中,我可以通过CentOS终端连接任何3306端口的mysql

但在php pdo_mysql类中,我无法链接任何mysql(即使是CentOS本地的mysql)

所以......如何检查我的pdo_mysql扩展是否正常运行?

PS:对不起,我的英语很差:(

3 个答案:

答案 0 :(得分:0)

Linux上的PHP / PDO将尝试通过套接字连接以进行本地连接。您可以在pdo_mysql.default_socket中的php.ini属性中配置此套接字的位置。

你当然会遇到Bug #60155,这是在5.3.9(我认为)中修复的,所以我肯定会建议升级到5.3.3以后版本。

答案 1 :(得分:0)

首先,谢谢你回答我的问题:)


专注于socket,我已经尝试了两种方法:

1)就像你说的,我修改php.ini,添加pdo_mysql.default_socket

然后重启httpd服务,但是pdo mysql连接仍然失败

2)我修改了dbtest.php第3行(#3),这是DSN的一部分

原件=&GT; “MySQL的:DBNAME = pdotest;端口= 3306;主机= 192.168.1.127”
新=&gt; “MySQL的:unix_socket =的/ var / lib中/ MySQL的/的mysql.sock; DBNAME = pdotest;端口= 3306;主机= 192.168.1.127”

,但连接仍然失败


我也尝试使用原始的mysql_connect来测试链接数据库,这是工作!

根据你的建议,我会稍后将php更改为另一个版本(可能是5.4.8或更低,然后是5.3.3),然后发布结果

谢谢!

答案 2 :(得分:0)

浪费了很多时间......最后我得到了解决方案!!

当我看到this question&lt;&lt;点击链接查看问题

这个答案解决了我的问题。

Selinux默认设置为关闭httpd_can_network_connect和httpd_can_network_connect_db

打开它吧! PDO连接将正常运行:)

命令:

setsebool -P httpd_can_network_connect = 1
setsebool -P httpd_can_network_connect_db = 1

谢谢Michael Berkowski