0

私は PHP に精通していますが、PHP でオブジェクト指向のことを少し始めたばかりです。シングルトン データベース接続を作成したかったのですが、問題とエラーが発生しました。私が実行しているクエリは

$con = getConnection();
$stmt = $con->prepare("SELECT gene_name,jgi_protein_id FROM   jgi_transcriptid_proteinid_match where our_protein_id = ?");

これがクラスのコードです。

class Connection
{
    // Store the single instance of connection 
    private static $connection;

    private function __construct()
    {
        $connection = new mysqli(HOSTNAME, DBUSER, PASSWORD, DBNAME);

        if ($connection->connect_errno)
            die("Failed to connect to MySQL: (" . $connection->connect_errno . ") " . $connection->connect_error);
    }

    public static function getInstance() 
    { 
        if (!self::$connection) 
            self::$connection = new Connection(); 

        return self::$connection; 
    }

    public function prepare($query) 
    {
        $statement = $this->prepare($query);
        return $statement; 
    }
}

データベースにはmysqliを使用しています。

4

1 に答える 1

5

このコードにはいくつかの問題があります。

無限再帰

public function prepare($query) 
{
  $statement = $this->prepare($query);
  return $statement; 
}

静的変数の代わりにローカル変数を参照する
コードはおそらく を参照する必要がありますself::$connection。ただし、クラスに基づいて、どこでも呼び出されていないself::$connectionで別の方法で使用されているため、getInstance()わかりません。

private function __construct()
    {
        $connection = new mysqli(HOSTNAME, DBUSER, PASSWORD, DBNAME);

        if ($connection->connect_errno)
            die("Failed to connect to MySQL: (" . $connection->connect_errno . ") " . $connection->connect_error);
    }

命名の混乱
クラスは と呼ばれ、クラスのシングルトン インスタンスを格納するConnectionという名前の静的変数が含まれています。$connectionコンストラクターに$connectionは、代わりにmysqli接続である別の が含まれています。

リファクタリングされたクラス - 未テストの修正
以下のクラスはテストされておらず、説明のために提供されています。自己責任。

class Connection { // クラスの単一のインスタンスを保存します private static $instance; // mysqli 接続を保存します private $connection;

public function __construct() {
    // NOTE: it would be better to pass connection parameters as arguments
    $this->connection = new mysqli(HOSTNAME, DBUSER, PASSWORD, DBNAME);

    if ($this->connection->connect_errno)
        die("Failed to connect to MySQL: (" . $this->connection->connect_errno . ") " . $this->connection->connect_error);
}

public static function getInstance() { 
    if(empty(self::$instance)) {
        self::$instance = new Connection(); 
    }

    return self::$instance; 
}

public function prepare($query) {
    $statement = $this->connection->prepare($query);
    return $statement; 
}

}

于 2012-11-30T18:34:45.013 に答える