Connexion à une base de données MySQL

Afin de pouvoir se connecter aussi bien en local qu'en distant, avec un seul fichier voici une méthode simple pour définir les paramètres du serveur MySQL www.mysql.com. Soit le script est sur votre PC (chemin type "c:") soit il ne l'est pas ! A chacun de voir la meilleure condition, voire plusieurs (expression régulière). On note l'utilisation de constantes define() fr2.php.net/manual/fr/function.define.php car elles sont accessibles partout (globales) comme l'exemple suivant le montre.

Paramètres de connexion

# parametres serveur MySQL. Exemple de condition :
# test si le script est sur un disque local
# remplacer éventuellement 'c:' par le répertoire ad hoc
if(stristr($_SERVER['DOCUMENT_ROOT'],"c:")) {
   define("DBHOST", "localhost");
   define("DBNAME", "nom_bdd");
   define("DBUSER", "root");
   define("DBPASSWD", "");
} else {
   define("DBHOST", "hote_sql");
   define("DBNAME", "nom_bdd");
   define("DBUSER", "nom_user");
   define("DBPASSWD", "mot_de_passe");
}

Selon le type d'hébergement et la popularité d'un site, on a besoin d'économiser la connexion à une base de données MySQL. Chez www.ovh.fr, par exemple, elles ne peuvent être que trois simultanément. Voici donc une fonction pratique pour extraire des données tout en fermant la base dans un laps de temps court. Spéciale dédicace Erwan www.kafarnaum.net qui l'a initié.

Requête MySQL

# requête MySQL unique (ouverture/fermeture)
# avec retour de paramètres optionnels 
function queryDB($sql, $type=0) {
   if (!$db = @mysql_connect(DBHOST,DBUSER,DBPASSWD))
      return FALSE; # pas de connexion
   if (!@mysql_select_db(DBNAME, $db)) {
      @mysql_close($db);
      return FALSE; # bdd introuvable
   }
   # sélection du type de résultat attendu
   # ou valeur de $result par défaut ($type=0)
   # requête
   $result = @mysql_query($sql, $db);
   switch($type) {
      # on a besoin de l'ID (après INSERT en auto incrément)
      # http://fr.php.net/mysql_insert_id
      case 1 : $result = @mysql_insert_id(); break;
      # on vient d'effectuer INSERT, UPDATE ou DELETE
      # pour ce dernier, il faut une clause WHERE
      # http://fr.php.net/mysql_affected_rows
      case 2 : $result = @mysql_affected_rows(); break;
   }
   # fermeture avant de retourner le résultat
   @mysql_close($db);
   return $result;   
}

# exemples d'application
$id = $_GET['id'];
$ma_table = "ma_table";
$sql = "SELECT titre FROM $ma_table WHERE id = '$id'";
$res = queryDB($sql);
$row = @mysql_fetch_array($res);
echo "Titre : $row[titre]";

$sql =	"INSERT INTO $ma_table (id,titre) VALUES ('','Glop')";
if(!$id = queryDB($sql, 1))
   die("Problème de base de données !");
echo "Nouvel ID : $id";

Pour les maniaques de la gestion d'erreur (qui est une des sources de cheveux gris les moins taries) on peut carrément attribuer une valeur à chaque "Return" de la fonction, et la traiter ensuite, via une autre fonction si besoin.

Requête MySQL + traitement d'erreur

function queryDB($sql, $type=0) {
   if (!$db = @mysql_connect(DBHOST,DBUSER,DBPASSWD))
      return -1;
   if (!@mysql_select_db(DBNAME, $db)) {
      @mysql_close($db);
      return -2;
   }
   $result = @mysql_query($sql,$db); break;
   switch($type) {
      case 1 : $result = @mysql_insert_id(); break;
      case 2 : $result = @mysql_affected_rows(); break;
   }
   @mysql_close($db);
   return $result;   
}

# exemples d'application
$id = $_GET['id'];
$ma_table = "ma_table";
$sql = "SELECT titre FROM $ma_table WHERE id = '$id'";
$res = queryDB($sql);

/*
autres exemples de requête
INSERT
$sql = "INSERT INTO $ma_table (id,titre) VALUES ('','Glop')";
$res = queryDB($sql,1); // retourne id
UPDATE
$sql = "UPDATE $ma_table SET titre = 'PasGlop' WHERE id='$id'";
$res = queryDB($sql,2); // retourne nbr champs affectés
DELETE
$sql = "DELETE FROM $ma_table WHERE id='$id'";
$res = queryDB($sql,2); // retourne nbr champs affectés
*/

# traitement de l'erreur
# un résultat inférieur ou égal à 0 est inattendu
if($res <= 0) {
   $msg = "Aucun champ ajouté ou supprimé.";
   if($res == -1) $msg = "Connexion au serveur impossible !";
   elseif($res == -2) $msg = "Connexion à la bdd impossible !";
   else $msg = "Requête $sql invalide !";
   die($msg);
}
# pour la requête SELECT
$row = @mysql_fetch_array($res);
echo "Titre : $row[titre]";

http://dev.ppan.net [Haut de page] [Document mis à jour le 11.06.2010]