• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:こんにちは、PHP初心者です。)

PHP初心者のためのSmartyを利用したWebサイト構築中に発生するエラーについて

このQ&Aのポイント
  • Smartyを利用してWebサイトを構築中のPHP初心者が、派生クラス内のコンストラクタでDB接続オブジェクトを設定した際、コンストラクタ外でクエリを実行するとエラーが発生する問題が発生しました。
  • 派生クラスのコンストラクタ内では正常にクエリを実行できるのに対し、コンストラクタ外で実行するとエラーが生じる原因については不明です。
  • エラー内容は「SELECT * FROM books [nativecode=1046 ** No database selected]」であり、テーブルから値を取得する際にデータベースが選択されていないことが原因と考えられます。

質問者が選んだベストアンサー

  • ベストアンサー
noname#243182
noname#243182
回答No.2

クエリを発行する前にデータベースを選択しなければなりません。エラー内容もこれを指摘しています。 $dbname 変数が不定であることから、このような状況に陥ったものと考えられます。

ichitarou2616
質問者

補足

レスありがとうございます。ご指摘された通りなるほどと思い、変数を$dbname→$nameに訂正したのですが、それでも同じエラーがでます。DBオブジェクトとして戻り値はエラーになってないのですが、なぜかデータベースエラーがでます。他に何か原因があるのでしょうか?

その他の回答 (2)

noname#243182
noname#243182
回答No.3

DSN が上手く処理されていないのかもしれません。 変数名の終りを明示的に指定したい場合は、変数名を波括弧で括ってください。 "mysql://{$user}:{$pass}@{$host}/{$dbname}"

参考URL:
http://www.php.net/manual/ja/language.types.string.php#language.types.string.parsing
ichitarou2616
質問者

補足

こんにちは。ご指導ありがとうございます。どうもクラス内で変数を宣言する場所が悪かったみたいで、変数の宣言場所を色々変えたみたところDNSの処理が正しくできるようになりました。 ======訂正前======= <?php $user = "dbuser"; ← ここ $pass = "dbpassword"; ← ここ $name = "mobilephp"; ← ここ $host = "localhost"; ← ここ require_once("DB.php"); require_once("Smarty/libs/Smarty.class.php"); class MySmarty extends Smarty { private $_db; public function __construct() { $this->Smarty(); $this->template_dir="../templates"; $this->compile_dir="../templates_c"; $this->_db=DB::connect("mysql://$user:$pass@$host/$dbname"); } public function __destruct() { $this->_db->disconnect(); } public function get_db() {return $this->_db;} } ?> ======end===================================== ======訂正後======= <?php require_once("DB.php"); require_once("Smarty/libs/Smarty.class.php"); class MySmarty extends Smarty { $user = "dbuser"; ← ここにしてもだめ(前にglobal をつけてもだめ) $pass = "dbpassword"; ← ここにしてもだめ $name = "mobilephp"; ← ここにしてもだめ $host = "localhost"; ← ここにしてもだめ private $_db; public function __construct() { $user = "dbuser"; ← ここにしたらOK $pass = "dbpassword"; ← ここにしたらOK $name = "mobilephp"; ← ここにしたらOK $host = "localhost"; ← ここにしたらOK $this->Smarty(); $this->template_dir="../templates"; $this->compile_dir="../templates_c"; $this->_db=DB::connect("mysql://$user:$pass@$host/$dbname"); } public function __destruct() { $this->_db->disconnect(); } public function get_db() {return $this->_db;} } ?> ======end===================================== クラスないでグローバル変数を宣言してもだめで、コンストラクト内でならOKなのかがわからないです。とりあえず動くようにはなったのですがー{}をつけてもだめでした。

  • lunarx
  • ベストアンサー率39% (16/41)
回答No.1

質問者のやっていることの意味がわからない。 どうしてSmartyの継承クラスでDB処理をする?

ichitarou2616
質問者

補足

はじめまして。理由は、Smarty入門という参考書で勉強してるからです。入門書ではmysqlじゃなくてsqliteを使って説明してるんですが、勉強不足でsqliteじゃなくてmysqlで出来ないかと試行錯誤してる最中なんです。別にする必要はないと思いますが、なぜsqliteはOKでmysqlはだめなのか理由が知りたいからです。

関連するQ&A