How does PHP know what the last database connection is when mysql_select_db() or mysql_query() is used without the optional database parameter?
Consider the following code:
<?php
$conn = mysql_connect('localhost', 'username', 'password');
mysql_select_db('database', $conn);
?>
This works as expected, but how does PHP know what database connection to use when calling mysql_select_db()
in the following example?
<?php
mysql_connect('localhost', 'username', 'password');
mysql_select_db('dat开发者_Go百科abase');
?>
The PHP documentation states that "If the link identifier is not specified, the last link opened by mysql_connect() is assumed." (PHP: mysql_select_db())
Where is the last connection stored or retrieved from?
I suppose a link to the last opened connection is kept somewhere in memory, to make things easier (as we generally often use only one connection).
Quickly going through the sources of ext/mysql
:
(All line numbers are in php_mysql.c
-- the version of the sources is a random snapshot of PHP 5.3.2-dev from a couple of weeks ago ; so, they might have changed a bit)
- The user-space function called
mysql_connect
seems to correspond to the C-level function calledphp_mysql_do_connect
(line 922) - The
php_mysql_do_connect
function callsphp_mysql_set_default_link
(line 832)- To store the last opened connection
- There is also a function called
php_mysql_get_default_link
(line 908) - That
php_mysql_get_default_link
function is called bymysql_select_db
, when there is no link passed to it (line 992)
And php_mysql_set_default_link
is calling this to store the default_link
:
MySG(default_link) = id;
That MySG
being a macro, defined like this (in 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
Pretty much looks like a global variable to me ;-)
If you want, you can take a look at the sources yourself : ext/mysql/php_mysql.c
and ext/mysql/php_mysql_structs.h
.
As I said, this has probably been modified a bit since the version in which I checked -- which means the line numbers might not match exactly ; but the functions names are easy anough to understand, so you should be able to track down what calls what and where :-)
I wish this class will help you , i had already written it ............ sorry it needs testing
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 ;
}
精彩评论