请考虑以下代码:
<?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())
从哪个地方存储或检索最后一个连接?
答案 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 ;
}