2011-11-15 13 views
0

データベースクラスにmysqliオブジェクトの代わりにPDOオブジェクトをインスタンス化しました。明らかに私のmysqli関数はもはや動作しません。この行を更新するにはどうすればいいですか?mysqliからpdoコードへの更新

$row=mysqli_fetch_row(database::query($query));  

one_db :: $デシベルPDOのリソースを保持している...クエリは、ちょうど...

public function query($query) 
{ 
    return one_db::$db->query($query); 
} 

は、実は私は、これはPDOで動作するだけでなく、更新必要があるかどうかわからない..ですここで。

は私のPDOのインスタンスである、私はあなたが考慮するべきかもしれないように見えます比較

private function __construct() 
{ 
    self::create_pdo_object(); 
} 

private function create_pdo_object() 
{ 
    try { 
     self::$db = new PDO(DB_DRIVER, DB_USER, DB_PASS); 
    } catch (PDOException $e) { 
     echo 'Connection failed: ' . $e->getMessage(); 
    } 
} 

private function create_mysqli_object() 
{ 
    self::$db=new mysqli(DB_HOST, DB_USER, DB_PASS, DB_DATABASE); 
} 
+1

なぜ 'create_pdo_object()'メソッドとそのメソッドを呼び出すコンストラクタがありますか? 'create_pdo_object()'を取り除き、そのコードをコンストラクタに入れるのは簡単ではないでしょうか? – NullUserException

+0

ええ、NullUserExceptionが正しいアイデアを持っています! –

答えて

0

ためmysqliの中に残され工場パターンを使用します。残念ながら、あなたのケースでは、クラス全体を書き直したくないので、変更されたファクトリパターンを使用します。あなたの関数がstatic宣言されるべき、その後selfを使用するつもりなら、尚

public static function factory($type = 'mysqli') 
{ 
    switch ($type) { 
     case 'pdo': 
      return self::create_pdo_object(); 
     case 'mysqli': 
     default: 
      return self::create_mysqli_object(); 
    } 
} 

:そうのような)工場(という名前の関数を作成します。その場合は、prefix them with underscoresのベストプラクティスとみなされます。そしてもしに行くなら、の慣例に従うこともできます。 (ただし、がファクトリを使用する場合は、にアンダースコアの接頭辞を省略する必要がある場合は、これらの関数を公開する必要があります)。

また、__construct()関数のアクセス修飾子はpublicである必要があります。コンストラクタ内からfactory()を呼び出すことはできますが、静的クラスメンバ(self::$db)を使用する静的メソッドなので、オブジェクトをインスタンス化するのは無意味です。それにもかかわらず、ここでのコードは次のとおりです。

public function __construct($type = 'mysqli') 
{ 
    self::factory($type); 
} 

public static function factory($type = 'mysqli') 
{ 
    switch ($type) { 
     case 'pdo': 
      // return self::createPdoObject(); 
      // or, if private 
      return self::_createPdoObject(); 
     case 'mysqli': 
     default: 
      // return self::createMysqliObject(); 
      // or, if private 
      return self::_createMysqliObject(); 
    } 
} 

// public static function createPdoObject() 
// or 
private static function _createPdoObject() 
{ 
    try { 
     self::$db = new PDO(DB_DRIVER, DB_USER, DB_PASS); 
    } catch (PDOException $e) { 
     echo 'Connection failed: ' . $e->getMessage(); 
    } 
} 

// public static function createMysqliObject() 
// or 
private static function _createMysqliObject() 
{ 
    self::$db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_DATABASE); 
} 

限りPDOで行をフェッチするなど、あなたのようなものにコードを変更する必要があります:このコードは、あなたのデシベルのクラスに存在する場合

if ($db instanceof PDO) { 
    $query = $db->prepare($sqlSelectString); 
    $query->execute(); 

    // or use PDO::FETCH_ASSOC if you want arrays instead 
    $result = $query->fetch(PDO::FETCH_OBJ); 
} 

$dbself::$dbに変更しますが、そのコードをどこに置くかはわかりません。

PDOを使用したクエリの詳細については、this pageを参照してください。

+0

_は、Zendコーディング標準へのプライベートで保護されたアクセサリとして使用されます –

関連する問題