在没有可选数据库参数的情况下使用mysql_select_db()或mysql_query()时,PHP如何知道最后一个数据库连接是什么?

时间:2010-03-29 19:21:24

标签: php

请考虑以下代码:

<?php

$conn = mysql_connect('localhost', 'username', 'password');
mysql_select_db('database', $conn);

?>

这可以按预期工作,但PHP如何知道在以下示例中调用mysql_select_db()时要使用的数据库连接?

<?php

mysql_connect('localhost', 'username', 'password');
mysql_select_db('database');

?>

PHP文档声明“如果未指定链接标识符,则假定mysql_connect()打开的最后一个链接。” (PHP: mysql_select_db()

从哪个地方存储或检索最后一个连接?

2 个答案:

答案 0 :(得分:11)

我想最后打开的连接的链接保存在内存中,以便更容易(因为我们通常只使用一个连接)


快速浏览 ext/mysql 的来源:
(所有行号都在php_mysql.c - 源版本是几周前PHP 5.3.2-dev的随机快照;因此,它们可能已经改变了位)

  • 名为 mysql_connect 的用户空间函数似乎对应于名为 php_mysql_do_connect 的C级函数(第922行)
  • php_mysql_do_connect 函数调用 php_mysql_set_default_link (第832行)
    • 存储上次打开的连接
  • 还有一个名为 php_mysql_get_default_link 的功能(第908行)
  • php_mysql_get_default_link 功能由 mysql_select_db 调用,当没有传递给它的链接时(第992行)


并且 php_mysql_set_default_link 正在调用它来存储default_link

MySG(default_link) = id; 

MySG是一个宏,定义如下(在php_mysql_structs.h中)

#ifdef ZTS
# define MySG(v) TSRMG(mysql_globals_id, zend_mysql_globals *, v)
#else
# define MySG(v) (mysql_globals.v)
#endif 

对我来说,几乎看起来像一个全局变量; - )


如果您愿意,可以自行查看来源: ext/mysql/php_mysql.c ext/mysql/php_mysql_structs.h

正如我所说,自从我检查的版本以来,这可能已经被修改了一些 - 这意味着行号可能不完全匹配;但函数名称很容易理解,所以你应该能够找到调用什么和在哪里: - )

答案 1 :(得分:0)

我希望这堂课能帮助你,我已经写好了............对不起它需要测试

class connectionManager(){

protected $array = array(
"connection1" => "host3-username-password-database1" , 
"connection2" => "host2-username-password-database2" , 
"connection3" => "host1-username-password-database3" , 
)
protected $history = array();
public function __construct($connectionID = connection1){
 $this->savelastConnecton($connectionID);
     /*do you magic here to change the string above to desired format 
         sorry but i gatta go 
        btw i liked your question 
     */
      mysql_connect($host , $username , $password);
      mysql_select_db($database);
     return true ;
}
publich function getLastConnection( ){
    return end($this->history[$lastnumber]) ; 
}
private function saveLastConnection($connectionID){}
   $this->history[] = $connectionID ; 
    return true ;    

}