理解できないエラーが発生し、もう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();
データベースを指定してないのが原因ではないかと思います。
▼参考ページ
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(テーブル))に修正して実行した結果
データベースを指定してないのが原因ではないかと思います。
▼参考ページ
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キーワードを使用する事で、問題を解決する事が出来ました。
単純なミスで恐縮です…。
細かなアドバイス、大変感謝致しております。
以下の、いずれかの設定間違いと思われます。
ご確認下さい。
お返事有り難うございます。
私からの返信が送れてしまい、大変申し訳ございません。
エラーが出ていた原因は、関数内で$DBNMなどを参照していたせいでした。
globalキーワードを使用する事で、問題を解決する事が出来ました。
関数にした場合にうまく行かないのでしたら、
returnの戻り値がちゃんと受け渡されて思います。
関数にして、returnに戻すのを一時的にやめて、
グローバル変数に代入して,それを使うことで動作するのなら
ちゃんと値が受け渡されてないです。
あとは、変数をvar_dampして、オブジェクトがちゃんと入ってるかどうかを
確認するしかないです。
お返事とアドバイス、有り難うございます。
私からの返信が送れてしまい、大変申し訳ございません。
エラーが出ていた原因は、関数内で$DBNMなどを参照していたせいでした。
globalキーワードを使用する事で、問題を解決する事が出来ました。
お返事有り難うございました。
エラーが出ていた原因は、関数内で$DBNMなどの変数を参照していたせいでした。
globalキーワードを使用する事で、問題を解決する事が出来ました。
単純なミスで恐縮です…。
細かなアドバイス、大変感謝致しております。