3

OOP の方法で PHP を使用するのは初めてですが、データベース接続クラスに問題があることがわかりました。

この mysqli 接続クラスを含むファイルがここにあります

$db_name = 'dbname';
$db_user = 'dbuser';        
$db_password = 'dbpassword';
$db_host = 'localhost';

class database {

    public $mysqli;

    public function connect($db_host, $db_user, $db_password, $db_name){

        $this->mysqli = new mysqli($db_host, $db_user, $db_password, $db_name);

        if ($mysqli->connect_errno) {
            return "Sorry Andre, but you seem to have messed up the DB connection :(";
        }
    }
}

$newConnection = new database;
$newConnection->connect($db_host, $db_user, $db_password, $db_name);

次に、別のファイルの db 接続で変数 $mysqli を使用したいと考えています。これは、$mysqli 変数を使用して接続するデータベースへの単純な挿入です。上記を接続ファイルに含めましたが、データベース クラス内でメソッドを呼び出したときに $mysqli 変数が返されないようです。PHPエラーが表示されます...

Fatal error: Call to a member function prepare() on a non-object in...

私はそれを使用して見ました

global $mysqli; 

うまくいきますが、それは良い習慣ではないと聞いたので、適切な方法でやりたいと思います。

私はOOPの使用に慣れていないため、ここで少し間違ったことをしている可能性があることを理解していますが、connect関数でその変数を返すことで、外部のクラスを作成してアクセスできると想定しました。

助けていただければ幸いです。

4

3 に答える 3

3

変更する必要があります:

$mysqli->connect_errno

に:

$this->mysqli->connect_errno
于 2013-01-26T14:54:54.753 に答える
3

外部で使用する場合は、インスタンスを介してクラス変数にアクセスします。

$newConnection = new database;
$newConnection->connect($db_host, $db_user, $db_password, $db_name);
$newConnection->mysqli /* here you have access from outside */

内部からキーワード$this...を使用します。

// like this from inside
if ($this->mysqli->connect_errno) {
    return "Sorry Andre, but you seem to have messed up the DB connection :(";
}

外部アクセスの使用から変数を保護したい場合:

  private $mysqli; 
  // instead of 
  public $mysqli;
于 2013-01-26T14:55:21.533 に答える
1
Fatal error: Call to a member function prepare() on a non-object in...

これは常に、メソッドを呼び出したものがオブジェクトではないことを意味します。あなたの場合:mysqliは初期化されていません。

一般的なヒント:connectは何かのように見えますが、コンストラクター内にある必要があります。

class d {
  public function __construct($db_host, $db_user, $db_password, $db_name){
    $this->mysqli = new mysqli($db_host, $db_user, $db_password, $db_name);
    if ($this->mysqli->connect_errno) {
      return "Sorry Andre, but you seem to have messed up the DB connection :(";
    }
  }

  public $mysqli;
}

$foo = new d('host', 'user', 'pass', 'dbname');
$foo->mysqli->prepare("something");

したがって、このクラスのインスタンスを取得すると、自動的に初期化されます。また、この方法で、初期化するたびに行を保存します。

于 2013-01-26T14:55:55.470 に答える