こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

mysqlに接続が出来ません

mysqlとphpを使ってウェブアプリを作ろうとしていますが、mysqlへの接続が出来ません。接続に失敗するのではなく「not found」と言われます。試しにgetDebugInfo()の出力は、「Unable to include the DB/.php file for ''」となります。

環境は、WinXpのxampp1.5.5 です。あるサイトで上記のようなメッセージはpearがおかしいのではという記述を見て、xampp自体を再インストールもして見ましたが変わりません。

DB/table共に存在しデータも入っておりコマンドラインからは、アクセスが出来ます。

もう一つデストラクタを宣言していると、以下の様なエラーが出るので
コメントアウトしています。
Fatal error: Call to a member function disconnect() on a non-object in hogehoge.php

以下にコードを載せますので何が間違っているのかご教授ください。
------------------------------------------------------------
require_once("DB.php");
class MyDb {
 private $_db;
 private $dsn = array(
        'phptype' => "mysqli",
        'hostspec' => "localhost",
        'database' => "vhmaster",
        'username' => "webuser",
     );
 private $option = array(
        "autofree"=>TRUE,
        "debug"=>1,
        "portability"=>DB_PORTABILITY_ALL
      );
 public function __construct(){
   $_db=DB::connect($dsn,$option);
   if(DB::isError($_db)){
     #print_r(get_loaded_extensions());
     die("接続失敗:".$_db->getDebugInfo());
   }
 }
 /*
 public function __destruct(){
   $_db->disconnect();
 }
 */
}
--------------------------------------------------------

投稿日時 - 2007-03-03 15:05:22

QNo.2799353

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

「not found」となる原因は、クラス変数で指定したDSNとオプションがDB::connect()にわたっていないためでしょう。
$this->_db = DB::connect($this->dsn, $this->option);
でうまくいくのでは。

補足に書かれていたコードのデストラクタの問題はコーディングミスですね。アンダースコア("_")が抜けています。
$this->_db->disconnect();
ですね。(そのあとのエラー判定の部分も修正してください)

投稿日時 - 2007-03-04 18:49:50

お礼

回答ありがとうございます。確かに_忘れてました。
しかし、修正しても状況は同じでした。
あれから色々やっていたら突然接続できるようになりました。
結局、何が原因なのか分からないという一番良くない結果となってしまいまいました。同様のことが再発しても対応できないです。
もう一度良く勉強しなおします。
回答を下さった皆さん、ありがとうございました。

投稿日時 - 2007-03-18 08:12:30

ANo.3

一応クラス化しない状態での上記のソースでの接続は問題ないんですよね?
それと多分関係ないと思うけど
$dsn="mysqli://~"の形式で書いてDB::connectに送っても動かないですよね?
mysqliではなくてmysqiではどうなるか?

投稿日時 - 2007-03-04 01:53:33

お礼

色々試していて返事が遅れて申し訳ありません。
前に書いたクラス化したコードを止めて、クラスを使わないPEARライブラリを使ったコードを作り試したらキチンと動いたので、そのコードを改めてクラス化してみたらなんと動きました。特にやってる事に変わりはないのですが、分けが分かりません。
相変わらずデストラクタを活かすと
”Fatal error: Call to a member function disconnect() on a non-object in ...”
とか言われますし

以下にそのコードを載せます。今度はパスワードも設定してます。
----------------- code ------------------
<?php
require_once("DB.php");
class MyDbAcs extends DB {
 private $_db;
 public function __construct(){
  $dsn= "mysqli://webuser:webuser01@localhost/vhmaster";
  $this->_db=DB::connect($dsn);
  if(DB::isError($_db)){
   die("接続失敗:".$db->getMessage());
  }
  return $this->_db;
 }
 public function getIssue($handler,$limit,$page){
  $hdl_name = "'" . $handler . "'";
  $of = $limit * $page;
  $sql="SELECT * FROM vul WHERE handler=$hdl_name ORDER BY udate DESC LIMIT $limit OFFSET $of";
  return $this->_db->query($sql);
 }
 /* 何故かエラーになるのでコメントアウト
 public function __destruct(){
  $this->db->disconnect();
  if(DB::isError($db)){
   die("Destructor:".$db->getMessage());
  }
 }
 */
}//--------------- End of MyDbAcs ------------------------

/***************************************
  Main stream
****************************************/
$db = new MyDbAcs();
$rs = $db->getIssue("suzuki",20,2);

print("<table border=\"1\">");
 while($row=$rs->fetchRow(DB_FETCHMODE_ASSOC)){
  $id=$row['id'];
  $name=$row['name'];
  $progress=$row['progress'];
  $udate=$row['udate'];
  print("<tr>");
  print("<td>$id</td><td>$name</td><td>$progress</td><td>$udate</td></tr>\n");
 }
print("</table>\n");
?>

投稿日時 - 2007-03-04 13:12:01

ANo.2

ちょい記憶が曖昧なんですが
>パスワードについては、初め設定していたのですが、どうにもおかしいのでよりシンプルにしようと思い一時的に外しております。
パスワードはなしに設定していてもデータとして
空("")データを送らないとダメだった記憶があります。

投稿日時 - 2007-03-03 22:42:02

お礼

ありがとうございます。
pearのdsnでは、passwordが無い場合は省略可でした。
何をやってもさっぱり駄目です。
このクラスにしているのが駄目なんでしょうか?
実はクラスを作るのは初めてなので、その辺も影響しているのかなー等と考えてしまいます。

投稿日時 - 2007-03-03 23:46:51

ANo.1

こんばんは。

さて、システム全体の様子が把握できていないのですが、ざっと見た限りでいえることは

(1)DBに接続の際、パスワードも必要だと思うのですが、ご質問を見る限りでは書かれていないようなのですが…

(2)DB.php のあるディレクトリと、ご質問のコードが存在するphpファイルのあるディレクトリとが同一でないのでは。

以上、2点です。解決につながってくれればいいのですが。

投稿日時 - 2007-03-03 17:37:33

お礼

回答ありがとうございます。
環境は、WindowsXPにXAMPPを標準インストールしただけです。

パスワードについては、初め設定していたのですが、どうにもおかしいのでよりシンプルにしようと思い一時的に外しております。
また、DB.phpはpearのディレクトリにあり、include_pathに設定しているので問題ないかと思いますが...

先ほど、書店で見たサンプルコードにpearを利用した自作クラスはDBクラスを継承していたので、同じようにして見ましたが変化ありません。
class MyDb extends DB { <--継承してみました。
private $_db;

投稿日時 - 2007-03-03 19:56:03

あなたにオススメの質問