Connexion simultanée à deux bases Mysql distinctes

Eléphant du PHP | 59 Messages

27 sept. 2009, 22:24

Bonsoir,


pour les besoins d'une application je dois me connecter à deux bases de données séparées. Elles sont pour l'instant sur le même serveur MySQL mais elles pourraient se retrouver chacune sur un serveur différent dans le futur.


Je dois donc au sein d'un même script pouvoir passer sans problème d'une base à l'autre.

J'utilise donc le script de connexion suivant:
$link1 = mysql_connect($db_hostname, $db_username, $db_password);
$link2 = mysql_connect($db2_hostname, $db2_username, $db2_password);


$connect_status = mysql_select_db($db_name, $link1);
$connect2_status = mysql_select_db($db2_name, $link2);
et pour effecteur une requête j'utilise la syntaxe suivante:

$sql = "SELECT * FROM examples";
$result = mysql_query($sql, $link1);
while ($rs = mysql_fetch_array($result)){...

Et ca ne fonctionne pas. Mysql_fetch_array me retourne une erreur.

Dès que je commente la ligne :
$link2 = mysql_connect($db2_hostname, $db2_username, $db2_password);
alors la ca fonctionne.

Du coup je comprend pas trop, j'ai trouvé sur le net plein de gens qui semble utiliser cette syntaxe, alors a votre avis, qu'est ce qui ne va pas?

Merci d'avance

Eléphant du PHP | 59 Messages

27 sept. 2009, 22:45

voila quand on ne lis pas le manuel jusqu'au bout.

Dans le cas de multiple connexion à la suite, un quatrième paramètre doit être utilisé avec mysql_connect(), pour empêcher que le même identifiant de ressource ne soit attribué.

Mammouth du PHP | 2937 Messages

28 sept. 2009, 11:29

Cela dit, une autre solution peut être utilisée pour la connexion à plusieurs bases : PDO, qui permet d'instancier autant d'objets que de connexions nécessaires.
// On essaie d'instancier autant d'objets PDO que de connexions nécessaires
try
{
  $pdo1 = new PDO ('mysql:host='.$db_hostname.';dbname='.$db_name, $db_username, $db_password);
  $pdo2 = new PDO ('mysql:host='.$db2_hostname.';dbname='.$db2_name, $db2_username, $db2_password);
}
catch (PDOException $e)
{
  echo $e -> getMessage ();
  exit;
}

// La requête à effectuer
$sql = "SELECT * FROM examples";
$requete1 = $pdo1 -> query ($sql);
$requete2 = $pdo2 -> query ($sql);

// Récupération de toutes les lignes de résultat sous forme d'un tableau associatif (indexation par nom de colonne)
// (on s'assure que l'exécution de la requête ne renvoie pas false, auquel cas on définit un tableau vide)
$resultat1 = ($requete1 !== false)? $requete1 -> fetchAll (PDO::FETCH_ASSOC): array ();
$resultat2 = ($requete2 !== false)? $requete2 -> fetchAll (PDO::FETCH_ASSOC): array ();

// On n'a plus besoin de se connecter
$pdo1 = null;
$pdo2 = null;

// Boucles sur les tableaux
foreach ($resultat1 as $ligne)
{
  // …
}
foreach ($resultat2 as $ligne)
{
  // …
}