7 votes

Comment PHP sait-il quelle est la dernière connexion à la base de données lorsque mysql_select_db() ou mysql_query() est utilisé sans le paramètre optionnel de base de données ?

Considérons le code suivant :

<?php

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

?>

Cela fonctionne comme prévu, mais comment PHP sait-il quelle connexion à la base de données utiliser lorsqu'il appelle mysql_select_db() dans l'exemple suivant ?

<?php

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

?>

La documentation PHP indique que "Si l'identifiant du lien n'est pas spécifié, le dernier lien ouvert par mysql_connect() est supposé". ( PHP : mysql_select_db() )

Où est stockée ou récupérée la dernière connexion ?

11voto

Pascal MARTIN Points 195780

Je suppose qu'un lien vers la dernière connexion ouverte est conservé quelque part en mémoire, pour faciliter les choses (car nous n'utilisons généralement qu'une seule connexion) .

En parcourant rapidement les sources de ext/mysql :
_(Tous les numéros de ligne sont en php_mysql.c -- la version des sources est un instantané aléatoire de PHP 5.3.2-dev datant d'il y a quelques semaines ; il est donc possible qu'elle ait un peu changé)._

  • La fonction de l'espace utilisateur appelée mysql_connect semble correspondre à la fonction de niveau C appelée php_mysql_do_connect (ligne 922)
  • En php_mysql_do_connect appels de fonction php_mysql_set_default_link (ligne 832)
    • Pour mémoriser la dernière connexion ouverte
  • Il existe également une fonction appelée php_mysql_get_default_link (ligne 908)
  • Ce php_mysql_get_default_link est appelée par mysql_select_db lorsqu'aucun lien ne lui est transmis (ligne 992)

Et php_mysql_set_default_link l'appelle pour stocker le default_link :

MySG(default_link) = id; 

Ce MySG étant une macro, définie comme suit _(en 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 

Cela ressemble beaucoup à une variable globale pour moi ;-)

Si vous le souhaitez, vous pouvez consulter les sources vous-même : ext/mysql/php_mysql.c y ext/mysql/php_mysql_structs.h .

Comme je l'ai dit, il a probablement été modifié un peu depuis la version dans laquelle j'ai vérifié -- ce qui signifie que les numéros de ligne peuvent ne pas correspondre exactement ; mais les noms des fonctions sont assez faciles à comprendre, donc vous devriez être capable de retrouver ce qui appelle quoi et où :-)

0voto

tawfekov Points 4061

J'espère que ce cours vous aidera, je l'ai déjà écrit ............, désolé, il doit être testé.

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 ;    

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X