あなたはDatabase
クラスのquery()
メソッドを呼び出そうとしています。そのクラスは$connection
プロパティにmysqli
オブジェクトを含んでいますが、mysqli
オブジェクトのquery()
メソッドは公開されていません。
あなたの現在のコードでは、mysqli
に直接query()
を呼び出すためにオブジェクト構造にさらにドリルすることができますが、これは面倒です。
// Call the query() method directly on the connection
$result = $this->mysqli->connection->query("SELECT shops.*, shops.id AS shop,SUM(price)...
それはあなたのクラスは、彼らはおそらく必要以上Database
クラスの内部の仕組みについての詳細を知ることが必要ですので、私はこのアプローチを好みません。それはあまりにも強く結びついている。
代わりにmysqli
オブジェクトの必要な機能をラップするDatabase
クラスにquery()
メソッドを作成することができます。
class Database {
function __construct(){
$this->connect();
}
public function connect(){
$this->connection = mysqli_connect(SERVER, USERNAME, PASSWORD, DATABASE);
}
// Expose a query() method that calles the inner mysqli's query
public function query($sql) {
return $this->connection->query($sql);
}
}
これは、1回のメソッド呼び出しですべての結果行を照会し、フェッチなど、より多くの機能、中にパックすることができます:あなたはそれをこの方法を行うと、あなたが呼び出すことができるはずです
class Database {
//....
// A more featured query() that returns the
// rows as an array
public function query($sql) {
$result = $this->connection->query($sql);
while ($row = $result->fetch_assoc()) {
$rows[] = $row;
}
// Return an array of all the rows fetched from the query
return $rows;
}
}
を$this->mysqli->query("...")
最初に試行したように、シンプルなバージョンで結果リソースを取得してください。その後、コードを自分で取得するか、より機能的なバージョンの連想検索結果の配列を取得する必要があります。
これらの種類のデータベースラッパークラスを作成すると、かなり迅速に扱いにくくなる可能性があります。アプリケーション内の他のクラスに公開するオブジェクトのうち、どのオブジェクトがどのような側面になっているかを慎重に検討してください。 Database
クラスのmysqli
メソッドをラップする方法はお勧めできません。その時点でDatabase
クラスのユーティリティが大幅に削減され、mysqli
オブジェクトを直接渡すこともできます。 mysqli
に機能を積極的に追加していない場合、それをラップする別のクラスを作成するのはあまり意味がありません。
注記:var $mysqli;
...これは古い廃止予定のクラスプロパティ構文です。 var
のキーワードはPHP4の痕跡であり、その使用は現在は推奨されていません。実際、最近のPHPのバージョンからは削除されています。代わりに、あなたはPHP5 +構文を経由して、それを宣言する必要があります:あなたの質問のタイトルで
// Declare as a public property
public $mysqli;
// Or better, as a private (or protected) property so it cannot
// be accessed outside the Main class' own methods
private $mysqli;
は、あなたが注入を述べました。あなたのクラスはそれを今はやっていませんが、Database
を事前にインスタンス化し、それを必要とするクラスコンストラクタに挿入することをお勧めします。重要なのは、これはため別ののデータベース接続を開くからあなたが構築あなたがMain
のインスタンスごとオブジェクトと他のクラスのを防止することができます
$db = new Database();
// Pass the $db to the other classes
$main = new Main($db);
:
class Main{
public $mysqli;
// Pass a database as a constructor param
public function __construct($database){
$this->mysqli = $database;
}
次にとしてそれをインスタンス化同じ方法。そうすることで、サーバーの利用可能なMySQL接続をすぐに使い切ることができます。
$ this-> mysqli-> query();というクエリ関数にアクセスします。 – Akintunde007
ここでは 'query'の使い方は表示されません。 –
データベースクラスの' query() 'の呼び出しは' $ this-> connection-> query() 'でなければなりません。 'query()'メソッドを使用して 'Database'クラスに直接ラップします。 'query()'を呼び出そうとしているところにコードを投稿してください。 –