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