首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP,可变范围问题

PHP,可变范围问题
EN

Stack Overflow用户
提问于 2011-04-24 07:06:40
回答 3查看 418关注 0票数 0

我的问题是,我在我的一般脚本代码和我的一个函数中使用变量$db。它的目的是成为用于MySQL连接的变量。我需要在函数内部将一些数据写入数据库。在我的脚本中,我不能假设一个现有的db连接将被打开,所以我打开一个新的连接,并在函数退出之前关闭它。自从这样做之后,在脚本运行后,我就会收到一个错误,它说MySQL引用是坏的/不存在。

我唯一能把它钉在我的核心代码中的是,我使用变量$db作为数据库连接的变量名。我还在函数中使用了相同的变量。我没想到这会是个问题,因为我在函数中没有在$db前面使用全局语言。这应该意味着我函数中的$db i引用位于函数的私有范围内,但它似乎关闭了公共$db的连接。

有什么想法吗?

我的代码片段如下:

database.php

代码语言:javascript
复制
db_connect()
{
 // open mysql db connection and return it;
}

db_close( &$db )
{
 // close the passed by reference db connection
}

api.php

代码语言:javascript
复制
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

代码语言:javascript
复制
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)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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

我不确定这是不是你面临的问题。希望能帮上忙。

票数 1
EN

Stack Overflow用户

发布于 2011-04-24 07:34:44

要管理DB连接,可以创建类而不是一对函数。如果您说的是"MySQL引用“,那么确切的错误指的是"MySQL资源”,那么您使用的是过时的mysql扩展,应该切换到更现代的扩展,比如PDO。

代码语言:javascript
复制
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。使用依赖注入也可以帮助解决上面提到的联轴器问题。

票数 2
EN

Stack Overflow用户

发布于 2011-04-24 07:15:18

我假设发生的是连接取消,因为已经有了连接,然后关闭结束了当前的连接。

我建议要么在文件开始时启动连接,然后知道它总是在那里(我所做的);要么)检查是否设置了$db变量,如果没有,则创建连接,并始终在文件末尾结束连接。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5769198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档