2

我正在编写一些 php 代码,并且我经常访问我的 MySQL 数据库以读取和更新字段。

我当前的代码包括一个名为 dbconnnect 的类,我使用它如下:

class edit_data extends dbconnect {
//<some php code>
parent::connect();
//<get info from database>
parent::disconnect();
//<evaluate data>

我的问题 - 这是连接和断开 MySQL 数据库的最有效方式吗?(请记住,我几乎总是连接到同一个数据库,所以不需要每次都重新定义连接参数)。

我正在考虑在构造函数中运行连接,所以我可以写

$connector = new dbconnect();

但我意识到这样做实际上并没有节省多少——对吧?

谢谢。

4

8 回答 8

1

通过使用

$connector = new dbconnect();

并不是

parent::connect();

您实际上是在将您的 edit_data 类与 dbconnect 类解耦。对你来说意味着什么:

  1. 通过使用多个 dbconnect 对象,您的 edit_data 类现在可以拥有多个连接(连接池)
  2. 您的 edit_data 类可以(将来)使用 dbconnect 以外的东西,并且不必更改任何其他代码。使用 parent::connect(),如果您更改为扩展另一个类,则必须确保新类将支持现有语义
于 2009-04-06T04:21:06.803 回答
1

只需确保在每个文件的开头和结尾自动包含/运行 db 连接/断开连接的代码,而无需为每个文件单独执行此操作。确保此代码存储在 1 个位置并包含在所有其他文件中,以便您可以在需要时轻松更改它。只要你做这些事情,剩下的只是你想如何连接/断开数据库的个人喜好。

我还建议使用CodeIgniter等框架来处理每个文件的幕后常见任务。

于 2009-04-05T14:51:51.197 回答
0

除非您知道每次都将连接到数据库,否则我不会将连接部分放在构造函数中。如果你不需要连接,你不应该,它很贵。您的构造函数应该只接受连接参数。虽然看起来您可能正在使用静态类,但构造函数会被执行。

正如 Krzysztof 所说,您应该按需连接。在我的数据库类中,我的所有查询最终都通过“execQuery”函数。该函数检查是否存在与数据库的连接。拥有一个单一的中央查询功能还允许您执行诸如记录会话中运行的所有查询、添加时间、日志记录或您需要做的任何其他事情。

在析构函数中断开连接是正确的地方。

于 2009-04-06T00:44:37.697 回答
0

“正确”的方法可能是像 MySQLi 和 PDO 扩展一样 - 在构造函数中打开连接并在析构函数中关闭它。“有效”的方法是检查您的 query() 方法中的连接,并在必要时打开它。

在这两种方法中,您都避免创建单独的 connect() 方法,从而消除了忘记在脚本中调用它的风险。

于 2009-04-05T18:10:11.000 回答
0

我们的代码库有很多路径并且大量使用缓存。

我们仅在执行第一个查询时才连接数据库。(实际上是在 ->query() 方法上)。

一旦脚本结束,我们让 PHP 断开连接,并且不显式调用 ->disconnect

于 2009-04-06T01:16:20.867 回答
0

一定要重用你的连接:

查看 new_link 参数:

如果使用相同的参数对 mysql_connect() 进行第二次调用,则不会建立新链接,而是返回已打开链接的链接标识符。new_link 参数修改了这种行为并使 mysql_connect() 始终打开一个新链接,即使之前使用相同的参数调用了 mysql_connect() 也是如此。在 SQL 安全模式下,此参数被忽略。

http://php.net/function.mysql-connect

于 2009-04-06T04:33:50.970 回答
0

我认为从您的“dbconnect”类派生您的“edit_data”类表明逻辑混乱。您的数据编辑对象是一种特殊类型的数据库连接吗?或者说数据编辑对象需要使用数据库连接可能更有意义?(这就是 IS A 和 HAS A 的区别。)

尽管现在它似乎已经过时了,但您可以使用单例工厂调用来获取数据库处理程序。然后任何需要它的函数都可以简单地调用它。如果您让处理程序在第一次必须执行任何工作时进行自初始化,则无需担心初始化它。(为此,请检查包含句柄的实例变量是否是资源句柄 - 如果不是,请调用初始化程序。请记住决定如果连接失败该怎么办。)然后您只需要一种方法让处理程序找到它的配置. 我会让工厂调用这样做,而不是初始化器。

一种变体方法是让构造函数获取当前数据库处理程序并将对它的引用放入实例变量中。这可以通过多种方式完成。在构造函数中要求它可能会起作用,或者您可以再次使用单例工厂调用。如果数据库处理程序不会初始化(工厂调用可以检查),这种技术使对象构造函数有机会拒绝实例化。

于 2009-04-06T05:35:27.017 回答
0
  • 连接是昂贵的,所以不要为每个查询连接和断开连接。
  • 如果可能的话使用mysqli而不是mysql,它通常更快
  • 如果您使用的是 mysql 而不是 mysqli,请使用mysql_pconnect而不仅仅是mysql_connect
  • php 关闭所有打开的数据库连接,因此无需显式这样做
  • 无论您是在脚本开始时还是在第一个查询时连接,都可以在查询之间共享连接。
于 2009-04-06T06:28:58.133 回答