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

phpのMDB2について質問です。
下記のようなコードを書いてみたのですが、ブラウザ経由だと問題ないのに、php sample.php という形でコマンドラインから実行をすると"Fatal error: MDB2 Error: not found in ***"というエラーが出てしまいます。
<?php
set_include_path(get_include_path().PATH_SEPARATOR."../lib");
require_once("MDB2.php");
$db =& MDB2::connect('mysql://root:namaco@localhost/azisaii');
if (PEAR::isError($db)) {
trigger_error($db->getMessage(), E_USER_ERROR);
}
?>
ネットで調べると、MDB2_Driver_sqliteが入っていない場合によく出るエラーだということは分かっているのですが、MDB2_Driver_sqliteもインストール済みです。ブラウザ経由でアクセスする際には問題ない(DBにクエリを投げて結果を取得できることも確認済み)のも確認しています。
apache経由の実行ではないので、何かしらのパスが通ってないとかなのかな・・と思ったのですが、何を試していいものやら途方にくれてしまっています。

お手数ですが何かわかるかたはお教えいただけますと幸いです。

以下、環境です。
・apache 2.2.14
・php 5.3.1
・MDB2 2.4.1

●質問者: n_maco2
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:Apache CONNECT dB LIB localhost
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● うぃんど
●83ポイント ベストアンサー

【1】MDB2_Driver_sqliteは無関係

データベースはMySQLですよね

ブラウザ経由で動いているので MDB2_Driver_mysql が正しくインストールされてます

【2】ブラウザ経由(apache経由)とコマンドラインの大きな違い

apache経由 コマンドライン
phpの挙動 apacheモジュールあるいはCGI CLI
ユーザー(アクセス権限) apacheを動かしているユーザー OSにログインしているユーザー
カレントディレクトリ 仮想パス 実パス

その他、細々とした違いがあるのですが関係なさそうなので今回は割愛します

【3】NOT FOUND

仮想パスと実パスの違いにより位置関係が崩れてしまい MDB2.php が見つからないというエラーが出ているようですから、

get_include_path() の結果と MDB2.phpのパスを調べて set_include_path() を書き直せばよいでしょう

apache経由とコマンドラインは基本的に別物となりますので知識は知識として持っておいて、

改造などせず素直にapache経由でテストを行うのが良いと思います(改造点が増えればミスする可能性も増えますし)

◎質問者からの返答

詳しいご説明ありがとうございます。

でもMDB2.php自体へのパスは通っているように思います。というのは"Fatal error: MDB2 Error: not found in ***"は、$db->getMessage()が返しているエラー文章のためです。MDB2.phpが見つけられない場合は(わざとパスを間違えてやってみたのですが)"Warning: require_once(MDB2.php): failed to open stream: No such file or directory in ***"になるはずです。

MDB2.phpを見つけているにも関わらずMDB2がNot foundと言っているものがなんなのかがわからない・・といった状況です。


※追記

できればapache経由にしたいところなのですが、管理用のスクリプトでDBを使う必要があり、apache経由にしにくい状態なのです。perl等の他言語でライブラリを書き直すのも面倒ですし・・なんとかphpのMDB2をスクリプト経由で動かすことができれば、一番楽なのですが・・・

※追記2

コマンドラインから実行する際にsudoで実行してみたのですが、それでも変わりませんね・・


2 ● yamaneroom
●3ポイント

コマンドラインから実行するときのカレントパスに "MDB2.php" がない。

対策としては、

require_once("MDB2.php");

の部分を絶対パス指定してやること。

◎質問者からの返答

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

絶対パス指定はしていませんでした。ただ、set_include_pathを使って正しいディレクトリがinclude_pathに含まれるようになっていたので、その当たりの問題ではないのかなと感じています。念のため絶対パスに描き直してやってみたのですが、特に症状に変化はありませんでした。


3 ● kaijikaiji
●3ポイント

Apache 経由とコマンドラインでは、使用される php.ini が異なっている可能性があります。異なっている場合は、get_include_path() で返される値も異なっている可能性があります。一度確認されてはどうでしょうか。

◎質問者からの返答

ご指摘ありがとうございます。

get_include_pathで確認したのですが、PEARのパスが違うくらいでした。

そこでset_include_pathを使って完全にapacheでもスクリプトでも同じパスで実行されるように変えてみたのですが、完全に同じにも関わらずやはりapache経由だと実行できて、コマンドラインだと実行できません。

※追記

使っているphp.iniを揃えるために、ブラウザでphpinfoを取得してそこに表示されているphp.iniのパスを取得しました。その後下記のようなコマンドで実行して、php.iniをブラウザと同じものに変えて実行してみたのですが・・

php -f sample_MDB2.php -c /private/etc/php.ini

やはり症状は変わりませんでした。php.iniまで同じなのに・・(-iオプションでphp.iniのパスが同一になっていることを確認)


4 ● la-la-land
●3ポイント

php.iniのたとえばextension_dirなどのディレクトリのパスを絶対パスにするとかはどうですか。

同じphp.iniで参照先が違うというのは見てるユーザーの違いでどこかの相対パスの参照先が変わってるからだと思います。

◎質問者からの返答

上記ありがとうございます。

確認してみたのですが元々extension_dirは絶対パスで書いてあったようです・・

またその他パス類で相対パスで設定されているものはないか一通り見てみたのですが、全て絶対パスで書かれているようです

関連質問


●質問をもっと探す●



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