0
$DB_HOST = "localhost";
$DB_NAME = "rawr";
$DB_USER = "rawr";
$DB_PASS = "hunter2!";
$tableprefix = "hunter_";
$mysqli = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
    class ACL
{....

私は現在それを持っていますが、すべての ACL コマンドでそのデータベース接続を使用できません。クラス内でそのデータベース接続を使用できるようにするにはどうすればよいですか?

4

6 に答える 6

1

$mysqli は範囲外です。オプションが必要です:

1) グローバル変数を使用します。

function XXXX () {
    global $mysqli;
    ...
}

2)コンストラクタに渡します(これはより良いです)

public function __construct($mysqli) {
    $this->_mysqli = $mysqli;
}

そして、クラス内からそれを参照するだけです$this->_mysqli

于 2013-03-11T21:44:55.790 に答える
0
 class ACL {

       public function __construct() {
            $DB_HOST = "localhost";
            $DB_NAME = "rawr";
            $DB_USER = "rawr";
            $DB_PASS = "hunter2!";
            $tableprefix = "hunter_";
            $conn = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
            if (mysqli_connect_errno()) {
                   printf("Connect failed: %s\n", mysqli_connect_error());
                   exit();
            } else {       
                   $this->conn = $conn;
            }
       }

       public function command1()
       {
            //use connection object as $this->conn 
            ///your code
       }
}
于 2013-03-11T21:47:53.583 に答える
0

使用している接続が適切な環境にあることを確認してください。globalたとえば、次のように実行できます。

class ACL {
    function DoSomething() {
        global $mysqli;
        ...
    }
}
于 2013-03-11T21:45:24.910 に答える
0

ここに別のアプローチがあります。データベース接続を別のユーティリティ クラスに抽象化します。

<?php
class DB
{
    const DB_HOST = "localhost";
    const DB_NAME = "rawr";
    const DB_USER = "rawr";
    const DB_PASS = "hunter2!";

    protected static $instance;
    public static function instance()
    {
        if (empty(self::$instance))
        {
            self::$instance = new mysqli(self::DB_HOST, self::DB_USER, self::DB_PASS, self::DB_NAME);
        }

        return self::$instance;
    }
}

これは制御の反転ではありませんが、データベースへのアクセスはほとんどのアプリにとって非常に重要であるため、パターンとして使用しても安全です。

<?php

// Note: make sure DB class is loaded!

class ACL // Note: this doesn't extend DB!
{
    public function __construct()
    {
        // you can now access your $mysqli object with DB::instance()
    }
}
于 2013-03-11T23:07:20.503 に答える
0

インスタンス化するときに、その mysqli インスタンスを ACL クラスに渡す必要があります。クラス宣言の外で宣言されたローカル変数を自動的に認識しません。

于 2013-03-11T21:42:52.870 に答える
0

次のようなクラスで mysqli をラップできます。

class database {
    // do database stuff here
}

ACL を拡張する

class ACL extends database {
    // do acl stuff here with all your database stuff available
}
于 2013-03-11T21:49:17.203 に答える