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

PHPとSmartyとMySQLでWebアプリを作っていますが、
理解できないエラーが発生し、もう1週間ほど悩んでいます。
PDOを使用してデータベースに接続しているのですが、
接続部分のコードを、関数やクラスとして外部ファイルに切り出すと、
execute()でSQLクエリを発行する時に
"No Database Selected"というエラーが出てしまいます。
そこで、外部ファイルにすることに問題があるのかと思い、
試しに同じファイル内で関数として定義しても、
同じエラーが出てしまいました。
関数にしないでそのまま書き込むとエラーは生じません。
どなたか、ご教授頂けますと大変嬉しいです。
よろしくお願い致します。

以下、データベース接続部のコードです。

try {
$dsn = "mysql:dbname=$DBNM; host=$HOST";
$db = new PDO($dsn, $USER, $PASS);
} catch (PDOException $e) {
die ("接続エラー: {$e->getMessage()}");
}

関数にする場合は、getDb()という名前で
PDOオブジェクトを返すようにしていました。

function getDb() {
try {
$dsn = "mysql:dbname=$DBNM; host=$HOST";
$db = new PDO($dsn, $USER, $PASS);
} catch (PDOException $e) {
die ("接続エラー: {$e->getMessage()}");
}
return $db;
}
$db = getDb();

●質問者: pmvct
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:Catch DB DSN MySQL PHP
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● okaki
●33ポイント ベストアンサー

データベースを指定してないのが原因ではないかと思います。

▼参考ページ

http://sb.xrea.com/archive/index.php/t-3206.html


実際のSQLの記載がないので分かりませんが、

select * from データベース名.テーブル名といった具合に書くとエラーが出ないのではないでしょうか?


ちなみに記載されている関数から下記のテストファイルを作成しましたが、再現しませんでした。


function getDb() {

//環境に合わせた設定

$DBNM="test";

$HOST="localhost";

$USER="test";

$PASS="test";

try {

$dsn = "mysql:dbname=$DBNM; host=$HOST";

$db = new PDO($dsn, $USER, $PASS);

echo "db connect";

} catch (PDOException $e) {

die ("error : {$e->getMessage()}");

}

return $db;

}

$db = getDb();

//環境に合わせたSQL 簡易テスト版として、execute()でなくquery()を使ってます。

//testはカラムidを持ったテーブルです。

$sql = 'SELECT id FROM test';

foreach ($db->query($sql) as $row) {

echo $row[id];

}


?>


この回答で解決しない場合は、公開できる範囲で結構ですので下記の情報を頂けると新たな回答がでやすいと思います。


・関数版(エラー)と、非関数版(非エラー)とで条件は同じか?

参照テーブル

DB

テーブル

ユーザー

・関数版のソース(SQL周りのところ)

・上記ソースをpmvctさんの環境(DB、テーブル、ユーザー、パスワード、SQL(テーブル))に修正して実行した結果

◎質問者からの返答

お返事有り難うございました。

エラーが出ていた原因は、関数内で$DBNMなどの変数を参照していたせいでした。

globalキーワードを使用する事で、問題を解決する事が出来ました。

単純なミスで恐縮です…。

細かなアドバイス、大変感謝致しております。


2 ● deflation
●27ポイント

以下の、いずれかの設定間違いと思われます。

  1. 変数 $HOST の実体は "localhost" になっていますか?
  2. データベース名 $DBNM は間違っていませんか?

ご確認下さい。

◎質問者からの返答

お返事有り難うございます。

私からの返信が送れてしまい、大変申し訳ございません。

エラーが出ていた原因は、関数内で$DBNMなどを参照していたせいでした。

globalキーワードを使用する事で、問題を解決する事が出来ました。


3 ● taroe
●26ポイント

関数にした場合にうまく行かないのでしたら、

returnの戻り値がちゃんと受け渡されて思います。

関数にして、returnに戻すのを一時的にやめて、

グローバル変数に代入して,それを使うことで動作するのなら

ちゃんと値が受け渡されてないです。

あとは、変数をvar_dampして、オブジェクトがちゃんと入ってるかどうかを

確認するしかないです。

◎質問者からの返答

お返事とアドバイス、有り難うございます。

私からの返信が送れてしまい、大変申し訳ございません。

エラーが出ていた原因は、関数内で$DBNMなどを参照していたせいでした。

globalキーワードを使用する事で、問題を解決する事が出来ました。

関連質問


●質問をもっと探す●



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