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.
# 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 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.
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