Home » Php » How does PHP know what the last database connection is when mysql_select_db() or mysql_query() is used without the optional database parameter?

How does PHP know what the last database connection is when mysql_select_db() or mysql_query() is used without the optional database parameter?

Posted by: admin July 12, 2020 Leave a comment

Questions:

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('database');

?>

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?

How to&Answers:

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 called php_mysql_do_connect (line 922)
  • The php_mysql_do_connect function calls php_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 by mysql_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 🙂

Answer:

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 ;    

}