web-dev-qa-db-ja.com

PHPでmysqlに接続できません

Phpmyadminで正常に接続できますが、phpスクリプトでmysqlに接続できないようです。パスワードを使用してユーザーを作成し、データベースに適切な特権を付与しましたが、接続するたびにアクセスが拒否されたと表示されて終了します。 WindowsXPボックスでxamppを使用しています。ファイアウォールはすべて無効になっており、ユーザー名とパスワードが正しいことを確認しました。コードは次のとおりです。

$conn=mysql_connect('localhost','westbrookc16','megadots') || die (mysql_error());

ユーザー名は特定の形式か何かである必要がありますか?

11
Chris Westbrook

ここでの問題は、あなたがそれを許可したホストであるという予感がありますが、それは実際には知識に基づいた推測にすぎません。アクセスmyuser @ '127.0.0.1'またはサーバーの実際のIPアドレスを許可すると、ホストとしてlocalhostを使用して接続することはできなくなります。これは、「localhost」がホストとして指定されている場合、phpはネットワークソケットの代わりにunixソケットを使用することを想定し、そのコンテキストでは127.0.0.1はlocalhostと同じではないためです。

mysql_connect() の手動エントリから:

注:サーバーとして「localhost」または「localhost:port」を指定すると、MySQLクライアントライブラリはこれをオーバーライドし、ローカルソケット(Windowsでは名前付きパイプ)に接続しようとします。 TCP/IPを使用する場合は、「localhost」の代わりに「127.0.0.1」を使用してください。 MySQLクライアントライブラリが間違ったローカルソケットに接続しようとする場合は、PHP構成でランタイム構成として正しいパスを設定し、サーバーフィールドを空白のままにする必要があります。

これが完全に冗長ではないことを願っています。 :)

17
Emil H

これは以前に見たことがありますが、1人のmysqlユーザーがphp経由でログインし、別のユーザーはログインしません。ユーザーがコマンドラインから作業することもありますが、phpからは作業しません。

それは常にエミルが2つを参照しているものでした。 mysqlユーザーは実際にはユーザー/ホストのペアです。したがって、ユーザーmegadots @localhostとユーザーmegadots @ mycoolhostは、2つの別個のレコードとしてmysql.userテーブルにリストされます。

コマンドラインからログインできる場合は、このクエリを実行します。

SELECT user, Host FROM mysql.user

ユーザーとそのホストの完全なリストが表示されます。

動作しているphpMyAdminユーザーを認識した場合は、おそらく使用するホストである[ホスト]列を確認してください。

ホストをリセットするには、これらのクエリを実行します(!mysqlインストール全体のprivilagesテーブルでの作業には注意してください)

update mysql.user set Host = 'hostname' 
where user = 'username' and Host = 'oldhostname';

flush privileges;

ユーザー名と%がホストとして他のすべてよりも優先されるレコードが表示され、ユーザーに複数のレコードがあり、そのうちの1つに%がホストとして存在する場合、ホストとして%が使用されているユーザー名がパスワードが間違っていて、username @ localhostのパスワードを何度リセットしても、ログイン時にusername @%と比較されるため、無効です。

6
Fire Crow

Linuxを使用している場合は、シナプスパッケージマネージャーを使用して、PHPとMySQLの両方が接続できるようにするために必要なすべてのライブラリとmodを見つけてダウンロードします。私の問題は、PHP単独で実行されているスクリプトはサーバー側で機能しましたが、PHPスクリプトを使用してMySQLに接続しようとすると、接続されませんでした。真っ白なページしか表示されませんでした。 PHPがMySQLに接続するために使用するMySQLクライアントライブラリがあります。MySQLサーバーライブラリしかありませんでした。クライアント側ライブラリをインストールしてApacheサーバーを再起動すると、私のPHPスクリプトは接続に問題はありませんでした。デフォルトではPHP 5はMySQLクライアント側ライブラリにインストールされていません。

2
hector

私の場合、使用していたデータベースの作成に使用したユーザーを削除したことが判明しました。通常、これにより「ユーザー指定の定義者が存在しません」というエラーが表示されますが、何らかの理由で、PHPコードに対して拒否されたより一般的なアクセスを返すだけでした。なぜできるのかわかりません。それでもコマンドラインやその他のインターフェイスからログインします。問題を修正するために、削除されたユーザーを再作成しました。

2
Chris Wininger

同様の問題が発生した後、「127.0.0.1」を「localhost」に置き換えるとうまくいくことがわかりました(「localhost」を使用して端末経由で正常に接続できたにもかかわらず)。

0
JMS

私も同じ問題を抱えていましたが、デフォルトのアカウントに「%」(任意のホスト)、パスワードなしのままにしておくと、パスワードで接続できないことがわかりました。問題が正確に何であるかはわかりませんが、それらを削除することで解決しました。

0
Erik Hosszú

そしてそれにdbのための適切な特権を与えました

どうやって?付与するときに、ユーザーにどのホストを使用しましたか?

これは通常行われる方法です:

GRANT ALL ON mydb.* TO 'someuser'@'somehost' identified by 'password';
FLUSH privileges;

あなたの場合、「somehost」はおそらく「localhost」または「127.0.0.1」である必要があります(他の投稿を参照)

構文リファレンス: http://dev.mysql.com/doc/refman/5.1/en/grant.html

0
Fredrik

これはタイプミスであるか、特権を付与していません。これらを見つけるのが驚くほど難しい場合があります。

Phpmyadminを使用せずに、 [〜#〜] sqlyog [〜#〜] (無料のコミュニティエディションは素晴らしい)のコピーをダウンロードして、それを介してユーザーにログインしてみることをお勧めします。問題が診断されたら、ユーザー名/パスワードをコピーしてスクリプトに貼り付けます。

ちなみにphpmyadminは問題ありませんが、sqlyogなどのプログラムの方が一般的に便利なので、とにかくチェックする価値があります。変換されると確信しています。 sqlyogが好みに合わない場合は、他にもいくつかの無料の商用代替手段があります。

0
Cruachan