私は自分の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にインストールし、php5
php5-mcrypt
パッケージもインストールしています。
私のPHPバージョンは次のとおりです。
Windows:PHPバージョン5.6.3-Ubuntu:PHPバージョン5.5.9-1ubuntu4.5
つまり、基本的に、IPアドレスを介してUbuntu MySQLに接続すると接続できると言っていますが、localhost
にいるときは修正できませんか?
これは、MySQLの付与がIPアドレスに関連付けられている場合に問題になる可能性があります。しかし、はっきりしていません。デバッグするには次のようにします。
何よりもまず、php5
とphp5-mcrypt
がインストールされていると言います。しかし、php5-mysql
はどうですか?それと同じくらい単純な何かがあなたに頭痛を引き起こす可能性があります。この行を実行するだけです:
Sudo aptitude install php5-mysql
それがインストールされたら、次のようにApacheを再起動します。
Sudo service Apache2 restart
これで問題が解決した場合、それは単純なソフトウェアインストールの問題でした。次の2つの項目でカバーする必要がある過去のすべて。
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接続を介してアクセスできるようになります。基本的に、世界中のあらゆるネットワーク接続がそのマシンに接続できるようにします。これは実際の本番サーバーにとっては良いことではありませんが、ローカライズされたテスト/開発セットアップでは問題ないはずです。
その最初の部分で、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 |
+------------------+-----------+
もちろん、あなたのリストは私のものとは異なるかもしれないので、それを覚えておいてください。しかし、重要なのは、このようなものが表示されるはずです。 root
のuser
に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_database
とsome_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それを解決するために自分でコーディングしてください。