34

php mysqli クラスを使用して mysql データベースに接続しようとすると、このエラーが発生します。次のコードを使用します。

$db = new MySQLi("localhost","kamil","*****");
if (mysqli_connect_errno())
{
    echo "An error occured. Please try again later.";
    exit();
}

パスワードはセキュリティのため * です。

kamil外部 IP アドレスとローカルホストに対するすべての権限を持つユーザーを作成しました。実行するselect user,host from mysql.userと、これら2人のユーザーが正しく表示されます。

私はいくつかの調査を行い、このベンチマークを使用しました: https://stackoverflow.com/a/2183134/1839439接続先を確認します。結局のところ、接続できるのはローカルホストのみですが、提供する127.0.0.1とこのエラーがスローされます。127.0.0.1:3306localhost

私の質問は、名前や外部 IP ではなく、localhost IP アドレスを使用してのみ DB に接続できるのはなぜですか。Web サイトで mysql を使用できるようにする場合、または使用できる場合、別のホストが必要127.0.0.1ですか?

編集:
hostsファイル

127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
fe00::0         ip6-localnet
ff00::0         ip6-mcastprefix
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

127.0.1.1       raspberrypi


このユーザーの Mysql ユーザー テーブルの結果:

| kamil            | 109.255.177.28 |
| kamil            | localhost      |
4

4 に答える 4

82

「localhost」のみを使用すると、MySQL クライアント ライブラリは接続に TCP/IP 接続ではなく Unix ドメイン ソケットを使用しようとします。このエラーは、 というソケットMySQLが存在しないため、接続に使用できないことを示しています (エラー番号 2)。

MySQLのドキュメントから:

Unix では、MySQL プログラムはホスト名 localhost を特別に扱います。その方法は、他のネットワーク ベースのプログラムと比べて予想とは異なる可能性があります。localhost への接続の場合、MySQL プログラムは Unix ソケット ファイルを使用してローカル サーバーへの接続を試みます。これは、ポート番号を指定するために --port または -P オプションが指定されている場合でも発生します。クライアントがローカル サーバーへの TCP/IP 接続を確実に確立するには、 --host または -h を使用して、ホスト名の値 127.0.0.1、またはローカル サーバーの IP アドレスまたは名前を指定します。--protocol=TCP オプションを使用して、localhost の場合でも、接続プロトコルを明示的に指定することもできます。

この問題を解決するにはいくつかの方法があります。

  1. Unix ソケットの代わりに TCP/IP を使用できます。これを行うには、接続するときに127.0.0.1代わりに使用します。localhostただし、Unix ソケットの方が高速で安全に使用できる場合があります。
  2. でソケットを変更できphp.iniます。MySQL 構成ファイルmy.cnfを開いて、MySQL がソケットを作成する場所を見つけ、PHPmysqli.default_socketをそのパスに設定します。私のシステムでは、/var/run/mysqld/mysqld.sock.
  3. 接続を開くときに、PHP スクリプトで直接ソケットを構成します。例えば:

    $db = new MySQLi('localhost', 'kamil', '***', '', 0, 
                                  '/var/run/mysqld/mysqld.sock')
    
于 2012-12-07T21:24:13.287 に答える
1

「localhost」は機能しないが、127.0.0.1 は機能する場合。ローカル ホスト ファイルが正しい場所を指していることを確認してください。(Linux/Mac の場合は /etc/hosts、Windows の場合は C:\Windows\System32\drivers\etc\hosts)。

また、選択しようとしているデータベースへの接続がユーザーに許可されていることを確認してください。

于 2012-12-07T19:12:50.990 に答える
0

以下のファイルを確認してください

%SystemRoot%\system32\drivers\etc\host

ホスト名を ip でバインドする行に、それらをまとめてバインドする行が欠落している可能性があります。

127.0.0.1  localhost

指定された行が欠落している場合。ファイルに行を追加します


また、MySQL データベースのユーザー テーブルを確認し、使用しているユーザーのホスト列の値を教えてください。ホスト「127.0.0.1」と「localhost」の両方に対するユーザー権限が必要であり、一般的なホスト名にはワイルド文字であるため % を使用する必要があります。

于 2012-12-07T19:20:31.953 に答える