1 Dernière modification par Michel L'HUILLIER (30-01-2012 06:20:54)

Sujet : Double connexion MySQL local / distant en PHP

Très pratique pour ne pas avoir à gérer plusieurs pages de connexions, voici ce que j'utilise tout le temps, basculant fréquemment entre mes sites en local et en ligne :

<?php
// on teste le serveur pour savoir si on est en local (localhost)
  if (getenv("HTTP_HOST") == "localhost || getenv("HTTP_HOST") == "127.0.0.1") {
  // on spécifie les valeurs pour le site local
    $hostname_test = "localhost"; // le nom du serveur MySql
    $database_test = "mabase";    // le nom de la base de données
    $username_test = "root";      // le login
    $password_test = "";          // le password
  // la chaine de connexion
    $test = mysql_connect($hostname_test, $username_test, $password_test) or die(mysql_error());
}
  else {
  // on spécifie les valeurs pour le site distant
    $hostname_test = "sql.free";   // le nom du serveur MySql
    $database_test = "mabase";     // le nom de la base de données
    $username_test = "admin";      // le login
    $password_test = "xxx";        // le password
  // la chaine de connexion
    $test = mysql_connect($hostname_test, $username_test, $password_test) or die(mysql_error());
}
?>

Pour la connexion, il suffit de faire :

<?php
// connexion à la BDD
  require('lib/log.php');
  mysql_select_db($database_test, $test);
?>

Ensuite, une requête peut avoir cette forme :

<?php
  $query_requete = 'SELECT prenom, nom, session FROM membres ORDER BY nom, prenom';
  $requete = mysql_query($query_requete, $test) or die(mysql_error());
  $totalRows_requete = mysql_num_rows($requete);
?>

Et enfin son résultat, comme cela (ici, une liste) :

<?php
  echo "<ul>";
  while($row_requete = mysql_fetch_assoc($requete)) {
    echo '<li id="'.$row_requete['session'].'">'.$row_requete['prenom'].' '.$row_requete['nom'].'</li>';
  }
  echo "</ul>";
?>

Re : Double connexion MySQL local / distant en PHP

J'utilise un switch pour ma part mais ca revient au meme ...
L'idée est logique.
Merci pour ton code smile

Re : Double connexion MySQL local / distant en PHP

Salut Michel,

Je pense que ton premier bloc de code ne peut pas fonctionner pour la raison suivante:
Dans ton if, tu teste si le host est "localhost" OU "127.0.0.1", auquel cas, tu rentre dans ta condition, si tu n'y rentre pas, ton deuxieme test vérifie que le host est différent de "localhost" ET égal à "127.0.0.1" ce qui est impossible puisque pour vérifier cette condition, le host doit forcément être égal à "127.0.0.1", or si c'est la cas, alors il rentre dans ton premier if smile

De plus (ça c'est plutôt une question d'optimisation), ta ligne de connexion (mysql_connect) est identique dans tes 2 blocs (if et elseif), tu peux donc la sortir et la mettre à la suite.

Pour ce qui est de la lecture des résultats, tu utilise une structure do while, ce qui n'est pas forcément une bonne chose, puisque tu vas obtenir une erreur si aucun résultat n'est retourné par ta requête, préfère une structure while (tout court), ça permettra d'éviter ce problème.

Et dernier point concernant tes requetes et l'ensemble en général, je te conseille de t'orienter vers PDO plutôt que mysql, pour différentes raisons:
- mysql est déprécié et non maintenu (http://news.php.net/php.internals/53799)
- PDO fournit une interface de connexion cross SGBD
- PDO permet une sécurisation plus simple des requête quand elles sont bien construites (bindées correctement)
- PDO permet d'utiliser des requêtes préparées (prepare, rollback...)

Voila pour les quelques précisions.

Dans tous les cas, merci de ton post, fournir des ressources et des petits trucs perso est toujours apprécié smile

Re : Double connexion MySQL local / distant en PHP

MaitreKabba répond mieux que moi , je ferme ma gueule ...

PS: je suis d'acoord avec MaitreKabba j'ai même relever l'erreur et je ne voulais pas rentrer dans les detail de PDO mais c'est vrai que c'est beaucoup mieux !

Re : Double connexion MySQL local / distant en PHP

wink on a du ecrire en même temps

Content d'avoir du soutien pour PDO, je milite !

Re : Double connexion MySQL local / distant en PHP

Merci pour vos remarques.

J'ai modifié le ET en OU.(faute de frappe).

Par contre, pour la PDO, attention : FREE et d'autres hébergeurs ne l'autorisent pas.
Ce qui pour nos amis peu aguerris à MySQL pourrait leur amener d'autres question sur le non-fonctionnement de leur code.
Bien évidemment, je suis d'accord avec vous, la PDO offre des possibilités plus intéressantes.
Cela pourra faire l'objet d'un autre post.

C'est en voyant un post sur un problème de connexion que m'est venue l'idée de mettre en ligne un exemple complet de connexion / requête / affichage.
Certes, ce n'est peut-être pas une solution "optimisée", mais ça marche dans la majorité des cas...

Re : Double connexion MySQL local / distant en PHP

Salut Michel,

Je comprend la problématique du SQL de chez free (information très interressante au passage), dans ce cas, je t'invite à le préciser dans ton message, afin d'orienter tout de même les autres utilisateurs vers PDO.
En tout cas, cette ressource est appréciable pour ceux qui se poseraient des questions sur l'utilisation des bases de données en PHP, ça servira à beaucoup de gens, merci de l'avoir postée.

Petite précision: Dans ton cas, en ce qui concerne ta structure if/else, tu peux remplacer ton elseif en else tout court car dans tous les cas, si le système ne rentre pas dans ton if, c'est qu'il que la valeur du getenv() est différente à la fois de "localhost" et de "127.0.0.1", inutile donc d'imposer un nouveau test smile

Re : Double connexion MySQL local / distant en PHP

J'ai rectifié le "elseif" en "else" dans le code ci-dessus.

Pour Free, j'espère qu'un jour la PDO sera autorisée. A vérifier régulièrement, mes infos datent d'il y a environ un an.

Donc, info pour tous : un article sur la PDO sera réalisé ultérieurement.

C'est bien pour ceux qui ne savent pas trop comment se connecter et requêter simplement en MySQL via PHP que j'ai posté ce sujet.
La double connexion est simplement une aide pour ceux-ci afin de ne pas se perdre dans des mauvaises pistes en cas de problème :
en l'utilisant, ils n'auront plus à s'en soucier ni à y toucher, que le problème soit en local ou sur le serveur.
La raison en cas de non-réponse dans l'un des deux cas sera :
  - soit dans le script principal,
  - soit dans la requête elle-même,
  - soit parce que les tables sont différentes sur les 2 serveurs.

Merci pour vos remarques constructives.

Re : Double connexion MySQL local / distant en PHP

Merci pour ce topic, je pense que ça en aidera plus d'un.
Nous venons de réorganiser les forums, je déplace le sujet dans la section appropriée smile