【发布时间】:2011-08-11 18:28:38
【问题描述】:
我的问题是我在我的通用脚本代码和我的一个函数中使用了变量 $db。它的目的是成为用于 MySQL 连接的变量。我需要在函数内部将一些数据写入数据库。在我的脚本中,我不能假设现有的数据库连接将打开,因此我打开一个新连接并在函数退出之前将其关闭。自从这样做以来,我在脚本运行后出现错误,提示 MySQL 引用错误/不存在。
我唯一可以将它固定在我的核心代码中,我使用变量 $db 作为数据库连接的变量名。我也在函数中使用相同的变量。我没想到这会是个问题,因为我没有在函数中的 $db 前面使用 global。这应该意味着我在函数中引用的 $db 在函数私有范围内,但它似乎正在关闭公共 $db 的连接。
有什么想法吗?
我的代码片段是:
database.php
db_connect()
{
// open mysql db connection and return it;
}
db_close( &$db )
{
// close the passed by reference db connection
}
api.php
api_verify( $keyid, $userid, $key )
{
// open a new db connection
$db = db_connect();
// check for errors. if any errors are found note them in the db
// close the db
db_close($db);
}
main.php
include api.php;
include database.php;
// open a connection to the db
$db = db_connect();
// pull a list of things to process from the db and move through them one at a time
// call api_verify() on each key before working through it's data.
db_close($db)
【问题讨论】:
-
这取决于您的连接代码。如果您实际上是从池中提供连接,并且您的内部方法之一关闭了连接,那么您的外部方法之一指向的连接可能是陈旧的
-
不要关闭连接...如果您使用相同的参数打开一个新连接,它只会重用已打开的连接,因此如果您在您的 api 函数中关闭该连接,您会在任何地方关闭它 - 即使你不会通过引用传递
-
为什么要关闭连接?
-
我想这只是我的偏执狂。我在函数中打开了一个新连接,因为我不想依赖已经打开的全局数据库连接,我关闭它是因为我喜欢关闭或释放我打开或创建的资源。
-
好吧,我用我的代码做了更多的测试。似乎当您使用内置 mysql_connect 和 mysql_close 函数时,您将连接变量命名为什么并不重要。如果您使用 mysql_close 关闭与 mysql 服务器的连接,它将关闭与该特定服务器的所有连接。您无法创建与同一数据库服务器的独立连接并根据您创建它们的对象关闭它们,这有点烦人。无论哪种方式,我现在都假设 $db 对象已创建。