web-dev-qa-db-ja.com

混乱するPDOのみの問題:ソケット経由で接続できない/アクセスが拒否される/サーバー(共有ホスト)に接続できない

だから問題はそれが何であったかから変わった、私が誰かが私が答えた彼の質問を編集した後に私がしたような私が答えに対する悪いレビューを防ぐために私は以下の元の質問を残します:

だから私はPDOがインストールされている(本当に不完全な)共有ホスティングに取り組んでいますが、それは動作しません。デフォルトのパラメータを使用

<?php
try {
    $dbh = new PDO('mysql:Host=localhost;dbname=THE_DB_NAME', 'THE_USER', 'THE_PASSWORD');
    echo 'Connected to database';
    }
catch(PDOException $e)
    {
    echo $e->getMessage();
    }
?>

それはこのメッセージを投げます:

SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

単純なmysql_connectを使用すると、機能します。

そして、ソケットパスは正しいようです(phpinfoとこのクエリの両方:

show variables like 'socket';

確認。

Localhostは10.103.0.14にリダイレクトします(このデータはmysql_get_Host_info()およびphpMyAdminから取得されます)

PDOで、localhostを127.0.0.1に置き換えると、

SQLSTATE[HY000] [2003] Can't connect to MySQL server on '127.0.0.1' (111) 

そして、localhostを10.103.0.14に置き換えた場合:

Access denied for user 'USER_NAME'@'10.103.0.14' (using password: YES

両方のIPアドレス(127.0.0.1および10.103.0.14)はmysql_connectで動作します。

したがって、明らかに問題はPDO接続に起因します。

誰かがこれがどこから来るのか、または/そしてそれを修正する方法を知っていますか?

一部のサーバーデータ:

PHPバージョン:5.2.10サーバーのphpinfoを見ることができます: http://web.lerelaisinternet.com/abcd.php?v=5 コマンドラインなし可能です(私はそれが技術サポートの仕事であるべきだと知っていますが、彼らは本当に遅いです)

ありがとう

前の質問:

共有ホストでmysql.sockを見つける方法(トリッキーな方法が必要です...)

したがって、今日の問題は次のとおりです。PDO接続は共有ホストでは機能せず、(ホストにインストールされている)機能するはずです。基本的なPDO接続:

<?php
try {
    $dbh = new PDO('mysql:Host=localhost;dbname=THE_DB_NAME', 'THE_USER', 'THE_PASSWORD');
    echo 'Connected to database';
    }
catch(PDOException $e)
    {
    echo $e->getMessage();
    }
?>

このメッセージをスローします:

SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

通常のmysql接続:

mysql_connect("localhost", "THE_USER", "THE_PWD") or die(mysql_error()); 
mysql_select_db("24DLJLRR1") or die(mysql_error());;
echo 'Connected to database <br/>';

正常に動作します。

そのため、明らかに.sockを見つけることができません。正しいアドレスを指定するとうまくいくと思います。インターネットで見つけた「クラシック」なmysqlパスを試しましたが、成功しませんでした。 phpinfoはこのアドレスにあると言います(/var/lib/mysql/mysql.sock)(PHPバージョンは5.2.10)サーバーのphpinfoを見ることができます: http ://web.lerelaisinternet.com/abcd.php?v = 5

だから私はそれがどこにあるのかを理解しようとしています!!!私はphpMyAdminインターフェイスを調べようとしましたが、情報が見つかりませんでした。さらに、phpMyAdminが別のサーバーに接続しているようです(IPアドレスが異なり、phpで接続しようとすると「間違ったパスワード」が表示されます)エラー)。 mysql_connectもこのアドレスに接続します。内部パスワード/ログインを使用して別のサーバーにリダイレクトすると思います。

この情報を取得する方法がわかれば(プロバイダーのテクニカルサポートが「問題の修正」です... 1か月が経ちました...)。また、問題はどこか他の場所から発生しているかもしれませんが、同じことが他の共有ホストでも機能します...

PDOの必要性は、SymfonyフレームワークをDoctrineこのWebサイトに使用しているためであり、DoctrineプラグインにはPDOが必要です... Webサイトを最初からやり直します。

ご協力いただきありがとうございます !

16
Julien

これはすでに回答済みとマークされていますが、実際には解決されていません(データベースを変更せずに)。だから、私のような誰かがこの問題を経験した場合に備えて...

これを修正する最も簡単な方法は、最初にソケットパスを取得することです(php.iniファイルを調べるか、phpmyadminまたはコンソールを使用して(またはmysqlまたはmysqliで構築して))。

...次のクエリを実行するには(PDO以外のもの):

show variables like 'socket';       //as mentioned by symcbean

次に、PDO接続文字列で、ホスト名の代わりにソケットを使用するように変更します。

$ dbc = new PDO( "mysql:unix_socket =/var/run/mysqld/mysqld.sock; dbname = $ DBName"、$ User、$ Password、array(PDO :: ATTR_PERSISTENT => true)); //永続的な接続を使用する

これでうまくいきました。

21
Brent

FWIW、私はこの問題を抱えていて、ホストを「localhost」から「127.0.0.1」に変更しました。

Localhostが機能しなかった理由はわかりませんが、それでうまくいきました。

奇妙なことに、私たちにはたくさんのサーバーがあり、「localhost」を使用するほとんどすべてのサーバーで動作します

15
zmonteca

サーバーはSeLinuxが有効(強制)で実行されていますか?もしそうなら、ルートとして実行してみてください:

# setsebool -P httpd_can_network_connect on
7
Rodrigo Renie

127.0.0.1の代わりにサーバー名としてlocalhost

IIRCは、いくつかのmySQLドライバー/アダプターと共に、ソケットが接続の確立に使用されるかどうかを決定します。

4
Pekka

機能する接続を使用して、クエリを実行します。

show variables like 'socket';

(これはselectステートメントと同じように動作します)...そして実行中のソケットのパスを取得します。

次に、ファイルの権限を確認します。

4
symcbean

本番バージョンは問題なく動作し、テストバージョンはPDOに接続できないという問題がありました。両方のバージョンが同じサーバーにあり、サブディレクトリでテストしました。

修正により、DSNでipのローカルホストが置き換えられました。

'mysql:Host=localhost;dbname=db'

なりました

'mysql:Host=127.0.0.1;dbname=db'
4
Valentin Rusk

試してください:

exec('`which mysql_config` --socket');

これにより、構成されたソケットが表示されます。

2
Rufinus

価値があることについては、まったく同じ問題が発生した後でこのページを見つけました。 Apache&PHPのみ-MySQLが別のマシンにインストールされています。サーバーのDNS名とそのIPの両方を試し、pingを実行できることを確認しました。APHPアプリは、古い構文mysql_connect()を使用して、データベースと問題なく通信しています。しかし、CLIからのPDOがこのエラーをスローしていました。

私の解決策は私のDSNをチェックすることでした。 DSN自体のタイプミスは警告なしで無視され、PDOはlocalhostを意味すると見なします。私の問題は、DSNに「dbname =」ではなく「name =」があったことです。

1
phpguru

私は奇妙な行動の理由を見つけました。 bind-addressが127.0.0.1または0.0.0.0(すべてのアドレス)と異なる場合、PDOは127.0.0.1に接続できません。

1
Franz

Mysql構成の問題my.conf構成ファイルでskip-networkingのオプションを無効にする必要があります。これは正常に動作するはずです http://www.wolfcms.org/forum/post7098.html# p7098

0
Ahmed Aswani

私の問題はOPとは異なるかもしれませんが、投稿する価値があると思いました。 VMでソフトウェアアップグレードを実行してから再起動すると、OPのエラーメッセージが表示されました。 mysqlの起動を妨げるメモリ不足の問題であることが判明しました。いくつかの大きなファイルを削除すると、問題はなくなりました。

0
David

同様の問題を解決しました。おそらく、mysql_connect()ステートメントを同等のPDOに置き換えたと思います。その古い接続ステートメントに依存する他の多くのコードがまだあることを忘れないでください。 PDOコードを記述している間、mysql_connectを適切な場所に保持してみてください。

0
user1389749

私にとってうまくいったのは、次のようにポート番号を指定することでした:

mysql:hostname; port = 3306; dbname = dbname;

これにより、ローカルデータベースに接続するときに機能します。現在、私はそれをリモートdbで動作させるように取り組んでいます。

0
Nick Res