0

私はこれを持っています:

class Database{    
    private $name = '';
    private $user = '';
    private $password = '';   
    private $host = 'localhost';
    private $prefix = '';   
    private $connection_handle = null;

    private function Connect(){
        $this->connection_handle = mysql_connect($this->host, $this->user, $this->password); 

        if( !$this->connection_handle ){
            die( 'Could not connect: ' . mysql_error() );
        }else{
            mysql_select_db( $this->name, $this->connection_handle );
        }
    }

    private function Close(){
        mysql_close( $this->connection_handle );
    } 

    public static function Query( $query ){
        $this->Connect();   
            $result = mysql_query( $query, $this->connection_handle );
            if( !$result ){
                die( 'Error: ' . mysql_error() );
            }else{
                $DatabaseQuery = new DatabaseQuery();
                    $DatabaseQuery->result = $result;       
                    $DatabaseQuery->mysql_num_rows = mysql_num_rows($result);

                return $DatabaseQuery;
            }
        $this->Close();
    } 
}

「Database::Query」のように呼び出されるため、Queryを静的にしました。他の関数は他のクラスからアクセスする必要がないため、プライベートにしました。

クエリ関数から接続関数にアクセスすると、このエラーが発生します。

「オブジェクトコンテキストにないときに$thisを使用する」

privateは、これらの変数をこのクラスに対してプライベートにしますが、その中のすべてのメソッドで使用できると考えていたため、関数のスコープを取得する際に問題が発生しました...

私はself::Connect()を行うことができますが、それを使用することを保証するほど十分に理解していません...

self ::と%this->の違いを説明していただけますか

また、プライベート変数にアクセスできず、このクラスの外部でアクセスする必要はありません。このため、もう一度プライベート変数にしました...それでも$this->connection_handleには変数へのスコープがありません。

本当にそれらをすべて公開する必要がありますか?これらをこのクラスとその拡張機能でのみ使用できるようにする方法が必要ですか?

- - - - - - - - - - - 編集:///

私はすべての変数をプライベート静的にすることになりました。これはこれを行うための許容できる方法ですか?

- - - - - - - - - - - 編集:///

私は今このコードを持っています:

class Database{    
    private static $name = '';
    private static $user = '';
    private static $password = '';   
    private static $host = 'localhost';
    private static $prefix = '';   
    private static $connection_handle = null;

    private static function Connect(){
        self::$connection_handle = mysql_connect(self::$host, self::$user, self::$password); 

        if( !self::$connection_handle ){
            die( 'Could not connect: ' . mysql_error() );
        }else{
            mysql_select_db( self::$name, self::$connection_handle );
        }
    }

    private static function Close(){
        mysql_close( self::$connection_handle );
    } 

    public static function Query( $query ){
        self::Connect();   
            $result = mysql_query( $query, self::$connection_handle );
            if( !$result ){
                die( 'Error: ' . mysql_error() );
            }else{
                $DatabaseQuery = new DatabaseQuery();
                    $DatabaseQuery->$result = $result;       
                    $DatabaseQuery->$mysql_num_rows = mysql_num_rows($result);

                return &$DatabaseQuery;
            }
        self::Close();
    } 
}

しかし、ポインタ参照を返すことは機能していませんか?私は実際にはPHPポインターについてあまり最新ではありませんが、ここで私が間違っていることを誰かが明らかにしましたか?

これは、関数内でDatabaseQueryクラスの新しいインスタンスを宣言しているためです。HELPPP :)

編集::///////

クラスを終了しました。次のようになります。

class DatabaseQuery{
    public $result;
    public $mysql_num_rows;        
}

class Database{    
    private static $name = '';
    private static $user = '';
    private static $password = '';   
    private static $host = 'localhost';
    private static $prefix = '';   
    private static $connection_handle = null;

    protected function Connect(){
        self::$connection_handle = mysql_connect(self::$host, self::$user, self::$password); 

        if( !self::$connection_handle ){
            die( 'Could not connect: ' . mysql_error() );
        }else{
            mysql_select_db( self::$name, self::$connection_handle );
        }
    }

    protected function Close(){
        mysql_close( self::$connection_handle );
    } 

    public static function FetchQueries( &$queries ){
        $db_query = array();
            self::Connect();   
                foreach( $queries as $key => $query ){
                    $result = mysql_query( $query, self::$connection_handle );
                    if( !$result ){
                        die( 'Error: ' . mysql_error() );
                    }else{
                        $DatabaseQuery = new DatabaseQuery();
                            $DatabaseQuery->result = $result;       
                            $DatabaseQuery->mysql_num_rows = mysql_num_rows($result);  
                            $db_query[ $key ] = $DatabaseQuery; 
                    }
                }
            self::Close();
        return $db_query;
    } 
}

すべてのデータを上部(または別のファイル)で定義しているため、Model View Control(MVC)の方法で呼び出すことができます。

$queries = array(
    "bottoms" => "SELECT * FROM bottoms", 
    "users" => "SELECT * FROM users"           
);            
$dbr = Database::FetchQueries( $queries );


//display some users
while( $row = mysql_fetch_object( $dbr["apps"]->result ) ){
    echo $row->title; 
}    

//display some bottoms
while( $row = mysql_fetch_object( $dbr["bottoms"]->result ) ){
    echo $row->title; 
}

このMVCメソッドについてどう思いますか?

4

1 に答える 1

2

Databaseクラスをインスタンス化できるようにする必要があります。現在、クエリごとに新しい接続を開いていますが、これはひどいパフォーマンスです(本当に悪いです)。このクラスをシングルトンにすることができます(実際、通常はDBへの接続が1つだけであることが理にかなっているため、これが通常の方法です)。

したがって、コード(非常に単純化されたもの)は次のようになります。

class Database
{
  private static $instance;

  protected function __construct() {
    self::$instance = mysql_connect(...);
    // do some error checking!
  }

  protected function __clone() {}

  public static function getInstance() {
    if (!isset(self::$instance)) {
      self::$instance = new Database();
    }
    return self::$instance;
  }

  public function query($sql) {
    do mysql_query(...) and error checking, return $result or your own DatabaseQuery()
  }
}

このように、静的関数を呼び出すクエリを直接作成することはできませんが、このクラス内の別の関数を使用してクエリを追加することはできます。

public static function makeQuery($sql) {
  $db = self::getInstance();
  return $db->query($sql);
}

このクラスをインスタンスで使用するには、を呼び出す必要があります$db = Database::getInstance();。$ dbは、通常はパブリックメソッドを呼び出すことができるデータベースオブジェクトです。静的呼び出しを続けてクエリを実行する場合は、を呼び出します$result = Database::makeQuery($sql)。いずれにせよ、データベースへの接続は1つだけであることが保証されているため(シングルトンが行うことです)、クエリごとに新しい接続を開始するという現在のオーバーヘッドはありません。

また、古くて廃止されmysqliた関数の代わりに、またはその代わりに使用することを検討してください(上部の警告を参照してください)。各APIの詳細と利点については、を参照してください。pdo-mysql mysql_*mysql_connectChoosing a MySQL API

于 2012-12-12T12:40:18.600 に答える