我的问题是,我在我的一般脚本代码和我的一个函数中使用变量$db。它的目的是成为用于MySQL连接的变量。我需要在函数内部将一些数据写入数据库。在我的脚本中,我不能假设一个现有的db连接将被打开,所以我打开一个新的连接,并在函数退出之前关闭它。自从这样做之后,在脚本运行后,我就会收到一个错误,它说MySQL引用是坏的/不存在。
我唯一能把它钉在我的核心代码中的是,我使用变量$db作为数据库连接的变量名。我还在函数中使用了相同的变量。我没想到这会是个问题,因为我在函数中没有在$db前面使用全局语言。这应该意味着我函数中的$db i引用位于函数的私有范围内,但它似乎关闭了公共$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)发布于 2011-04-24 07:28:36
我假设您在调用db_connect的每个地方都使用相同的用户名/密码打开到同一个数据库的连接。这样做时,除非您的db_connect显式指定您正在创建一个新链接,否则它将返回一个已经打开的link.If,该链接随后将使用db_close()关闭,它还将关闭另一个连接,因为该链接是相同的。如果使用mysql_connect连接到数据库,则需要一个称为新链接的参数。
new_link如果使用相同的参数对mysql_connect()进行第二次调用,则不会建立新链接,而是返回已经打开的链接的链接标识符。new_link参数修改此行为,并使mysql_connect()始终打开一个新链接,即使mysql_connect()在使用相同的参数之前被调用。在SQL安全模式中,此参数将被忽略。
请参阅http://php.net/manual/en/function.mysql-connect.php
我不确定这是不是你面临的问题。希望能帮上忙。
发布于 2011-04-24 07:34:44
要管理DB连接,可以创建类而不是一对函数。如果您说的是"MySQL引用“,那么确切的错误指的是"MySQL资源”,那么您使用的是过时的mysql扩展,应该切换到更现代的扩展,比如PDO。
class DBConnection {
protected static $_connections = array(),
static connect($dsn) {
if (!isset(self::$_connections[$dsn])) {
$credentials = self::getCredentials();
/* Create connection. For example: */
try {
self::$_connections[$dsn][0] = new PDO($dsn, $credentials['username'], $credentials['password']);
} catch (PDOException $exc) {
// erase the frame w/ password from call trace to prevent leak.
throw new PDOException($exc->getMessage(), $exc->getCode());
}
/* End create connection example */
self::$_connections[$dsn][0]->dsn = $dsn;
}
++self::$_connections[$dsn]['count'];
return self::$_connections[$dsn][0];
}
static close($db) {
if (isset(self::$_connections[$db->dsn])) {
if (--(self::$_connections[$db->dsn]['count']) < 1) {
unset(self::$_connections[$db->dsn]);
}
}
}
static getCredentials() {
/* credentials can be stored in configuration file or script, in this method, or some other approach of your own devising */
}
}请注意,这并不完全是OOP (它是,但仅在技术意义上)。以上这些并不适合于单元测试。如果您想要更多的OO方法(这将更适合于单元测试),则扩展或包装PDO。使用依赖注入也可以帮助解决上面提到的联轴器问题。
发布于 2011-04-24 07:15:18
我假设发生的是连接取消,因为已经有了连接,然后关闭结束了当前的连接。
我建议要么在文件开始时启动连接,然后知道它总是在那里(我所做的);要么)检查是否设置了$db变量,如果没有,则创建连接,并始终在文件末尾结束连接。
https://stackoverflow.com/questions/5769198
复制相似问题