Programmation Impérative 2006-2007

publicité
Techniques Internet de Base
2006-2007
Licence 2 (Info, Maths, PC/PA)
Université Jean Monnet
Ruggero G. PENSA
[email protected]
Accès à MySQL avec PHP
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 :
1.
2.
Connexion au serveur MySQL
Envoi de requêtes SQL au serveur


3.
4.
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 :


Exemple :



mysql_select_db($nombase,$res);
$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!";
}
?>
Téléchargement