2011-11-15 3 views
0

데이터베이스 클래스에서 mysqli 객체 대신 PDO 객체를 인스턴스화했습니다. 분명히 내 mysqli 함수는 더 이상 작동하지 않습니다. 이 행을 어떻게 업데이트합니까? 데시벨은 PDO 자원을 보유하고 one_db : $mysqli에서 pdo 코드 업데이트로 업데이트

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

는 ... 쿼리는이 PDO와 함께 작동하도록뿐만 아니라 업데이트해야하는 경우

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

는 사실 잘 모르겠어요 ... 그냥 .. . 여기

내 PDO의 인스턴스는, 내가 비교를 위해 mysqli에서 왼쪽은

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

그것은 당신이 모르는 것처럼 고려해야한다고 본다 팩토리 패턴을 사용합니다. 불행히도 귀하의 경우 전체 클래스를 다시 작성하지 않으므로 수정 된 팩토리 패턴을 사용하게됩니다. 과 같이 함수 이름 공장() 만들기 :

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

을 덧붙여, 당신은 당신의 기능을 static을 선언해야 다음 self을 사용하려고하는 경우. 어떤 경우에는 prefix them with underscores을 사용하는 것이 가장 좋습니다. 그리고 경로 인 경우 camel casing function names의 규칙을 따르십시오. (단, 이 공장을 사용하려면이 필요하지 않으므로 해당 함수가 공개되어야한다고 주장 할 수 있습니다.이 경우 밑줄 접두사는 생략해야합니다).

또한 __construct() 함수는 public 액세스 수정자가 있어야합니다. 생성자 내에서 factory()을 호출 할 수 있지만 static 클래스 멤버 (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와 행을 가져 오는, 당신이 뭔가에 코드를 변경해야이 코드가 DB 클래스에있는 경우

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 코딩 표준에 따라 개인 및 보호 된 accoring에 사용됩니다. –

관련 문제