2012-01-02 64 views
7

我是PHP编程的初学者,希望得到一些小问题的帮助。请看看下面的代码:PHP OOP MySQL编程


PHP代码

<?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 
    } 

} 
?> 

我的问题是,如果创建的对象的方法每一个单独的数据库连接是最好的方法去?有没有更好的或替代的方法来做到这一点?希望我已经解释得很好。


以下内容是否正确?

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

- 和X将拥有自己的连接...然后关闭其完成时?

+2

只要使用'的mysql_connect()'和'mysql_close()'开头,并在你的整个程序结束。没有必要在每种方法上实例化一个连接。 – 2012-01-02 23:20:21

+0

@diqual:你的评论可能是一个答案! – 2012-01-02 23:23:27

+4

@idiqual你不应该鼓励使用'mysql_',特别是对于刚进入该语言的人来说,并且正在开始一个新项目。 – cspray 2012-01-02 23:23:29

回答

9

我不会建议以这种方式创建数据库连接。创建一个连接并使用它将其注入到对象中。你不需要为每个对象创建一个新的连接。

代码示例:

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

$Account = new Account($connection); 

需要改变Account看起来像:

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 
    } 

} 

我也建议你看一看的php.net docs about choosing a MySQL API。如果你真的想在PHP和MySQL中使用OOP,那么你将需要切换到mysqliPDO,因为你使用的API并不真正支持OOP接口。

+0

您忘记关闭连接。 – 2012-01-03 00:03:18

+4

@ GabrielSantos不,我没有故意关闭它。如果有另一个对象需要使用该连接呢?然后我们必须再次打开连接。创建连接对象的代码应该负责关闭连接。 – cspray 2012-01-03 00:04:15

+0

+1这个观察。 – 2012-01-03 00:38:39

-1

看到,如果你想缩小它,并保持它的整洁/更易于管理,你可以把连接mysql代码到它自己的方法,并调用它像这样:

<?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

Downvoted,因为最终你每次调用一个函数时仍然创建数据库连接。 – cspray 2012-01-02 23:47:02

+0

@CharlesSprayberry同意你的意见。 – 2012-01-03 00:00:56

+0

@CharlesSprayberry我误解了原始问题 – 2012-01-03 00:19:39

0

你可以使用一些代码等为:

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

其他查询会在这里

mysql_close($db_link); // Close Connection 

创建在每一页单独的连接就足够了。多次连接或从sql server断开并再次登录可能会导致性能下降。

3

我建议:

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

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

我不确定我会推荐在这个(或任何OO)情况下使用die。 – cmbuckley 2012-01-02 23:56:46

+0

@cbuckley它仅用于示例目的。 – 2012-01-03 00:00:18

+0

我唯一担心的是,它可能是一个不好的例子,设置为初学PHP程序员,OOP或其他。 – cmbuckley 2012-01-03 00:27:32