はじめまして。

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

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2006/10/10 21:45:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答5件)

id:tobeoscontinue No.1

回答回数220ベストアンサー獲得回数59

ポイント20pt

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

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

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

id:kyoto-jin

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

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

Auth 1.2.3 stable

DB 1.7.6 stable

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

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

2006/10/04 10:17:47
id:mugenkoubou No.2

回答回数10ベストアンサー獲得回数0

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

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

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

id:kyoto-jin

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

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

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

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

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

2006/10/05 09:47:31
id:tobeoscontinue No.3

回答回数220ベストアンサー獲得回数59

ポイント20pt

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

例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()で表示してみる

id:kyoto-jin

ご指示の通り試してみましたので結果をご報告します。

■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

2006/10/05 21:59:01
id:tobeoscontinue No.4

回答回数220ベストアンサー獲得回数59

ポイント20pt

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。今回ので解決できればいいのですが

id:kyoto-jin

ご連絡頂きました通りに変更しましたが、動きは変わりませんでした。

なお、気になる点として、以下の点がございます。

■php.ini で、「extension=mysqli.sock」という記述があった。

■Webminというサーバー管理ソフトを入れていますが、そこでMySqlを開くと作成されているはずのDBが見えない。

※SSHのコマンドで確認すると表示されます。あくまでWebmin上から見えないということです。

この点「extension=mysqli.sock」についてはコメントアウトしてみましたが、動きに変化はありませんでした。

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

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

2006/10/06 16:13:29
id:tobeoscontinue No.5

回答回数220ベストアンサー獲得回数59

ポイント20pt

>>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)が成功しているということなのので対比して何か見つかるといいのですが

id:kyoto-jin

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

調べましたところ、mysqli.so 自体がありませんでした。

mysqli.soのインストール方法について調べましてから再度結果をご連絡致します。

2006/10/09 20:30:34
  • id:kyoto-jin
    mysqli.soのみを入手することができず、時間があまりないこと、及び今後のメンテナンスを考え、OSをfedoraに変更することにしました。
    数々のアドバイスを頂いたにも関わらず原因究明に至らず、たいへん申し訳ございませんでした。

    また、これまでお力添えを頂き、ありがとうございました。
  • id:tobeoscontinue
    結局、有効な解決作を提供できず、申し訳ないです。

    検索していたところこのようなものを見つけました。
    [http://pear.php.net/bugs/bug.php?id=1526]
    PEAR::DBにバグがあるということです。盲点でした。
    ただDB 1.6.4のようでDB 1.7.6ではどうなのかわかりませんが
    エラーメッセージを見ると同じです。
    Can't connect to local MySQL server through socket '' (2)

    Fedoraでも同じようなら
    >|
    $dsn = array(
    'phptype' => 'mysqli',
    'username' => 'a',
    'password' => 'b',
    'hostspec' => 'localhost',
    'database' => 'c',
    'socket' => '/tmp/mysql.sock',
    );
    |<
    のように$dsnに'socket'を指定すればうまくいくかもしれません。
  • id:kyoto-jin
    ご連絡が遅くなりまして申し訳ございませんでした。
    fedoraに変更しましたところ、特に何も指定しなくとも問題なく動作するようになりました。
    いろいろとアドバイスを頂き、本当にありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません