PHP:如何为已打开的连接获取MySQL链接标识符?

iezvtpos  于 2023-01-04  发布在  PHP
关注(0)|答案(6)|浏览(113)

当你用mysql_connect()打开一个MySQL连接时,它会返回一个链接标识符,但是如果你想在脚本的后面再次得到这个链接标识符,该怎么办呢?(例如:一个插件,需要打开一个新的数据库连接,并且仍然访问旧的连接。)
我正在寻找一种方法来返回一个链接标识符到mysql_connect()打开的最后一个连接,有没有函数可以做到这一点?

doinxwow

doinxwow1#

尽管Anti Veeranna的解释是正确的,但是一个非常直接的方法来做你想做的事情。mysql_connect()的文档声明这个函数有第四个参数$new_link,默认情况下是false。如果你用相同的参数再次调用mysql_connect(),很可能是这样,它不会创建新的连接。而是将返回旧的资源标识符的资源标识符。
任何时间;)

jc3wubiy

jc3wubiy2#

不,没有。你必须自己记录链接标识符。你可以将链接标识符定义为一个类属性,这样你就可以很容易地从你的方法中访问它,而不必担心一遍又一遍地将它作为变量传递。

pcrecxhr

pcrecxhr3#

感谢大家的回复。
最后我打开了自己的连接,当插件完成后,最后一行重新打开初始连接,这样主脚本的其余部分就可以使用它所期望的数据库。我知道这很草率,但在这种情况下似乎没有更好的选择。:/
更新::我已经在php.net上提交了这个特性请求,链接是:http://bugs.php.net/bug.php?id=49400

tjrkku2a

tjrkku2a4#

你必须把你的句柄存储在一个变量中。

$link = mysql_connect($host, $login, $pass);

并且您可以在脚本中重用$link,在新的HTTP请求之前。

fae0ux8s

fae0ux8s5#

您可以像其他答案中提到的那样自己存储链接标识符,也可以简单地省略它,mysql_* 函数可以重用现有的句柄
mysql_query帮助是这样解释的:

resource mysql_query  ( string $query  [, resource $link_identifier  ] )

link_identifier

    The MySQL connection. If the link identifier is not specified, the last link opened by mysql_connect() is assumed.

不过,我自己不会使用这种重用行为,除非您完全确定您的应用程序(或任何插件等)没有打开任何到其他数据库的新连接。

r3i60tvu

r3i60tvu6#

使用mysql_pconnect,这将做你想要的。
首先,当连接时,函数会首先尝试找到一个已经用相同的主机、用户名和密码打开的(持久)链接,如果找到了,就会返回它的标识符,而不是打开一个新的连接。
您还可以使用静态类或单例类来为您处理连接池。

<?php
class dbConnectionPooler
{
    static var $connections = array();

    private static function createConnection($host, $username, $password, $db) {
        $connection = mysql_pconnect($host, $username, $password);

        if (FALSE !== $connection) {
            $result = mysql_select_db($db, $connection);

            if (FALSE !== $result) {
                self::$connections[self::getConnectionHash($host, $username, $password, $db)] = $connection;

                return $connection;
            }
        }
    }    

    private static function getConnectionHash($host, $username, $password, $db) {
        return md5($host. $username. $password. $db); // use your favourite hashing function here
    }

    public static function getConnection($host, $username, $password, $db) {
        $connectionHash = self::getConnectionHash($host, $username, $password, $db);

        if (array_key_exists($connectionHash, self::$connections)) {
            return self::$connections[$connectionHash];
        } else {
            return self::createConnection($host, $username, $password, $db);
        }

        return false;
    }
}

$connection = dbConnectionPooler::getConnection("dbhost", "dbuser", "dbpassword", "mydb");
?>

相关问题