2012-03-15 2 views
7

저는 PDO와 PHP에 대한 OOP를 일반적으로 잘하고 있습니다. 기본적으로 PDO 기반의 연결 객체를 만들려고합니다. 그래서 내 사이트 전체에 하나의 연결을 가질 수 있습니다.PDO mysql 정적 연결 클래스를 만드는 가장 좋은 방법은 무엇입니까?

아래 작성하려고하는 것과 동일한 db 오브젝트를 사용하여 통과 한 ID를 기반으로 다른 결과를 간단하게 찾는 준비된 명령문이 필요합니다.

아래에서 설정 한 db 클래스를 만들고 액세스 한 다음 함수 내에서 필요한 관련 정보를 추출하려면 어떻게해야합니까? 어떤 사례라도 훌륭 할 것이므로 모범 사례에 대한 아이디어를 얻을 수 있습니다.

미리 감사드립니다.

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
    PDO::ATTR_PERSISTENT => true 
)); 

당신은 다시 싱글 톤 패턴를 사용하지 않음으로써 시작할 수 Example #4 Persistent connections

+0

$ this는 정적 메서드와 정적 속성에서는 사용할 수 없습니다. self :: $ property를 사용해야합니다. 그렇지 않으면 속성 db :: property가 정의되지 않았습니다. – jscripter

+0

@BubuDaba는 다른 asnwers와 관련성이 없어 질 수 있으므로 질문에서 부적절한 코드를 편집하지 마십시오. OP에 대한 제안이있는 경우 대답이나 설명을 작성하십시오 –

답변

5

를 참조하십시오

class db { 

    private static $connection; 

    private function __construct(){} 
    private function __clone(){} 

    private static function connect($db_server="localhost", $db_user="user", $db_pass="password") { 
     if(!$this->connection){ 
      try{ 
       $this->connection = new PDO($db_server, $db_user, $db_pass); 
      } catch (PDOException $e) { 
       $this->connection = null; 
       die($e->getMessage()); 
      } 
     } 
     return $this->connection; 
    } 

} 

$dbh = new db::connect(); 

$stmt = $dbh->prepare("SELECT * FROM questions where id = ?"); 
if($stmt->execute(array($_REQUEST['testid']))) { 
    while ($row = $stmt->fetch()) { 
    print_r($row); 
    } 
} 
+0

왜 정적 클래스가 일반적으로 나쁘다는 말입니까? 제 자신의 PDO 래퍼에 정적 클래스를 사용합니다 ... 나를 위해 잘 작동하는 것 같습니다. 우리가 그들을 피해야하는 특별한 이유가 있습니까? – BenOfTheNorth

+0

@BenGriffiths, 몇 가지 이유. 주된 문제는 정적 클래스 *를 사용하면 다형성을 사용할 수 없다는 것입니다. 메소드의 실행은 클래스의 ** 이름 **에 연결됩니다. 또한 이것은 실제로 OOP가 아닙니다. 정적 클래스는 실제로 쇼용으로 만 존재합니다. 네임 스페이스 구조에 바인딩 된 함수 목록이 있습니다.어쨌든, 주제를 연구하면됩니다. 많은 자료가 있습니다. 좀 더 나은 실습을 배우고 싶다면 [여기에서 시작할 수 있습니다] (http://kore-nordmann.de/blog/0103_static_considered_harmful.html). –

+0

고마워, 내가 살펴볼거야. 정적 사용에 대한 나의 개인적인 이유는 클래스 전체를 선언 할 필요가 없기 때문이거나 다른 객체에 전달할 필요가 없기 때문입니다. 이것은 일정한 객체의 일종으로 유용합니다. 내 경우에는 거대한 클래스가 필요하지 않지만 작은 정적 클래스로 래핑하면 관리하기가 더 쉽고 정리가 쉽습니다. – BenOfTheNorth

0

영구 연결이 내장되어 있습니다. 그것은 (그리고 정적 클래스는 일반적으로) 절차 적 프로그래밍의 전역 변수가 왜 나쁜지에 대한 모든 동일한 이유에서 나쁘다.

그건 그렇고 ... 연결 개체의 고유성을 강화하는 대신 모든 곳에서 동일한 연결을 사용하고 있는지 확인해야합니다. 모두 $foo$bar 객체가 같은 PDO 인스턴스에 액세스 할 수 있습니다이 시점에서

class Foo 
{ 
    protected $connection = null; 
    public function __construct(PDO $connection) 
    { 
     $this->connection = $connection; 
    } 
} 

class Bar 
{ 
    // all the same as in Foo 
} 

$connection = new PDO('sqlite::memory'); 

$foo = new Foo($connection); 
$bar = new Bar($connection); 

:

는 여기가 무슨 뜻의 예입니다. 데이터베이스에 액세스해야하는 객체가있는 경우에는 생성자에서 연결을 제공하면됩니다.

시청을 할 수 있습니다 두 개의 동영상이 있습니다 (슬라이드는 자바 코드가 포함됩니다,하지만 당신은 더 난처한 이해를이 없을 것) : 의사 변수

+0

원래 질문에 대한 답변을 제공하지 않는 경우에도 유용합니다. 아마도 주석으로 게시해야 할 수도 있습니다 ...// 또는 아마도 */* 답변 : LogicException {}; ('some/more.php'); ''와 $ re = new Answer(); if ('원하는 == $ to);} catch (Points $ for) {새로운 답변 () 또는 죽으십시오 ($ for.this);)' –

+2

코미디언이 여기 있습니다. –

관련 문제