当您使用mysql_connect()打开MySQL连接时,它会返回一个链接标识符。但是,如果您希望稍后在脚本中再次获取该链接标识符,该怎么办? (例如:一个插件,需要打开一个新的数据库连接,仍然可以访问旧的数据库连接。)
我正在寻找一种方法将链接标识符返回给mysql_connect()打开的最后一个连接。有没有这样做的功能?
答案 0 :(得分:7)
尽管Anti Veeranna的解释是正确的, 是一种非常直接的方式来做你想做的事情。如果您要阅读mysql_connect()的文档,您会发现此函数有第4个参数“new_link”,默认情况下为 false 。如果再次使用相同的参数调用mysql_connect()(可能就是这种情况),则不会创建新连接,而是返回旧连接的资源标识符。
任何时候;)
答案 1 :(得分:2)
不,没有。您必须自己记录链接标识符。您可以将链接标识符定义为类属性,以便您可以从方法中轻松访问它,而不必担心将其作为变量一次又一次地传递。
答案 2 :(得分:1)
感谢大家的回复。
我最终打开了自己的连接,当我的插件完成后,最后一行重新打开初始连接,因此主脚本的其余部分可以使用它所期望的数据库。我知道,它很草率,但在这种情况下似乎没有更好的选择。 :/
更新::我已经在php.net上将此作为功能请求提交。链接是:http://bugs.php.net/bug.php?id=49400
答案 3 :(得分:0)
您必须将句柄存储在var。
中$link = mysql_connect($host, $login, $pass);
在新的HTTP请求之前,您可以在脚本中重复使用$ link。
答案 4 :(得分:0)
您必须自己存储链接标识符,如其他答案所述,或者您可以简单地省略它,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.
我自己不会使用这种重用行为,除非您完全确定您的应用程序(或任何插件等)没有打开任何与其他数据库的新连接。
答案 5 :(得分:-1)
使用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");
?>