人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

はじめまして。
現在、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の方法で接続できないといけないのです。
お力添えの程、宜しくお願い致します。

●質問者: kyoto-jin
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:2.0 CONNECT dB DSN FreeBSD
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● tobeoscontinue
●20ポイント

mysqliではDBのバージョンが1.6.3以降のようです。

http://peardoc.xole.net/package.database.db.intro-dsn.html

あるいはパスワードに$や@などの文字が含まれている可能性はないでしょうか

◎質問者からの返答

ご回答ありがとうございます。

DBのバージョンですが、pear list で見た結果、下記の通りでしたので問題ないと思われます。

Auth 1.2.3 stable

DB 1.7.6 stable

また、例3の方法で接続ができておりますので、パスワード等にも問題無いと思われます。

サーバーの設定が問題なのでしょうか・・・


2 ● mugenkoubou
●20ポイント
$dsn = 'mysqli://a:b@localhost/c';

$dsn = 'mysql://a:b@localhost/c';

に変えればいけないでしょうか?

◎質問者からの返答

ご回答ありがとうございます。

お教え頂いた方法で試してみましたが、接続はできませんでした。

※php.iniファイルの設定は変更しておりません。

php.iniの設定も詳しく調査してみたいと思います。もし思い当たる部分があればご教授いただければ、とても助かります。

何卒宜しくお願い致します。


3 ● tobeoscontinue
●20ポイント

>>サーバーの設定が問題なのでしょうか・・・

例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


4 ● tobeoscontinue
●20ポイント

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」についてはコメントアウトしてみましたが、動きに変化はありませんでした。

フォルダ構成等もデフォルトと異なるようですし、一度再インストールをしたほうが良いでしょうか。

恐れ入りますが何分、初心者ですので、アドバイスを下さいますよう、お願い申し上げます。


5 ● tobeoscontinue
●20ポイント

>>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のインストール方法について調べましてから再度結果をご連絡致します。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ