我正在用不同的方式在PHP中进行数据库交互,而我一直在玩的一种想法是在构造函数中连接到DB,在析构函数中断开连接。这是我的Database类中的代码。

function __construct()
{
  $this->link = mysql_connect($this->server.':'.$this->port, $this->username);
  if(!$this->link)
    die('Could not connect: '.mysql_error());

  if(!mysql_select_db($this->database, $this->link))
    die('Could not select database: '.mysql_error());
}    

function __destruct()
{
  if(mysql_close($this->link))
    $this->link = null; 
}


这很好用,我唯一的保留意见是,如果我需要连接多个数据库来多次访问数据库,它将可以多个连接和断开连接。如果我经常这样做,我可能会看到潜在的问题。这是一个问题还是有更好的方法来做到这一点?而且我的代码是否还能使人窒息?

评论

查看网址编号。这是人类在这里问过的第一个问题!

#1 楼

从您的问题中推断出您正在考虑拥有多个DB类实例。如果是这样,我建议将连接抽象到另一个类,并在每个数据库实例中保存对同一连接的引用。

如果您在这里错过了任何东西,请提前道歉-我的PHP远非流利。

评论


\ $ \ begingroup \ $
是的。我将有数据库类的多个实例。我只是不确定采用哪种好方法来抽象出连接,或者是否应该这样做。
\ $ \ endgroup \ $
–巴蒂·林赛(Buddy Lindsey)
2011年1月19日在21:14

\ $ \ begingroup \ $
事情是我过去曾经在共享连接时使用多个连接而感到困惑,所以我会说“抽象它,除非您能想到一个很好的理由不这样做”
\ $ \ endgroup \ $
– LRE
2011年1月19日在21:58

#2 楼

您可以使用默认情况下基于类的MySQLi(PHP扩展),而不是MySQL。
建立多个连接非常容易。但是,您必须始终知道要查询的连接。


恭喜第一个问题。

#3 楼

您可能还会查看内置的php命令mysql_pconnect()。这与mysql_connect的不同之处在于,它在第一次调用时打开与数据库的持久连接,随后每次检查是否存在与该数据库的现有连接,而是使用该连接。然后,您应该从析构函数中删除mysql_close命令,因为它们将在页面加载之间持续存在。

php手册页:http://php.net/manual/en/function.mysql-pconnect。 php

评论


\ $ \ begingroup \ $
我读到了这句话,听起来很诱人。但是,如何关闭连接?在文档中说mysql_close()不起作用。当它长时间处于非活动状态时,您是否仅依靠mysql服务器关闭它。我想知道一旦完成所有工作,连接就会关闭。
\ $ \ endgroup \ $
–巴蒂·林赛(Buddy Lindsey)
2011年1月19日在21:19

\ $ \ begingroup \ $
您没有明确关闭连接。一段时间之后,它最终被php内部部件关闭而没有使用。这消除了重复打开和关闭连接所涉及的所有开销,并使单个页面请求变得更快。
\ $ \ endgroup \ $
–韦德·坦迪(Wade Tandy)
2011年1月19日在21:22

\ $ \ begingroup \ $
好的,我也会对此进行一些操作。谢谢。
\ $ \ endgroup \ $
–巴蒂·林赛(Buddy Lindsey)
2011年1月19日21:26

#4 楼

对数据库连接使用Pear MDB2之类的抽象库。

这会将所有连接逻辑从您的代码中抽象出来,因此,只要更改数据库(从mysql到SQLite等),就不必更改代码。

http://pear.php.net/manual/en/package.database.mdb2.php

评论


\ $ \ begingroup \ $
最近一次稳定的发布是在2007年。。。它可能不需要再进行更新(怀疑,因为正在开发一个beta版本),或者只是处于非活动状态(更有可能)有很多更好的抽象层(IMHO)比这更积极地开发。
\ $ \ endgroup \ $
–ircmaxell
2011年1月19日在21:42

\ $ \ begingroup \ $
我已经有一段时间没有使用PHP了,所以请随时在此线程中添加它或创建一个新的响应:)我的观点是,更好的解决方案是通过库,而不是特定的库。
\ $ \ endgroup \ $
–cbrulak
2011年1月19日在21:46

#5 楼

我认为在构造或连接方法中连接数据库方面没有任何区别,我认为您需要更改的是那些die命令。

使用die会导致脚本停止并向用户发送1条小消息,该用户会认为这是垃圾,以后再也不会访问您的网站了:( :( <(<< />
一个静态页面,您可以在该页面上向用户显示非常不错的消息,对于您遇到的技术问题,我们深表歉意。

您还可以在其中输入以下信息:输入您的电子邮件地址,我们将通过电子邮件发送给您当重新联机时,您就会明白。

关于代码,我会遵循以下代码:从长远来看,您可以使用更多功能,因为您的APP中的每个操作都是可以决定的,默认情况下不会自动触发任何操作。

您可以简单地使用try,catch块来维护错误报告。

评论


\ $ \ begingroup \ $
+1用于try / catch。另外,我还遇到了构造函数中引发故障的问题:您没有对象的实例来实现任何有意义的后备机制,在我的情况下,这是使用类中存在的大部分代码...没有有效的实例,您不能调用实例方法,而我不得不制作一些静态方法,这不理想。
\ $ \ endgroup \ $
– EricBréchemier
2011年1月22日9:29



\ $ \ begingroup \ $
谢谢,但是我很难理解你,请你再说一遍。
\ $ \ endgroup \ $
– RobertPitt
2011年1月22日12:33



\ $ \ begingroup \ $
当然:)抛出异常很好,只要添加代码以尝试捕获它们即可。但是,请避免使用在构造函数中引发异常的代码,这可能会导致我遇到的一些问题:如果失败,则没有创建对象,并且如果要重用为该对象定义的行为,则可能会在catch块中错过它这个对象。我宁愿建议以常规方法创建连接,例如init()或connect(),在对象创建后调用,而不是直接在构造函数中调用。
\ $ \ endgroup \ $
– EricBréchemier
2011年1月22日在17:12