1
IFT1147
Programmation Serveur Web avec PHP PHP et MySQL
IFT1147 - PHP et MySQL 2
PHP et MySQL
On peut facilement accéder MySQL à partir de PHP en suivant le modèle
Connexion et choix de la BD
Requête
Lecture, ligne par ligne, du résultat
Fermeture de la connexion
Référence:
http://www.php.net/mysql
IFT1147 - PHP et MySQL 3
Connexion: mysql_connect
On fait le lien avec le serveur MySQL avec la fonction mysql_connect qui prend trois arguments
Nom du serveur
Nom d’usagers
Mot de passe
mysql_connect(’europa’, ’dift1147_web’, ’secret’);
IFT1147 - PHP et MySQL 4
Choix de la base de données
La fonction mysql_select_db est l’équivalent PHP de la fonction USE en ligne de commande. Elle permet de choisir la base de données courante.
mysql_connect(’europa’, ’dift1147_web’, ’secret’);
mysql_select_db(’dift1147_Cinema’);
IFT1147 - PHP et MySQL 5
Exécution d’une requête
mysql_query permet d’exécuter une requête
mysql_fetch_assoc permet ensuite l’accès au résultat:
$reqID = mysql_query(’SELECT * FROM Film’);
while ($ligne = mysql_fetch_assoc($reqID)) { echo $ligne[’titre’];
}
mysql_free_result($reqID);
IFT1147 - PHP et MySQL 6
mysql_fetch_assoc
mysql_fetch_assoc retourne un tableau associatif dont les clés sont les noms des colonnes retournées par la requête SQL.
mysql_fetch_assoc retourne une ligne du résultat à la fois. À chaque appel, le pointeur est avancé d’une ligne dans le résultat.
2
IFT1147 - PHP et MySQL 7
Terminer la connexion
Finalement, afin de mettre fin à la connexion au serveur MySQL, on utilise la fonction mysql_close().
Il est important de fermer la connexion le plus rapidement possible afin de libérér le serveur MySQL pour d’autres connexions …
IFT1147 - PHP et MySQL 8
INSERT, UPDATE et DELETE
mysql_query permet pas seulement d’exécuter des requêtes SELECT, mais aussi toute autre requête.
Évidemment, s’il ne s’agit pas d’une requête SELECT, on ne fera pas appel à mysql_fetch_assoc par la suite; on est plutôt intéressé à savoir combien de lignes ont été modifiées.
IFT1147 - PHP et MySQL 9
Nombre de lignes
mysql_num_rows($reqID) permet d’obtenir le nombre de lignes retournées par une requête SELECT.
mysql_affected_rows() permet d’obtenir le nombre de lignes modifiées par une requête INSERT, DELETE ou UPDATE.
IFT1147 - PHP et MySQL 10
Déboguer les requêtes
Si une requête contient une erreur SQL, la fonction mysql_query retourne faux.
Dans un serveur de production, on ne veut en général pas afficher le code de la requête SQL qui a échoué, mais seulement un message indiquant que la page n’est pas disponible etc.
Par contre, lors du développement …
IFT1147 - PHP et MySQL 11
mysql_error et mysql_errno
Lors du développement, il est souvent pratique d’obtenir le message d’erreur exact de MySQL.
mysql_error() retourne le texte du message d’erreur; mysql_errorno retourne le numéro de l’erreur.
Le code SQL exact de la requête est aussi indispensable …
IFT1147 - PHP et MySQL 12
Recette mysql_query pour développement
mysql_connect($host,$user,$passwd);
mysql_select_db("dift1147_…");
$sql = "SELECT …";
$requeteID = mysql_query($sql) or die("Erreur SQL " . mysql_errno() . ": " . mysql_error() .
" dans la requête " . $sql);
3
IFT1147 - PHP et MySQL 13
Pear::DB
Pear::DB est un ensemble de classes disponibles dans Pear.
C’est une des librairies les plus utilisées pour l’accès aux bases de données.
Avantages:
indépendance du type de base de données
Plus de méthodes
Simple gestion des erreurs
IFT1147 - PHP et MySQL 14
Pear::DB - quelques méthodes
$db =& DB::connect()
$res =& $db->query()
while ($row =& $res->fetchRow())
$res->numRows()
$data =& $db->getOne($requete)
$data =& $db->getAll($requete)
IFT1147 - PHP et MySQL 15
Data Objects
Les requêtes pour charger et
sauvegarder des objets dans une base de données sont souvent très répétives et indépendantes de l’objet.
On peut donc séparer la fonctionnalité de l’objet de sa façon d’être sauvegardé.
Pear::DB_DataObject
IFT1147 - PHP et MySQL 16
Data Objects - à considérer
Il faut choisir avec soin (et selon les besoins) la granularité des requêtes.
Charger tous les attributs d’un objet avec une seule requête ou avec plusieurs requêtes au besoin (lazy loading) ?
Retourner des objets ou uniquement des identifiants (ID) à partir des recherches ?