/Travaux Dirigés/TD3-PHP-mySQL

Communication entre PHP et MySQL

  

28 janvier 2014

Objectifs

Il s'agit ici de manipuler la communication entre MySQL et PHP :

  1. Connexion au serveur MySQL
  2. Création d'une table (avec PhpMyAdmin)
  3. Insertion d'une donnée "en dur"
  4. Récupération des données trouvées par MySQL
  5. Evolution vers mysqli_

Exercices

Exercice 1 :

Il s'agit ici de manipuler phpMyAdmin en créant une table, puis en y insérant des données. Les manipulations minimales sont afficher les lignes d'une table, ajouter et supprimer une ligne. Modifier des ligne se fait en 2 étapes : afficher les valeurs de la ligne dans une formulaire, puis mettre à jour les valeurs "corrigées" dans la base de données.
La plupart des hébergeurs proposent un outil en ligne pour manipuler les données : phpMyAdmin. Il s'agit d'un ensemble de codes PHP qui affichent des formulaires pour paramétrer des requêtes mySQL.
Des installeurs "tout en un" de serveur de page Web et de serveurs de base de données MySQL intègrent aussi l'installation de phpMyAdmin. C'est le cas de L/W/M_AMP.

  1. Visiter la page de phpmyadmin sur le serveur local et se connecter
  2. Si elle n’est pas déjà créée, créer une base de données nommée test. Pour cela, sélectionner l’onglet Base de données, taper test dans le champ de saisie du nom de la base de données à créer, et choisir la collation utf8-general-ci.
  3. Chercher dans la documentation la différence entre l’encodage et la collation.
  4. Créer une table avec le nombre de champs utiles, plus un champ pour la clé primaire, qui sera un entier auto-incrémenté, et un champ pour la date d'ajout, qui sera e type timestamp, avec comme valeur CURRENT_TIMESTAMP. La soumission du formulaire crée la table et génère l'affichage suivant :
  5. Répondre aux questions suivantes :
    1. Quels sont les types de donnée utilisées ?
    2. Quelle différence y a-t-il entre les types entiers INT et TINYINT ?
    3. Quels autres types entiers auraient été possibles ?
    4. Pour les chaînes de caractères, quels types sont possibles ?
    5. Pourquoi doit-on préciser la taille pour les champs de type VARCHAR ?
    6. Quels sont les autres types utilisés dans la table définie par le formulaire de la copie d'écran ?
    7. Quels autres types liés à la date auraient été possibles ?
    8. Quels sont les champs qui pourront être laissés "vides" (NULL) dans les valeurs de la table MySQL ?
    9. La colonne nommée titre de la table pourra-t-elle contenir la valeur Mrs ?
    10. Quel est le champ qui porte la clé primaire ?
    11. Y a-t-il d'autres champs que la clé primaire à être indexés ?
    12. Pourquoi définit-on un "interclassement" ?
    13. L'"interclassement" s'applique-t-il aux champs de type entier ? - de type date, de type enum ?
    14. Le champ nommé date sera-t-il instancié avec la valeur de la date courante à chaque insertion ?
  6. Ajouter des lignes en insérant des valeurs, supprimer des lignes, modifier des valeurs, rechercher les lignes insérées après une date...
    et noter dans un fichier _memo-sql.txt, les requêtes mySQL générées par phpMyAdmin :
    ce seront ces requêtes qu'il faudra construire avec les valeurs récupérées dans vos formulaires.

Pour vous aider sur les types à choisir, et les autres éléments à renseigner, consulter la page http://tiprof.fr/SitesWebDynamic/Techniques-swd/07_MySQL-et-connectPhp/debut-PhpMyAdmin.html

Exercice 2 :

Il s'agit ici de créer le code qui permet au serveur de pages Web de se connecter au serveur de bases de données. En cas d'échec, le serveur de pages Web doit "générer" un message HTML pour informer le visiteur du site Web que la connection a échoué. Une fois la connexion établie, il reste à sélectionnée la base de données utilisée, en générant aussi un "retour d'information" en cas d'échec. Il peut être utile d'effectuer quelques autres actions comme la définition de la chaîne "utf8", qui était nécessaire pour que le serveur mySQL puisse gérer cet encodage.

  1. Chercher dans la documentation en ligne sur PHP, la fonction à utiliser pour connecter serveur de pages Web de se connecter au serveur de bases de données.
    Il y a en fait 2 possibilités "directes" :
    • l'une, s'appuyant sur une API "directement" pour mySQL, par mysql_connect(), dont la documentation dit qu'elle est obsolète,
    • l'autre, aussi "directe" mais avec une classe Objet et qui remplace la précédente, par mysqli_connect(). (MySQL Improved, mysqli_connect() est un alias de mysqli::__construct() ), Elle produit (/"construit") un objet, ce qui oblige à manipuler ce paradigme de programmation (voir La POO avec PHP5).

    et des possibilités "indirectes", passant par une couche d'abstraction pour l'accès aux données permettant d'utiliser les mêmes fonctions pour exécuter des requêtes et pour récupérer des données, quelque-soit le serveur SQL utilisé (MySQL, PostgreSQL, ...) :
  2. Créer un fichier nommé _connexion.php et y coller un code donné en exemple dans la documentation trouvée, qui fasse toutes les actions nécessaires, et modifier les paramètres de connexion : nom de l'hôte, identifiant, mot de passe, et nom de la base de données.
    ATTENTION : pour MDB2, il faut télécharger la bibliothèque PHP correspondante et déposer l'archive décompressée dans le dossier qui l'utilise. La version utilisée sur ce site est http://tiprof.fr/Essais-php-js/formulaires/form-contact-mini/MDB2.zip.
    définition de variables avec les paramètres de connexion
    $hostname = 'localhost:8889';//pour MAMP... 127.0.0.1:3307
    $user = 'root';
    $pwd = 'root';
    $dbb = 'test';
    mysql_connect()
    $link = mysql_connect($hostname, $user, $pwd);
    if (!$link) { die('Could not connect: ' . mysql_error()); }
    mysql_select_db($dbb) or die ("Connexion à la base $dbb impossible");
    mysql_query("SET NAMES 'utf8'; ");
    mysqli_connect()
    $mysqli = new mysqli($hostname, $user, $pwd, $dbb);
    mysqli_set_charset( $mysqli, 'utf8' ); 
    if ($mysqli->connect_errno) {
        printf("Échec de la connexion : %s\n", $mysqli->connect_error);
        exit();
    }
    & MDB2::connect()
    $dsn = "mysql://$user:$pwd@$hostname/$dbb";
    $options = array(
        'debug'       => 2,
        'portability' => MDB2_PORTABILITY_ALL,
    );
    require_once('_MDB2.php');
    $db = & MDB2::connect($dsn, $options);
    $result = $db->query("SET NAMES utf8");
    if (MDB2::isError($result)) { die ($result->getDebugInfo().'
    '.$result->getMessage()); }
    new PDO()
    try {
        $strConnection = "mysql:host=$hostname;dbname=$dbb"; 
        $arrExtraParam= array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8");
        $pdo = new PDO($strConnection, $user, $pwd, $arrExtraParam); 
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    catch(PDOException $e) {
        $msg = 'ERREUR PDO dans ' . $e->getFile() . ' L.' . $e->getLine() . ' : ' . $e->getMessage();
        die($msg);
    }
  3. Visiter la page _connexion.php avec le protocole HTTP pour la tester : si aucun message d'erreur n'est affiché, c'est que la connexion a abouti.
  4. Ajouter l'envoie de la requête "SET NAMES utf8" dans tous les cas, de façon à ce que MySQL gère l'UTF-8 correctement

Pour vous aider, consulter

Exercice 3 :

Insertion d'une donnée "en dur" : il s'agit de s'approprier les codes d'un formulaire minimaliste qui insère des données dans une table et affichent les dernières données enregistrées.

  1. Observer le code-ci-dessous et essayer le formulaire résultant
  2. Répondre aux questions suivantes :
    1. Quelles sont les fonctions qui sont définies dans le script ?
    2. Toutes les fonctions définies dans le script sont-elles utilisées ?
    3. Comment déclare-t-on une fonction ? Donner un exemple.
    4. Comment appelle-t-on une fonction ? Donner un exemple.
    5. Toutes les fonctions définies ici "rendent"-elles une valeur ?
    6. Les valeurs "rendues" par les fonctions doivent-elles être toujours entières ?
    7. Quel est la ligne de code qui stipule ce que va rendre la fonction get_lasts() ?
    8. Dans la fonction affich_table(), la chaîne de caractères $str est construite. Quel est la ligne de code qui initialise $str ?
    9. Dans la fonction affich_table(), un autre opérateur d'affectation que = est utilisé. Quel est cet opérateur ? Que "fait"-il et comment "s'écrit"-il ?
    10. Dans la fonction affich_table(), la chaîne $str est rallongée avec le texte construit par "<tr><th>${row['id']}</th><td class=date>${row['date']}</td>"... Quel code y insère la valeur de la case mémoire indéxée par 'id' du table PHP $row ?
    11. Pourquoi la chaîne "<tr><th>${row['id']}</th><td class=date>${row['date']}</td>".., contient-elle les caractères { et } ? (Que se passe-t-il si elle ne les contient pas ?)
    12. Le formulaire est-il en méthode GET ou en méthode POST ?
    13. Comment (/ où / quand ) la variable $_GET est-elle instanciée ?
    14. $_GET est-elle un entier ?
    15. Quelles sont les noms des indexes de la table $_GET ?
    16. Quels sont les noms du tableau des dernières valeurs trouvées dans la table MyQL (dans le code de définition de la fonction d'une part, et dans le programme principal d'autre part) ?
    17. Quelle est l'URL demandée quand le formulaire est soumis ?
    18. Quel code PHP produit le code de l'action du formulaire ?
    19. Dans quelle ligne le fichier de connexion est-il inclus ?
    20. Que fait l'action "Sauver" ?
    21. Ces codes enregistrent-ils dans la base de données les informations renseignées dans le formulaire ?
  3. Chercher dans la documentation sur PHP ce que font les fonctions :
    • define()
    • include()
    • unset()
    • array()
    • mysql_query()
    • mysql_error()
    • mysql_insert_id()
    • mysql_fetch_assoc()
    • mysql_free_result()
  4. Recopier le code dans un fichier mini-form.php et créer un fichier de connexion utilisant l'API mysql, appelé _connexion.php
  5. Modifier le code en remplaçant la requête d'insertion et la requête de sélection par des requêtes adaptées à votre table mySQL.
  6. Modifier le code pour changer la méthode en méthode POST.

Pour vous aider sur la structuration d'une page de formulaire, consulter la page http://www.tiprof.fr/SitesWebDynamic/Techniques-swd/mat%C3%A9riel/mysql/, et sur les requêtes MySQL et leur utilisation avec l'API mysql_, consulter la page http://tiprof.fr/PHP-mySQL/ressources/mysql/Resume_RequetesMySQL-et-PHP.html

Exercice 4 :

Transmission des données du formulaire à la table MySQL : il s'agit de s'approprier les codes d'un formulaire minimaliste qui insère des données dans une table, mais où les données sont bien celles demandées.

Dans cet exercice, l'API utilisée est mysql_... et non pas mysqli_...

  1. Observer le code ci-dessous et essayer le formulaire résultant.
  2. Chercher dans la documentation sur PHP ce que font les fonctions :
    • function_exists()
    • array_map()
    • array_values()
    • array_key()
    • implode()
    • get_magic_quotes_gpc()
    • addslashes()
    • stripslashes()
    • mysql_real_escape_string()
  3. Répondre aux questions suivantes :
    1. Quelles sont les lignes de codes qui diffèrent du code précédent ?
    2. La fonction insert($data) est déclarée avec comme paramètre initial $data ? Quelle est le paramètre transmis à cette fonction quand elle est "appelée" ?
    3. Quelle ligne de codes de la fonction insert($data) utilise la fonction myaddslashes($data) ?
    4. array_values($data) fabrique un tableau PHP avec seulement la liste des valeurs du tableau associatif $data. Quelle est l'effet de array_values(...) sur chacune de ces valeurs ?
    5. Si $keys contient le tableau PHP qui est la liste des valeurs "id, date, titre, nom, prenom", quelle est la chaîne construite par le code implode('`,`', $keys) ?
    6. Pourquoi l'action 'Sauver' commence-t-elle par la ligne de code unset($_GET['lancer']); ? (= Que se passe-t-il si on l'enlève ? et expliquer pourquoi)
  4. Recopier le code dans un fichier mini-form.php et créer un fichier de connexion utilisant l'API mysql, appelé _connexion.php
  5. Modifier le code en remplaçant la requête d'insertion et la requête de sélection par des requêtes adaptées à votre table mySQL.
  6. Modifier le code pour faire afficher les requêtes MySQL avant de les envoyer.
  7. Modifier le code pour afficher toutes les données dans les lignes d'un tableau dans la zone de formulaire, et où la première colonne présente un bouton radio dont la valeur est l'index du contact affiché sur la ligne.
  8. Modifier le code pour supprimer l'élément dont le bouton radio était sélectionné.

Pour vous aider sur les requêtes MySQL et leur utilisation avec l'API mysql_, consulter la page http://tiprof.fr/PHP-mySQL/ressources/mysql/Resume_RequetesMySQL-et-PHP.html

Exercice 5 :

Il s'agit de passer à l'utilisation de mysqli_, tout en sachant lire les exemples en mysql_.

Cet exercice s'appuie sur l'observation comparative d'un formulaire avec mysqli_ par opposition au même formulaire avec mysql_

  1. Observer le code ci-dessous et essayer le formulaire résultant.
  2. Répondre aux questions suivantes :
    1. L'objet $mysqli est-il utilisé à l'intérieur des fonctions ?
    2. Quels sont les numéros des lignes qui sont différentes de la version du fichier utilisant mysql_ plutôt que mysqli_ ?
  3. Chercher dans la documentation sur PHP ce que font les fonctions :
    • $mysqli->query()
    • $mysqli->errno()
    • $mysqli->insert_id()
    • $mysqli->close()
    • $result->fetch_assoc()
  4. D'après la documentation, quels sont les avantages de mysqli_ par rapport à mysql_ ?
  5. Recopier le code dans un fichier mini-form-i.php et créer un fichier de connexion utilisant l'API mysqli, appelé connexion.php
  6. Supprimer les 2 lignes de code
     global $mysqli; 
    contenues en premières lignes des fonctions insert($data) et get_lasts($nb) et essayer la nouvelle version du formulaire obtenue en le visualisant avec le protocole HTTP.
    Quel message d'erreur est affiché ?
    Chercher dans la documentation sur la portée des variables pourquoi ce message est affiché et expliquer pourquoi.

Pour vous aider sur la programmation orientée objet et la portée des variables dans PHP5, consulter la page http://tiprof.fr/PHP-mySQL/ressources/php/POO-avec-PHP5.html

Exercice 6 :

Il s'agit de passer à l'utilisation de la classe MDB2, avec le même exercice que pour passer de mysql_ à mysqli_

Cet exercice s'appuie sur l'observation comparative d'un formulaire avec la classe MDB2 par opposition au même formulaire avec mysql_

  1. Observer le code ci-dessous et essayer le formulaire résultant.
  2. ... Reprendre les questions de l'exercice précédent...

Pour vous aider sur la classe MPO, consulter les pages :

Exercice 7 :

Il s'agit de passer à l'utilisation de la classe MPO, avec le même exercice que pour passer de mysql_ à mysqli_

Cet exercice s'appuie sur l'observation comparative d'un formulaire avec la classe MPO par opposition au même formulaire avec mysql_

  1. Observer le code ci-dessous et essayer le formulaire résultant.
  2. ... Reprendre les questions de l'exercice précédent...

Pour vous aider sur la classe MPO, consulter les pages :

Des liens

Pour vous aider, vous pouvez consulter :

Le résumé des requêtes MySQL liées au PHP, avec des conseils pour les traiter par les fonctions PHP de la librairie mysql_.. (et pas mysqli... !)
http://tiprof.fr/PHP-mySQL/ressources/mysql/Resume_RequetesMySQL-et-PHP.html
Le petit résumé sur la programmation objet avec PHP5
La POO avec PHP5
Comparaison de plusieurs couches d'abstraction SQL
http://www.greaterscope.net/documentation/php_database_abstraction_class_comparison.html
remonter plus récent revenir
LicPro - PAGORA