当你用mysql_connect()打开一个MySQL连接时,它会返回一个链接标识符,但是如果你想在脚本的后面再次得到这个链接标识符,该怎么办呢?(例如:一个插件,需要打开一个新的数据库连接,并且仍然访问旧的连接。)我正在寻找一种方法来返回一个链接标识符到mysql_connect()打开的最后一个连接,有没有函数可以做到这一点?
doinxwow1#
尽管Anti Veeranna的解释是正确的,但是有一个非常直接的方法来做你想做的事情。mysql_connect()的文档声明这个函数有第四个参数$new_link,默认情况下是false。如果你用相同的参数再次调用mysql_connect(),很可能是这样,它不会创建新的连接。而是将返回旧的资源标识符的资源标识符。任何时间;)
mysql_connect()
$new_link
false
jc3wubiy2#
不,没有。你必须自己记录链接标识符。你可以将链接标识符定义为一个类属性,这样你就可以很容易地从你的方法中访问它,而不必担心一遍又一遍地将它作为变量传递。
pcrecxhr3#
感谢大家的回复。最后我打开了自己的连接,当插件完成后,最后一行重新打开初始连接,这样主脚本的其余部分就可以使用它所期望的数据库。我知道这很草率,但在这种情况下似乎没有更好的选择。:/更新::我已经在php.net上提交了这个特性请求,链接是:http://bugs.php.net/bug.php?id=49400
tjrkku2a4#
你必须把你的句柄存储在一个变量中。
$link = mysql_connect($host, $login, $pass);
并且您可以在脚本中重用$link,在新的HTTP请求之前。
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.
不过,我自己不会使用这种重用行为,除非您完全确定您的应用程序(或任何插件等)没有打开任何到其他数据库的新连接。
r3i60tvu6#
使用mysql_pconnect,这将做你想要的。首先,当连接时,函数会首先尝试找到一个已经用相同的主机、用户名和密码打开的(持久)链接,如果找到了,就会返回它的标识符,而不是打开一个新的连接。您还可以使用静态类或单例类来为您处理连接池。
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"); ?>
6条答案
按热度按时间doinxwow1#
尽管Anti Veeranna的解释是正确的,但是有一个非常直接的方法来做你想做的事情。
mysql_connect()
的文档声明这个函数有第四个参数$new_link
,默认情况下是false
。如果你用相同的参数再次调用mysql_connect()
,很可能是这样,它不会创建新的连接。而是将返回旧的资源标识符的资源标识符。任何时间;)
jc3wubiy2#
不,没有。你必须自己记录链接标识符。你可以将链接标识符定义为一个类属性,这样你就可以很容易地从你的方法中访问它,而不必担心一遍又一遍地将它作为变量传递。
pcrecxhr3#
感谢大家的回复。
最后我打开了自己的连接,当插件完成后,最后一行重新打开初始连接,这样主脚本的其余部分就可以使用它所期望的数据库。我知道这很草率,但在这种情况下似乎没有更好的选择。:/
更新::我已经在php.net上提交了这个特性请求,链接是:http://bugs.php.net/bug.php?id=49400
tjrkku2a4#
你必须把你的句柄存储在一个变量中。
并且您可以在脚本中重用$link,在新的HTTP请求之前。
fae0ux8s5#
您可以像其他答案中提到的那样自己存储链接标识符,也可以简单地省略它,mysql_* 函数可以重用现有的句柄
mysql_query帮助是这样解释的:
不过,我自己不会使用这种重用行为,除非您完全确定您的应用程序(或任何插件等)没有打开任何到其他数据库的新连接。
r3i60tvu6#
使用
mysql_pconnect
,这将做你想要的。首先,当连接时,函数会首先尝试找到一个已经用相同的主机、用户名和密码打开的(持久)链接,如果找到了,就会返回它的标识符,而不是打开一个新的连接。
您还可以使用静态类或单例类来为您处理连接池。