現在、PHP(PEAR)のAUTHを利用したログインーページを作ろうと思っています。
ところが、DBに接続する段階でエラーが発生し、たいへん困っています。
どなたか原因、解決策をご教授くださいますよう、お願い致します。
【環境】
■PHP: 5.0.2
■MySql: 5.0.08
■Apatche: 2.0.55
■OS: FreeBSD 5.4
【エラー内容】
■メッセージ:DB Error: connect failed( ※getMessage()で出力されるもの )
【ソース】
a: MySqlユーザー名
b: MySqlパスワード
c: MySqlデータベース名
d: MySqlテーブル名
e: MySqlユーザー名にあたるカラム名
f: MySqlパスワードにあたるカラム名
■例1)失敗
$dsn = 'mysqli://a:b@localhost/c';
$db = DB::connect($dsn);
■例2)失敗
$params = array(
"dsn" => "mysqli://a:b@localhost/c" ,
"table" => "d",
"usernamecol" => "e",
"passwordcol" => "f");
$myAuth = new Auth("DB",$params,"loginFunctions");
※参考
■例3)成功
$mysqli = new mysqli("localhost", "a", "b", "c");
例3で接続自体は可能でしたが、AUTHの利用を考えている為、例1や例2の方法で接続できないといけないのです。
お力添えの程、宜しくお願い致します。
mysqliではDBのバージョンが1.6.3以降のようです。
http://peardoc.xole.net/package.database.db.intro-dsn.html
あるいはパスワードに$や@などの文字が含まれている可能性はないでしょうか
$dsn = 'mysqli://a:b@localhost/c';
を
$dsn = 'mysql://a:b@localhost/c';
に変えればいけないでしょうか?
ご回答ありがとうございます。
お教え頂いた方法で試してみましたが、接続はできませんでした。
※php.iniファイルの設定は変更しておりません。
php.iniの設定も詳しく調査してみたいと思います。もし思い当たる部分があればご教授いただければ、とても助かります。
何卒宜しくお願い致します。
>>サーバーの設定が問題なのでしょうか・・・
例3の方法で接続ができているということなのでそういうことは無いと思うのですが。
私はPHP4なのですがPHP5とではいくつか違うことがあるのでその辺かもしれません。
DB.phpのサンプルコードでは
$db =& DB::connect($dsn, $options);
if (PEAR::isError($db)) {
die($db->getMessage());
}
となってますのでPHP5では&が必要なのかもしれません。
ini_get('include_path')でDB.phpへのパスが正しいか調べる
$dsnをmysqlでconnectできるか調べる
isError()ならgetMessag()ではなくprint_r()で表示してみる
ご指示の通り試してみましたので結果をご報告します。
■ini_get('include_path')でDB.phpへのパスが正しいか調べる
→ 問題ございませんでした。
■$dsnをmysqlでconnectできるか調べる
→ httpd.confを変更する必要がありそうで、まだ試しておりません。
■isError()ならgetMessag()ではなくprint_r()で表示してみる
→ この結果、以下のようなエラーが出ました。
[nativecode=Can't connect to local MySQL server through socket '' (2)]
従いまして以下のページを参考に、my.cnfを調べてみました。
http://www.hi-ho.ne.jp/tsumiki/book_sup2.html
この点、mysql.sockへのパスが違っていましたので、それを修正しました。
【修正前】
--------------------------------------
[mysqld]
# socket=/var/lib/mysql/mysql.sock
socket=/tmp/mysql.sock
[client]
socket=/tmp/mysql.sock
【修正後】
--------------------------------------
[mysqld]
# socket=/var/lib/mysql/mysql.sock
socket=/var/tmp/mysql.sock
[client]
socket=/var/tmp/mysql.sock
修正後、apatch,mysql共に再起動の上試してみましたが、まだ駄目でした。
(修正前とエラーも変わりませんでした。)
なお、表示されるエラーは下記の通りです。
object(DB_Error)#2 (8) { ["error_message_prefix"]=> string(0) "" ["mode"]=> int(1) ["level"]=> int(1024) ["code"]=> int(-24) ["message"]=> string(24) "DB Error: connect failed" ["userinfo"]=> string(105) " [nativecode=Can't connect to local MySQL server through socket '' (2)] ** mysqli://a:a@localhost/c" ["backtrace"]=> array(6) { [0]=> array(6) { ["file"]=> string(25) "/usr/local/lib/php/DB.php" ["line"]=> int(888) ["function"]=> string(10) "PEAR_Error" ["class"]=> string(8) "DB_Error" ["type"]=> string(2) "->" ["args"]=> array(5) { [0]=> string(24) "DB Error: connect failed" [1]=> int(-24) [2]=> int(1) [3]=> int(1024) [4]=> string(71) " [nativecode=Can't connect to local MySQL server through socket '' (2)]" } } [1]=> array(6) { ["file"]=> string(27) "/usr/local/lib/php/PEAR.php" ["line"]=> int(536) ["function"]=> string(8) "DB_Error" ["class"]=> string(8) "DB_Error" ["type"]=> string(2) "->" ["args"]=> array(4) { [0]=> int(-24) [1]=> int(1) [2]=> int(1024) [3]=> string(71) " [nativecode=Can't connect to local MySQL server through socket '' (2)]" } } [2]=> array(6) { ["file"]=> string(32) "/usr/local/lib/php/DB/common.php" ["line"]=> int(1849) ["function"]=> string(10) "raiseError" ["class"]=> string(9) "DB_mysqli" ["type"]=> string(2) "->" ["args"]=> array(7) { [0]=> NULL [1]=> int(-24) [2]=> NULL [3]=> NULL [4]=> string(71) " [nativecode=Can't connect to local MySQL server through socket '' (2)]" [5]=> string(8) "DB_Error" [6]=> bool(true) } } [3]=> array(6) { ["file"]=> string(32) "/usr/local/lib/php/DB/mysqli.php" ["line"]=> int(331) ["function"]=> string(10) "raiseError" ["class"]=> string(9) "DB_mysqli" ["type"]=> string(2) "->" ["args"]=> array(5) { [0]=> int(-24) [1]=> NULL [2]=> NULL [3]=> NULL [4]=> string(57) "Can't connect to local MySQL server through socket '' (2)" } } [4]=> array(6) { ["file"]=> string(25) "/usr/local/lib/php/DB.php" ["line"]=> int(556) ["function"]=> string(7) "connect" ["class"]=> string(9) "DB_mysqli" ["type"]=> string(2) "->" ["args"]=> array(2) { [0]=> array(9) { ["phptype"]=> string(6) "mysqli" ["dbsyntax"]=> string(6) "mysqli" ["username"]=> string(2) "a" ["password"]=> string(2) "b" ["protocol"]=> string(3) "tcp" ["hostspec"]=> string(9) "localhost" ["port"]=> bool(false) ["socket"]=> bool(false) ["database"]=> string(5) "c" } [1]=> bool(false) } } [5]=> array(6) { ["file"]=> string(34) "/home/htdocs/test/login/login2.php" ["line"]=> int(36) ["function"]=> string(7) "connect" ["class"]=> string(2) "DB" ["type"]=> string(2) "::" ["args"]=> array(1) { [0]=> string(30) "mysqli://a:a@localhost/c" } } } ["callback"]=> NULL }
Fatal error: Call to undefined method DB_Error::query() in /home/~~/~~/~~/login.php on line 42
my.cnfの修正は参考サイトと状態が違うので意味が無いと思います。
修正前の状態に戻した方がいいように思います。
Can't connect to local MySQL server through socket '' (2)
はMySQL serverとクライアント(この場合はPHP)との参照している
socket(この場合はファイル)が違っている(合っていない)ということだと思います。
my.cnfはいくつかファイルがあるのでどれが有効になっているのかわかりません。
そこでphpinfo()でMYSQL_SOCKETを見てパスを確認します。
確認できなければmy.cnfのパス(この場合は/tmp/mysql.sock
か/var/tmp/mysql.sock)を使います
Can't connect to local MySQL server through socket '' (2)
でパスが''となっているのが気になります。
PHP側ではsocketのパスが空になっているのかもしれません。
そのためconnectできないとは考えられます。
mysqliの場合はmysqli.default_socketとなっていますので
ini_set("mysqli.default_socket", socketのパス);
をDB::connectする前に追加してみて下さい。
どうも力不足だったようですorz。今回ので解決できればいいのですが
ご連絡頂きました通りに変更しましたが、動きは変わりませんでした。
なお、気になる点として、以下の点がございます。
■php.ini で、「extension=mysqli.sock」という記述があった。
■Webminというサーバー管理ソフトを入れていますが、そこでMySqlを開くと作成されているはずのDBが見えない。
※SSHのコマンドで確認すると表示されます。あくまでWebmin上から見えないということです。
この点「extension=mysqli.sock」についてはコメントアウトしてみましたが、動きに変化はありませんでした。
フォルダ構成等もデフォルトと異なるようですし、一度再インストールをしたほうが良いでしょうか。
恐れ入りますが何分、初心者ですので、アドバイスを下さいますよう、お願い申し上げます。
>>php.ini で、「extension=mysqli.sock」という記述があった。
.sockというのはおかしいですねぇ。
拡張モジュールなので通常.soです。ですから
extension=mysqli.so
のはずです。
extension=mysql.so
も必要かもしれません。
phpinfo()のextension_dirで示されるパスにmysqli.soやmysql.soがあるか確認してください。ここにないと拡張モジュールがローディングされてないでしょう。
>>Webminというサーバー管理ソフトを入れていますが、そこでMySqlを開くと作成されているはずのDBが見えない。
どうもapacheを経由するとうまくいかないような。
sshが使えるのならps ax | grep mysql
とするとどのような結果が変えるのでしょうか
>>一度再インストールをしたほうが良いでしょうか。
時間があるのであれば原因までは突き止めた方がいいように思います。
例3)が成功しているということなのので対比して何か見つかるといいのですが
度々ご回答をありがとうございます。
調べましたところ、mysqli.so 自体がありませんでした。
mysqli.soのインストール方法について調べましてから再度結果をご連絡致します。
ご回答ありがとうございます。
DBのバージョンですが、pear list で見た結果、下記の通りでしたので問題ないと思われます。
Auth 1.2.3 stable
DB 1.7.6 stable
また、例3の方法で接続ができておりますので、パスワード等にも問題無いと思われます。
サーバーの設定が問題なのでしょうか・・・