2012-03-15 19 views
7

Tôi khá mới với PDO và OOP với PHP nói chung vì vậy hãy làm tốt :) Về cơ bản tôi đang cố gắng tạo một đối tượng kết nối dựa trên PDO để tôi có thể có một kết nối mà tôi gọi trong toàn bộ trang web của mình.Cách tốt nhất để tạo lớp kết nối tĩnh mysql PDO?

Tôi cần một số câu lệnh đã chuẩn bị, chỉ cần tra cứu các kết quả khác nhau dựa trên ID mà tôi chuyển qua sử dụng cùng một đối tượng db mà tôi đang cố gắng tạo bên dưới.

Làm cách nào để tạo và truy cập lớp db tôi đã đặt bên dưới và sau đó sử dụng các hàm bên trong để trích xuất thông tin có liên quan mà tôi cần? Bất kỳ ví dụ nào cũng tuyệt vời để tôi có thể có ý tưởng về các phương pháp hay nhất, v.v.

Rất cám ơn trước.

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

các pseudo-biến $ this không có sẵn bên trong các phương thức tĩnh và cho các thuộc tính tĩnh. Bạn nên sử dụng self :: $ property. Nếu không, nó sẽ nói thuộc tính db :: thuộc tính không được định nghĩa – jscripter

+0

@BubuDaba không chỉnh sửa mã không đúng trong câu hỏi vì nó có thể làm cho các asnwers khác không liên quan. Nếu bạn có một gợi ý cho OP, sau đó viết câu trả lời hoặc nhận xét –

Trả lời

5

Bạn có thể bắt đầu bằng cách không bao giờ sử dụng Singleton pattern một lần nữa. Nó (và các lớp tĩnh nói chung) là xấu cho tất cả các lý do tương tự tại sao các biến toàn cầu trong lập trình thủ tục là xấu.

Điều đó nói ... Thay vì cố gắng thực thi tính duy nhất của đối tượng kết nối, bạn nên đảm bảo rằng bạn sử dụng cùng một kết nối trên khắp nơi.

Dưới đây là một ví dụ về những gì tôi có nghĩa là bởi rằng:

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); 

Tại thời điểm này cả hai $foo$bar đối tượng sẽ được tiếp cận với PDO dụ cùng. Nếu bạn có một đối tượng cần truy cập vào cơ sở dữ liệu, thì bạn chỉ cần cung cấp đối tượng đó với một kết nối trong hàm tạo.

Có hai video mà bạn có thể muốn xem (slide sẽ chứa mã Java, nhưng bạn sẽ không có sự hiểu biết troble nó):

+0

Tại sao bạn nói các lớp tĩnh là xấu nói chung - tôi sử dụng một lớp tĩnh cho wrapper PDO của riêng tôi ... Có vẻ làm việc tốt cho tôi. Có lý do cụ thể nào chúng ta nên tránh chúng không? – BenOfTheNorth

+0

@BenGriffiths, một số lý do. Vấn đề chính là với * các lớp tĩnh * bạn không thể sử dụng đa hình. Việc thực hiện các phương thức được gắn với ** tên ** của lớp. Ngoài ra điều này là không thực sự OOP. Lớp tĩnh thực sự chỉ có cho một chương trình. Những gì bạn có là danh sách các hàm, được liên kết trong một cấu trúc không gian tên-ish.Dù sao, bạn chỉ nên nghiên cứu chủ đề. Có rất nhiều tài liệu. [Bạn có thể bắt đầu ở đây] (http://kore-nordmann.de/blog/0103_static_considered_harmful.html) nếu bạn sẵn sàng tìm hiểu một số phương pháp hay hơn. –

+0

cảm ơn, tôi sẽ xem xét nó. Lý do cá nhân của tôi để sử dụng tĩnh là bởi vì tôi không phải khai báo lớp ở khắp nơi, hoặc tiếp tục truyền nó cho các đối tượng khác - Nó hữu ích như một loại đối tượng không đổi. Tôi không cần một lớp học lớn trong trường hợp của riêng tôi, nhưng có nó bọc trong một lớp tĩnh nhỏ làm cho nó gọn gàng hơn và dễ dàng hơn để quản lý. – BenOfTheNorth

0

kết nối liên tục được xây dựng trong:

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

Xem Example #4 Persistent connections

+0

Điều này rất hữu ích ngay cả khi nó không cung cấp câu trả lời cho câu hỏi gốc, có lẽ nó sẽ được đăng như bình luận ... '/ * Hoặc có thể vì * của bạn/class Answer mở rộng LogicException {}; hãy thử {$ to = include ('some/more.php'); '' và $ re = new Answer(); if ('bạn muốn' == $ to);} catch (Points $ for) {new Answer () hoặc chết ($ for.'this ');} ' –

+2

Có một diễn viên hài ở đây. –