300 likes | 371 Views
Techniques Internet de Base 2006-2007. Licence 2 (Info, Maths, PC/PA) Université Jean Monnet Ruggero G. PENSA ruggero.pensa@univ-st-etienne.fr. Accès à MySQL avec PHP. Etapes.
E N D
Techniques Internet de Base2006-2007 Licence 2 (Info, Maths, PC/PA) Université Jean Monnet Ruggero G. PENSAruggero.pensa@univ-st-etienne.fr
Etapes • L'accès à une base MySQL et son utilisation, qu'il s'agisse d'insérer, de modifier ou de lire des données, suit les étapes ci-dessous : • Connexion au serveur MySQL • Envoi de requêtes SQL au serveur • Insertion de données dans la base • Recherche dans la base • Lecture du résultat d'une requête • Fermeture de la connexion
Connexion au serveur MySQL • Avant toute chose, le script doit permettre de se connecter au serveur MySQL. • La fonction à utiliser est mysql_connect() • Syntaxe : • $res=mysql_connect($host,$user,$pass[,$multi]); • Paramètres : • $host : le nom du serveur • $user : le nom de l'utilisateur • $pass : mot de passe de l'utilisateur • $multi : nombre de connexion ouvertes à partir du même script avec les mêmes paramètres
Quelques conseils • La fonction retourne une variable de type resource qui est un identifiant de connexion. • $res a la même fonction que l'$id retourné par fopen() • $host est souvent identifié avec le serveur web, c.a.d. "localhost" • Il faut éviter d'utiliser l'utilisateur root pour les opération de lecture/écriture courantes dans la base • Exemple : • $res=mysql_connect("192.168.0.14", "dbuser", "aX34p0Zl");
Paramètres de connexion • Par mesure de sécurité il peut être utile de placer les valeurs des paramètres de connexion dans un fichier séparé • Le fichier peut être inclus dans les scripts d'accès à la base de données à travers la fonction include() • Exemple : parametres.inc.php <?php define("MONHOST","localhost"); define("MONUSER","root"); defint("MOTDEPASSE","Az01x4oP"); ?>
Sélection de la base de données • Si le serveur comporte plusieurs bases de données, on doit préciser la base désirée au moyen de la fonction mysql_select_db(); • Syntaxe : • mysql_select_db($nombase,$res); • Exemple : • $res=mysql_connect(...); • mysql_select_db("mabase",$res); • La fonction retourne FALSE si la base de données n'existe pas
Fermeture de la connexion • La connexion établie prend fin automatiquement quand le script PHP est terminé • Il est recommandé de mettre fin à la connexion explicitement dès que possible de façon à liberer le serveur MySQL • Cette précaution améliore la vitesse des connexions des autres utilisateurs • Pour mettre fin à la connexion, il faut utiliser la fonction mysql_close() • Syntaxe : • mysql_close($res);
Exemple de connexion à une base <?php include_once("parametres.inc.php"); $idcom=@mysql_connect(MONHOST,MONUSER,MOTDEPASSE); $idbase=@mysql_select_db("mabase"); if(!$idcom | !$idbase) { echo "<script type=text/javascript>"; echo "alert('Connexion Impossible à la base $base')</script>"; } //*************** // Requêtes SQL //*************** mysql_close($idcom); ?>
Fonction de connexion • Fichier connexion.inc.php <?php function connexion($base,$param) { include_once($param.".inc.php"); $idcom=@mysql_connect(MYHOST,MYUSER,MYPASS); $idbase=@mysql_select_db($base); if(!$idcom | !$idbase) { echo "<script type=text/javascript>"; echo "alert('Connexion Impossible à la base $base')</script>"; } return $idcom; } ?>
Utilisation de connexion.inc.php • Dans chaque script qui accède à une base de données on pourra ajouter les lignes suivantes avant toute requête • include("connexion.inc.php"); • $idcom=connexion("mabase","parametres");
Envoi de requêtes SQL au serveur • Toute opération sur une base nécessite d'envoyer au serveur une requête SQL rédigée selon la syntaxe vue dans le cours précédent • Pour envoyer une requête, il faut utiliser la fonction mysql_query() • Syntaxe • $result=mysql_query($requete, $res); • Paramètres : • $requete : chaîne contenant la requête SQL • $res : id de la connexion
Résultats d'une requête • La fonction retourne un identifiant de résultat de type resource • Si la requête contient des commandes SELECT, cet identifiant permet d'accéder aux données fournies par la requête • Pour les autres requêtes, la fonction retourne TRUE si la requête est bien exécutée • Si une requête quelconque n'est pas exécutée la fonction mysql_query() retourne FALSE
Exemple d'envoi de requête <?php include("connexion.inc.php"); $idcom=connexion("mabase","parametres"); $requete="SELECT * FROM album ORDER BY nom"; $result=@mysql_query($requete,$idcom); if(!$result) { echo "Lecture impossible"; } else { //Lecture des résultats éventuels } ?>
Lecture du résultat d'une requête • Pour lire le résultat d'une requête contenant la commande SELECT, il est indispensable de recueillir les données • Le résultat d'une requête peut être traité comme un tableau • La fonction mysql_fetch_row() récupere une ligne à la fois • Syntaxe • $arrayres=mysql_fetch_row($idresult); • La fonction retourne un tableau (numérique) contenant autant d'éléments qu'il y a de colonnes précisées dans la requête SELECT • Chaque nouvel appel de la fonction retourne la ligne suivante du résultat, où FALSE s'il n'y a plus de ligne à lire
Nombre de lignes et colonnes d'un résultat • La fonction mysql_num_fields($idresult) retourne le nombre de colonnes du résultat • La fonction mysql_num_rows($idresult) permet de connaitre le nombre de lignes du résultat
Libération de la mémoire • Une fois les données utilisées, il est possible de libérer la mémoire occupée par la variable $idresult en appelant la fonction mysql_free_result($idresult)
Exemple (tableau numérique) 1 <html> <head> <title>Lecture de la table article</title> </head> <body> <?php include("connexion.inc.php"); $idcom=connex("mabase","parametres"); $requete="SELECT artist.name, album.name, label.name, album.year FROM artist, album, label WHERE artist.id=album.artist_id AND album.label_id=label.id"; $result=@mysql_query($requete,$idcom); if(!$result) { echo "Lecture impossible"; }
Exemple (tableau numérique) - 2 else { $nbart=mysql_num_rows($result); echo "<h3> Il y a $nbart albums</h3>"; echo "<table border=\"1\"> <tr>"; while($ligne=mysql_fetch_row($result)) { echo "<tr>"; foreach ($ligne as $valeur) { echo "<td>".$valeur."</td>"; } echo "</tr>"; } echo "</table>"; mysql_free_result($result); } ?> </body> </html>
Lecture à l'aide d'un tableau associatif • La fonction mysql_fetch_assoc() récupere une ligne à la fois dans un tableau associatif • Syntaxe • $arrayres=mysql_fetch_assoc($idresult); • La fonction retourne un tableau associatif contenant autant d'éléments qu'il y a de colonnes précisées dans la requête SELECT • Les clés sont les nom des colonnes • Chaque nouvel appel de la fonction retourne la ligne suivante du résultat, où FALSE s'il n'y a plus de ligne à lire
Exemple (tableau associatif) 1 <html> <head> <title>Lecture de la table article</title> </head> <body> <?php include("connexion.inc.php"); $idcom=connex("mabase","parametres"); $requete="SELECT artist.name as Artiste, album.name as Album, label.name as Label, album.year as Annee FROM artist, album, label WHERE artist.id=album.artist_id AND album.label_id=label.id"; $result=@mysql_query($requete,$idcom); if(!$result) { echo "Lecture impossible"; }
Exemple (tableau associatif) - 2 else { $nbart=mysql_num_rows($result); echo "<h3> Il y a $nbart albums</h3>"; echo "<table border=\"0\"> <tr>"; while($ligne=mysql_fetch_assoc($result)) { echo "<tr>"; foreach ($ligne as $cle=>$valeur) { echo "<td><b>".$cle."</b></td>"; echo "<td>".$valeur."</td>"; } echo "</tr>"; } echo "</table>"; mysql_free_result($result); } ?> </body> </html>
Lecture des noms de colonnes • Pour lire les noms des colonnes du résultat d'une requête : • $colonne=mysql_field_name($resultat, $num_col) • $num_col est le numéro de la colonne dont on veut connaître le nom
Insertion de données • Exemple d'insertion de données : • Nouvelle intervention dans un forum • Inscription d'un utilisateur • ... • L'insertion de données se fait presque toujours à partir d'un formulaire HTML • Il faut gérer les caractères spéciaux
Gestion des caractères spéciaux • Il est préférable d'utiliser un caractère d'échappement pour les caractères spéciaux des chaînes récupérées dans le tableau $_POST, en particulier les guillemets • On dispose de deux fonctions • $val=mysql_escape_string($chaine); • $val=mysql_real_escape_string($chaine); • La deuxième fonction prend en compte le jeu de caractères utilisé (ex. latin1)
Exemple – Inscription en ligne 1 <?php include('connexion.inc.php'); if(!empty($_POST['nom'])&& !empty($_POST['adresse'])&& !empty($_POST['ville'])) { $id_utilisateur="\N"; $nom=mysql_escape_string($_POST['nom']); $prenom=mysql_escape_string($_POST['prenom']); $age=mysql_escape_string($_POST['age']); $adresse=mysql_escape_string($_POST['adresse']); $ville=mysql_escape_string($_POST['ville']); $mail=mysql_escape_string($_POST['mail']); //Requète SQL $requete="INSERT INTO utilisateur VALUES('$id_utilisateur','$nom','$prenom','$age','$adresse','$ville','$mail')"; $idcom=connex('mabase','parametres'); $result=mysql_query($requete,$idcom);
Exemple – Inscription en ligne 2 if(!$result) { echo mysql_errno(); echo mysql_error(); echo "<script type=\"text/javascript\"> alert('Erreur : ".mysql_error()."')</script>"; } else { echo "<script type=\"text/javascript\"> alert('Vous êtes enregistré Votre id utilisateur est : ". mysql_insert_id()."')</script>"; } } else {echo "<h3>Formulaire à compléter!</h3>";} ?>
Mise à jour d'une table • Exemples : • Changement du mot de passe • Mise à jour du prix d'un produit • Misa à jour d'un compteur • ... • Il faut traiter les caractères spéciaux
Exemple – Mise à jour 1 <?php if($_POST['modif']!='Enregistrer') { //FORMULAIRE } elseif(isset($_POST['nom'])&& isset($_POST['adresse'])&& isset($_POST['ville'])) { include('connexion.inc.php'); $nom=mysql_escape_string($_POST['nom']); $adresse=mysql_escape_string($_POST['adresse']); $ville=mysql_escape_string($_POST['ville']); $mail=mysql_escape_string($_POST['mail']); $code=mysql_escape_string($_POST['code']); $requete="UPDATE utilisateur SET nom='$nom',adresse='$adresse',ville='$ville',mail='$mail' WHERE id_utilisateur='$code'"; $idcom=connex('mabase','parametres'); $result=mysql_query($requete,$idcom); mysql_close($idcom);
Exemple – Mise à jour 2 if(!$result) { echo "<script type=\"text/javascript\"> alert('Erreur : ".mysql_error()."')</script>"; } else { echo "<script type=\"text/javascript\"> alert('Vos modifications sont enregistrées');window.location='index.htm';</script>"; } } else { echo "Modifier vos coordonnées!"; } ?>