チョコミントアイス

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();
 }
 */
}
--------------------------------------------------------

A 回答 (4件)

「not found」となる原因は、クラス変数で指定したDSNとオプションがDB::connect()にわたっていないためでしょう。


$this->_db = DB::connect($this->dsn, $this->option);
でうまくいくのでは。

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

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

お礼日時:2007/03/18 08:12

一応クラス化しない状態での上記のソースでの接続は問題ないんですよね?


それと多分関係ないと思うけど
$dsn="mysqli://~"の形式で書いてDB::connectに送っても動かないですよね?
mysqliではなくてmysqiではどうなるか?
    • good
    • 0
この回答へのお礼

色々試していて返事が遅れて申し訳ありません。
前に書いたクラス化したコードを止めて、クラスを使わない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

ちょい記憶が曖昧なんですが


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

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

お礼日時:2007/03/03 23:46

こんばんは。



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

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

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

以上、2点です。解決につながってくれればいいのですが。
    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2007/03/03 19:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!