2016-12-26 15 views
0

私はデータベースに接続してクエリを実行するクラスを持っています。OOP PHP他のクラスから新しいmysqliを取得できません

しかし、私は他のクラスからこのデータベースにクエリを行うことはできません。問題はクラスCdがdb接続コマンドを見ることができないことです - >クエリを作成できません。ここでは、コードは次のようになります。

require_once('config.php'); 
class myClass 
{ 
    public $mysqli; 
    public $res; 
    function connect() 
    { 
     $database = new Database(); 

     $this->mysqli = new mysqli($database->db_host, $database->db_user, $database->db_pass, $database->db_table); 
    } 
    function cd($id) 
    { 
     ...... 
     } 
    }   
} 

class Cd extends myClass 
{ 
    function cdname($id) 
    { 
     $get= new Scandiweb(); 
     $get->mysqli; 

     $this->res = $get->mysqli->query("SELECT * FROM disk WHERE id=" . $id . ""); 
     if ($this->res->num_rows > 0) { 
      ......... 
     } 
    } 
} 
+0

は 'config.php'ファイルのコードを共有していますか? –

+0

この質問に 'oop'というタグを付けることが許されていますか? – Federkun

+0

なぜあなたはScandiwebを拡張しましたか?あなたのdbクラス名はmyClassです。だから、あなたはmyClassのオブジェクトを作成する必要があります。scandiweb ... –

答えて

0

あなたのコードは少し厄介なので、それは問題がどこにあるかを正確に伝えるのは難しい:

  • あなたは設定が必要なのはなぜ?
  • なぜDbConfigに似ているデータベースを渡すのではなく、コンストラクタに作成するのですか?
  • Scandiwebクラスとは何ですか?
  • は、なぜあなたは最後のものは、あなたの即時のミスである代わりに$this

のそのクラスにmysqli->クエリを呼び出します。 myClassを拡張してmysqli-connectionを作成し、それをクラス変数$this->mysqliとして保存します。つまり、子クラスCdにアクセスできます。クラスを拡張するときには、そのすべてをpublicおよびprotectedのプロパティとメソッドと呼ぶことができます。プライベートとしてマークされたものだけにアクセスすることはできません。

つまり、$get->mysqli->query(...)にアクセスする代わりに、$this->mysqli->query(...)とすることができます。 OOPで意味をなさないのは、コンストラクタでのように一度接続を作成し、データベース接続が必要なサービスに渡すことです。これはDependency Inversion Principleと呼ばれ、Dependency Containerを使用すると簡単になります(必須ではありません)。

上記のコードのようにSQLクエリを処理する方が簡単な設計パターンがあります。最も一般的なのは、LaravelのEloquentとPropelライブラリで使用されているActive Record-patternです.Zend FrameworkのDBコンポーネントではTable Data Gateway-pattern、Doctrine ORMではData Mapper-patternが使用されています。 OOPコードを書いてみたいのであれば、ドキュメントを見て、すべてを自分で扱う代わりにそれらのドキュメントを使うべきです。

+0

ありがとうございます。私はちょうど私があなたに与えたコードでいくつかの間違いを犯しました。元のコードでは私は何も持っていません。 – faik371

関連する問題