2

私は2台のコンピューターを持っています。1台はWindows7をインストールし、もう1台はCentOS5.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も拡張しました。

ここに画像の説明を入力してください ここに画像の説明を入力してください


Windows7とCentOSの間で同じコードを実行します

ウィンドウは成功しますが、centosは失敗します

db.phpとdbtest.phpの2つのファイル

これが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に編集(アジア/台北)

何時間もテストするために、私はphppdoに問題があると思います...

私のLANでは、CentOSターミナルで任意の3306ポートmysqlに接続できるためです

しかし、php pdo_mysqlクラスでは、mysqlをリンクできません(CentOSローカルのmysqlでさえ)

だから...私のpdo_mysql拡張機能が正常に動作していることを確認する方法は?

PS:申し訳ありませんが、私は英語が苦手です:(

4

3 に答える 3

0

Linux上のPHP/PDOは、ローカル接続用のソケットを介して接続を試みます。このソケットの場所は、のpdo_mysql.default_socketプロパティで構成しphp.iniます。

もちろん、5.3.9で修正されたバグ#60155に遭遇するので(私は思う)、バージョン5.3.3を超えてアップグレードすることを強くお勧めします。

于 2012-10-26T02:43:58.590 に答える
0

まず、私の質問に答えてくれてありがとう:)


ソケットに焦点を当てて、私はすでに2つの方法を試しました:

1)あなたが言うように、私はphp.iniを変更し、pdo_mysql.default_socketを追加します

次にhttpdサービスを再起動しますが、pdomysql接続は引き続き失敗します

2)DSNの一部であるdbtest.phpの3行目(#3)を変更します

Original => "mysql:dbname = pdotest; port = 3306; host = 192.168.1.127"
New => "mysql:unix_socket = / var / lib / mysql / mysql.sock; dbname = pdotest; port = 3306; host = 192.168 .1.127 "

、しかし接続はまだ失敗します


また、元のmysql_connectを試してリンクdbをテストしました。これで問題ありません。

あなたの提案によると、私は後でphpを別のバージョン(多分5.4.8以下5.3.3以下)に変更し、結果を投稿します

ありがとう!

于 2012-10-26T04:09:45.570 に答える
0

多くの時間を無駄にします...最終的に私は解決策を手に入れました!!

この質問を見たとき<<リンクをクリックして質問を表示

この答えは私の問題を解決します。

Selinuxのデフォルト設定はclosehttpd_can_network_connectとhttpd_can_network_connect_dbです

開けるだけ!PDO接続は正常に動作します:)

指示:

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

ありがとう、マイケル・バーコウスキー

于 2012-10-31T06:40:38.367 に答える