web-dev-qa-db-ja.com

VirtualBoxUbuntuでMySQLに接続する

私は自分のPC(Windows)にこのコードを持っており、ホストオンリーネットワークを備えたUbuntu仮想マシンからデータベースを呼び出しています。 UbuntuマシンにVirtualBoxを使用しています

$ipHost = "xxx.xxx.x.xxx";
$nombreUsuario = "rootpi";
$passUsuario = "rootpi";
$bddNombre = "tienda";

$conexion = new mysqli($ipHost, $nombreUsuario, $passUsuario, $bddNombre);

if ($conexion->connect_error) {
    die("Conexión fallida: " .$conexion->connect_error);
}

$sql = "SELECT id, name, address, image FROM people";
$result = $conexion->query($sql);

if ($result->num_rows > 0 ) {
    //Stuff...
}

このコードは正常に機能します。接続が確立され、ApacheサーバーのPHPページに結果が表示されます。私の主な目的は、WinSCPとを使用して/var/www/htmlディレクトリのUbuntu14.04仮想マシンにファイルを渡すことです。そこからそれらを呼び出します。

私が変更する必要があると思う唯一の行は、IPからローカルホストへの$ ipHost変数です。

$ipHost = "xxx.xxx.x.xxx"; -> $ipHost = "localhost";

しかし、それは機能しません。私は後にエコーしようとしました:

$conexion = new mysqli($ipHost, $nombreUsuario, $passUsuario, $bddNombre);

ただし、その後のエコーは表示されません。

MySQLをUbuntuにインストールし、php5php5-mcryptパッケージもインストールしています。

私のPHPバージョンは次のとおりです。

Windows:PHPバージョン5.6.3-Ubuntu:PHPバージョン5.5.9-1ubuntu4.5

4
nihCC

つまり、基本的に、IPアドレスを介してUbuntu MySQLに接続すると接続できると言っていますが、localhostにいるときは修正できませんか?

これは、MySQLの付与がIPアドレスに関連付けられている場合に問題になる可能性があります。しかし、はっきりしていません。デバッグするには次のようにします。

まず、基本。

何よりもまず、php5php5-mcryptがインストールされていると言います。しかし、php5-mysqlはどうですか?それと同じくらい単純な何かがあなたに頭痛を引き起こす可能性があります。この行を実行するだけです:

Sudo aptitude install php5-mysql

それがインストールされたら、次のようにApacheを再起動します。

Sudo service Apache2 restart

これで問題が解決した場合、それは単純なソフトウェアインストールの問題でした。次の2つの項目でカバーする必要がある過去のすべて。

次に、MySQLネットワークがどのようにバインドされているかを確認します。

Ubuntuシステムにnmapをインストールしている場合は、Ubuntuのコマンドラインにログインして次のコマンドを実行します。

nmap localhost -p 3306

nmapがインストールされていない場合は、次のコマンドを実行してインストールしてください。これは、すべてのセットアップがデフォルトでインストールされているはずの、すてきなシンプルなネットワークデバッグツールです。

Sudo aptitude install nmap

これにより、マシンのMySQLポート(3306)が開いているかどうかがわかります。たとえば、私が持っているテストUbuntu 12.04セットアップでそれを行ったところ、これが私が得た応答です。

Starting Nmap 5.21 ( http://nmap.org ) at 2014-11-30 01:29 EST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000070s latency).
PORT     STATE SERVICE
3306/tcp open  mysql

これは、localhostのMySLポート(3306)が開いていることを示しています。それが閉じていることを示している場合、それは問題である可能性があり、Ubuntuシステムでmy.cnfを開いて、bind-addressを探します。私はnanoを使用するのが好きなので、これは私が使用するコマンドです。

Sudo nano /etc/mysql/my.cnf

また、MySQLのネットワーク化されていないインストールでは、bind-address設定は次のようになります。

bind-address            = 127.0.0.1

これにより、バインディングはlocalhost(127.0.0.1)のみになります。ただし、WindowsホストマシンからMySQLデータベースに接続できると言う場合は、次のようにVirtualBoxIPアドレスに設定できます。偽のIPアドレスを持つ疑似例を使用する:

bind-address            = 123.456.789.0

そして、それは間違いなくWindowsホストの接続を許可しますが、これは重要ですが、123.456.789.0を介した接続のみを許可します。

したがって、WindowsとUbuntuがVirtualBoxセットアップでMySQLサーバーを使用できるようにするためのより良い方法は、次のようにbind-address行をコメントアウトすることです。

# bind-address            = 123.456.789.0

そして、次のようにMySQLを再起動します。

Sudo service mysql restart

これが完了すると、MySQLはUbuntu内でlocalhostを介してアクセスできるようになり、WindowsマシンでもIP接続を介してアクセスできるようになります。基本的に、世界中のあらゆるネットワーク接続がそのマシンに接続できるようにします。これは実際の本番サーバーにとっては良いことではありませんが、ローカライズされたテスト/開発セットアップでは問題ないはずです。

次に、データベースユーザーに対してMySQL付与がどのように設定されているかを確認します。

その最初の部分で、UbuntuとWindowsの世界間のネットワークは正常に機能しているが、それでも接続できないことが基本的に示された場合、次の問題は、基本的にMySQLのユーザー権限であるMySQL GRANTSに関連している可能性があります。

ユーザーの許可を確認するには、最初に特権ユーザーとしてMySQLにログインし、次のコマンドを実行してmysqlコアデータベースに接続する必要があります。

CONNECT `mysql`;

次に、このコマンドを実行して、セットアップしたユーザー/ホストを確認します。

SELECT `user`, `Host` from `user`;

rootセットアップしかない場合、基本的なMySQLインストールの出力は次のようになります。

+------------------+-----------+
| user             | Host      |
+------------------+-----------+
| root             | 127.0.0.1 |
| root             | ::1       |
| debian-sys-maint | localhost |
| root             | localhost |
+------------------+-----------+

もちろん、あなたのリストは私のものとは異なるかもしれないので、それを覚えておいてください。しかし、重要なのは、このようなものが表示されるはずです。 rootuserに3つの異なるエントリがあることに注意してください。1つは127.0.0.1(IPv4アドレス)、::1(IPv6アドレス)、およびlocalhost(人間)です。読み取り可能なホスト名)。それがここでの鍵です。

問題は、ユーザーが123.456.789.0などのネットワークアドレスにのみバインドされている場合、ユーザーがlocalhostを介して接続できる方法がないということです。したがって、localhostに対して個別の付与を設定する必要があります。

そのようなことをするのはかなり簡単です。次のような開発環境で、ユーザーにすべての助成金を投げるのが好きな人もいます。

GRANT ALL PRIVILEGES ON `some_database`.* TO 'some_user'@'localhost';

しかし、私は多くの理由でそれが好きではありません。私は、MySQLユーザーに対して、データベースで必要なことを実行できるが、次のようなroot権限を許可しない、かなり安全で安全な標準の付与セットを使用することを好みます。

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `some_database`.* TO 'some_user'@'localhost';

もちろん、特定の設定に合わせてsome_databasesome_userを変更してください。ただし、これらのGRANTコマンドのいずれかを実行した後、次のように特権を再ロードするようにMySQLに指示する必要があります。

FLUSH PRIVILEGES;

そして今、そのユーザーに対してSHOW GRANTSを実行すると、設定したとおりにすべての権限を確認できます。

SHOW GRANTS FOR 'some_user'@'localhost';

これらは基本的に、このようなMySQLネットワーク/接続の問題をデバッグするときに私が探して行動する2つのことです。

最後に、コマンドラインから接続をテストします。

次に、Ubuntu 14.04コマンドラインから接続をテストするには、次のコマンドを入力するだけです。

mysql -u some_user -p

もちろん、ユーザーに合わせてsome_userを変更してから、パスワードを入力してください。これで、そのユーザーを介してMySQLに接続できるはずです。コマンドラインから正常に接続できれば、MySQLのネットワーク/接続がうまく機能していることがわかります。したがって、PHPコーディング自体に関連する可能性のある過去のものはすべて、このサイトの簡単な回答の範囲外です。ローカルのPHPそれを解決するために自分でコーディングしてください。

2
JakeGould