2012-01-02 33 views
7

Tôi là người mới bắt đầu trong lập trình PHP và muốn được trợ giúp về một câu hỏi nhỏ. Xin hãy nhìn vào mã bên dưới:PHP OOP Lập trình MySQL


PHP Mã

<?php 
class Account 
{ 
    public function register() 
    { 
    $db_link = mysql_connect("localhost","root",""); // Create Connection 
    if (!$db_link) // Check connection 
    { 
     die(mysql_error()); 
    } 

    mysql_close($db_link); // Close Connection 
    } 

    public function login() 
    { 
    $con = mysql_connect("localhost","root","") // create connection 
    if (!$con) // create connection 
    { 
     die(mysql_error()); 
    } 
    mysql_close($con); //close connection 
    } 

} 
?> 

Câu hỏi của tôi là nếu tạo liên kết db riêng lẻ cho mỗi một đơn của các phương pháp của đối tượng là cách tốt nhất đi? Có cách nào tốt hơn hay thay thế để làm điều này? Hy vọng rằng tôi đã giải thích đủ tốt.


Điều sau đây có đúng không?

$x = new Account("localhost", "root", ""); 

-và x sẽ có kết nối riêng ... và sau đó đóng khi hoàn thành?

+2

Chỉ cần sử dụng 'mysql_connect()' và 'mysql_close()' ngay từ đầu và ở phần cuối của toàn bộ chương trình của bạn. Không cần phải khởi tạo một kết nối ở mọi phương thức. –

+0

@ldiqual: bình luận của bạn có thể là một câu trả lời! –

+4

@idiqual Bạn không nên khuyến khích sử dụng 'mysql_', đặc biệt là đối với ai đó vừa mới tham gia vào ngôn ngữ và đang bắt đầu một dự án mới. – cspray

Trả lời

9

Tôi sẽ không khuyên bạn nên tạo kết nối cơ sở dữ liệu theo cách này. Tạo một kết nối và tiêm nó vào đối tượng sử dụng nó. Bạn không cần tạo kết nối mới cho mọi đối tượng.

Mã dụ:

$connection = new mysqli('localhost', 'user', 'password'); 

$Account = new Account($connection); 

sẽ cần phải thay đổi Account để trông giống như:

class Account { 

    protected $connection; 

    public function __construct(mysqli $connection) { 
     $this->connection = $connection; 
    } 

    public function register() { 
     // use $this->connection for db 
    } 

    public function login() { 
     // use $this->connection for db 
    } 

} 

Tôi cũng xin đề nghị bạn nên có một cái nhìn tại php.net docs about choosing a MySQL API. Nếu bạn thực sự muốn sử dụng OOP với PHP và MySQL, bạn sẽ cần phải trao đổi qua mysqli hoặc PDO vì API bạn đang sử dụng không thực sự hỗ trợ giao diện OOP.

+0

Bạn quên đóng kết nối. –

+4

@GabrielSantos Không, tôi không đóng mục đích. Điều gì sẽ xảy ra nếu có một đối tượng khác cần sử dụng kết nối đó? Sau đó, chúng tôi phải mở lại kết nối. Mã tạo đối tượng kết nối phải chịu trách nhiệm đóng kết nối. – cspray

+0

+1 cho quan sát này. –

-1

Bạn có thể sử dụng thành viên tĩnh và tất cả các đối tượng của bạn sẽ chia sẻ một kết nối cơ sở dữ liệu.

cũng PHP - a DB abstraction layer use static class vs singleton object?

+1

Tôi sẽ không sử dụng cả (lớp tĩnh hoặc singleton). – PeeHaa

+1

Downvote dành cho singleton. Không có lý do để giới thiệu một kết nối cơ sở dữ liệu vào phạm vi toàn cầu với static – cspray

+0

@CharlesSprayberry Agree một lần nữa. –

-1

Xem Nếu bạn muốn thu nhỏ nó và giữ nó gọn gàng/dễ quản lý hơn bạn có thể đặt mysql kết nối mã vào phương pháp riêng của nó và gọi nó như vậy:

<?php 
class Account 
{ 
    private $connection; 

    private function connect() 
    { 
    $this->$connection = mysql_connect("localhost","root",""); // Create Connection 
    } 

    public function register() 
    { 
    $this->connect(); 
    if (!$this->$connection) // Check connection 
    { 
     die(mysql_error()); 
    } 

    mysql_close($this->$connection); // Close Connection 
    } 

    public function login() 
    { 
    $this->connect(); 
    if (!$this->$connection) // create connection 
    { 
     die(mysql_error()); 
    } 
    mysql_close($this->$connection); //close connection 
    } 

} 
?> 
+1

Bị bỏ qua vì cuối cùng bạn vẫn tạo kết nối cơ sở dữ liệu mỗi khi một hàm được gọi. – cspray

+0

@CharlesSprayberry Đồng ý với bạn. –

+0

@CharlesSprayberry Tôi đã giải thích sai câu hỏi gốc –

0

Bạn có thể sử dụng một số mã như là:

$db_link = mysql_connect("localhost","root",""); // Create Connection 
if (!$db_link) // Check connection 
{ 
    die(mysql_error()); 
} 
mysql_select_db("db_name"); 
$q=mysql_query("SELECET * FROM table_name LIMIT 1"); 

truy vấn khác sẽ có mặt ở đây

mysql_close($db_link); // Close Connection 

Tạo kết nối duy nhất tại mỗi trang là đủ. nhiều hơn một kết nối hoặc ngắt kết nối từ máy chủ sql và đăng nhập lại có thể làm giảm hiệu suất.

3

Tôi đề nghị:

public function __construct(mysqli $connection) { 
    $this->connection = $connection; 
    if(!$this->$connection) { 
     die(mysql_error()); 
    } 
} 

public function __destruct() { 
    mysql_close($this->$connection); 
} 
+0

Tôi không chắc chắn tôi muốn khuyên bạn nên sử dụng chết trong trường hợp này (hoặc bất kỳ OO). – cmbuckley

+0

@cbuckley Nó chỉ dành cho mục đích mẫu. –

+0

Mối quan tâm duy nhất của tôi là nó có thể là một ví dụ xấu để thiết lập cho một lập trình viên PHP mới bắt đầu, OOP hay cách khác. – cmbuckley

Các vấn đề liên quan