PHP et SQL

Pour rendre plus concret le système de requêtes, nous allons mettre en application en créant un formulaire permettant à un utilisateur de renseigner une BDD

Ici nous utiliserons le langage php en version 5, il y a des versions plus récentes donc quelques modifications, ex: pdo... ( vérifiez bien que vous êtes en, php 5 dans Uwamp ).

contexte

imaginons que nous soyons un site de critique de cinéma, nous allons proposer à l'utilisateur (préalabrement identifieé) de renseigner notre base de données en indiquant un genre,un réalisateur, une année,un titre, une note et un résumé

Etape 1

  • ouvrir uwamp ( vous savez faire maintenant )
  • Etape 2: Création d’une base de données

  • Cliquez sur PhpMyAdmin puis créez une nouvelle base que vous appelerez Critique
  • Nous voulons permettre à l'utilisateur d'entrer ses films, pour cela il faut définir les attributs de la table:

    nous choisirons: genre, réalisateur, année, titre, note et résumé mais vous pouvez en ajouter ou modifier le contexte.

    Donc nous allons créer cette table avec 7 colonnes mais il n’y a que 6 champs? Tiens tiens, qui sait pourquoi?

    La page suivante vous demande de créer les champs :

    N'oubliez pas l'auto incrémentation de l'id ! et retirez les accents 🤪

    vous devriez obtenir ça si vous avez bien renseigné les domaines

  • Enregistrez la table.
  • Nous allons remplir un champ dans cette interface : cliquez sur insérer puis renseignez la table , ex:
  • Exécuter et la fiche sur ce film est enregistrée.. Pour le voir cliquez sur afficher
  • Là encore on peut tout modifier...

  • Réaliser quelques autres enregistrements
  • C’est déjà pas mal, mais ce serait mieux si on pouvait faire la même chose à partir d’un formulaire

    Étape 3 : Mise en place de l’espace de travail

  • Il faut créer un dossier TP_BDD dans le dossier www de UwAmp, puis créer 2 fichiers php via vs code, fonctions et form ainsi qu'un fichier css nommé style
  • Vous devriez avoir:

  • Inclure le code css suivant dans style:css
  • copiez coller
  • copiez coller le code ci-dessous dans Le fichier fonctions.php (il n’y a rien à modifier dans ce script sauf si votre base a un autre nom…)
    
        <?php
        function connectMaBase(){
            $base = @mysql_connect ('localhost', 'root', 'root');  
            mysql_select_db ('Critique', $base) ;
           
        }
        ?>
                                        

    Contient le script de connexion à la base ``Critique``

    ``localhost`` est le nom du serveur local

    ``root`` est le nom d’utilisateur et ``root`` le mot de passe de connexion

    ``$base`` est la variable où l’on stocke la requête

    Le fichier form.php à copier coller
    
        <?php
        include("fonctions.php");
        ?>
        
        <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
            <head>
                
                <meta http-equiv="content-type" content="text/html; charset=utf-8" /> 
                <title>Formulaire de saisie utilisateur </title>
            <link href="style.css" rel="stylesheet" media="all" type="text/css"> 
            </head>
            
            <body>
                <h1 align=center>TP BDD</h1><br>
                </body>
                </html>
                                        

    Pour l’instant c’est une page web classique, avec au début l’inclusion du fichier fonctions.php qui permet de se connecter à la base

    Le fichier style.css, du classique pas très beau
  • Pour visualiser votre formulaire, cliquez sur navigateur www dans uwamp puis cliquez sur le dossier TP-base-donnee
  • Si maintenant vous cliquez sur form.php vous verrez s’afficher une page web (très basique)

    Étape 4 : Nous allons maintenant fabriquer un formulaire qui permettra via une requête d’alimenter notre base avec de nouveaux enregistrements.
  • Complétez le fichier form.php comme suit
  • Et oui, j'ai mis une image, rien de mieux que la pratique pour assimiler😜

  • Vous devriez obtenir ça:
  • C'est magnifique mais totalement inutile car il n'y a pas de requêtes🤪

  • Nous allons écrire le script php qui permet d’enregistrer la fiche dans la base de données
  • Vous devez donc insérer le code suivant dans la balise section en complétant la requête sql

    
        <?php
        if (isset($_POST['valider'])){
    
            //On récupère les valeurs entrées par l'utilisateur :
            $genre=$_POST['genre']; $réalisateur=$_POST['réalisateur'];
            $annee=$_POST['annee'];
            $note=$_POST['note'];
            $titre=$_POST['titre'];
            $commentaire=$_POST['commentaire'];
    
            //On se connecte
            connectMaBase();
    
            //On prépare la commande sql d'insertion
            $sql = '........................... (NULL,"'.$genre.'","'.$réalisateur.'","'.$annee.'","' . $note.'","'.$titre.'","'.$commentaire.'")';
    
            /*on lance la commande (mysql_query) et au cas où,
            on rédige un petit message d'erreur si la requête ne passe pas (or die)
            (Message qui intègrera les causes d'erreur sql)*/
            mysql_query($sql) or die ('Erreur SQL !'.$sql.'
    '.mysql_error()); // on ferme la connexion mysql_close(); // si tout s'est bien passé on reçoit un message (popup) $message='Vos données ont bien été enregistrées'; echo '<script type="text/javascript">window.alert("'.$message.'");</script>'; } ?>
    Quelques remarques :
         En php, une ligne de commentaire se signale avec un double slash (comme en java)
         Ce script n’est lancé que si l’on a cliqué sur le bouton ‘OK’ ( if(…))
         Attention à la syntaxe (compliquée je le concède)
        Pour cette requête il faut bien respecter l’ordre des champs de votre base de données.
         Le premier champ qui est auto-incrémenté doit être vide ("")
         Les champs sont séparés par des virgules
         "'.$nom_de_la_variable.'" la variable est donc entre points puis quotes puis guillemets.
         Réalisez plusieurs enregistrements, et vérifiez dans PhpMyAdmin qu’ils y sont bien…
    
    <?php
    include("fonctions.php");
    ?>
    
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
        <head>
            
            <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>Formulaire de saisie utilisateur </title>
        <link href="style.css" rel="stylesheet" media="all" type="text/css"> 
        </head>
        
        <body>
            <h1 align=center>TP-BDD</h1><br>
            <section>
                <h1>Fiche ciné</h1>
    
                <form name="inscription" method="post" action="form.php"> 
                    <h2>Cochez le genre du film</h2>
                    <input type="radio" name="genre" value="Humour"/>Humour. <br/>
                    <input type="radio" name="genre" value="Science Fiction"/>Science Fiction. <br/> 
                    <input type="radio" name="genre" value="Fantasy"/>Fantastique. <br/>
                    <input type="radio" name="genre" value="manga"/>Animé. <br/>
                    <input type="radio" name="genre" value="Historique"/>Historique. <br/><br/>
                    
                    Entrez le nom du réalisateur : <input type="text" name="réalisateur"/> <br/>
                    L'année de publication <input type="number" name="annee"/><br/>
                    votre note sur 20: <input type="number" name="note"/><br/>
                    Le titre du film : <input type="text" name="titre"/><br/>
                    <h2> Résumé</h2>
                    <TEXTAREA name="commentaire" rows=10 COLS=40></TEXTAREA><br/>
                    
                    <input type="submit" name="valider" value="OK"/> 
                </form>
    
                <?php
                if (isset($_POST['valider'])){
    
                    //On récupère les valeurs entrées par l'utilisateur :
                    $genre=$_POST['genre']; $réalisateur=$_POST['réalisateur'];
                    $annee=$_POST['annee'];
                    $note=$_POST['note'];
                    $titre=$_POST['titre'];
                    $commentaire=$_POST['commentaire'];
    
                    //On se connecte
                    connectMaBase();
    
                    //On prépare la commande sql d'insertion
                    $sql = 'INSERT INTO films VALUES (NULL,"'.$genre.'","'.$réalisateur.'","'.$annee.'","' . $note.'","'.$titre.'","'.$commentaire.'")';
    
                    /*on lance la commande (mysql_query) et au cas où,
                    on rédige un petit message d'erreur si la requête ne passe pas (or die)
                    (Message qui intègrera les causes d'erreur sql)*/
                    mysql_query($sql) or die ('Erreur SQL !'.$sql.'<br />'.mysql_error());
    
                    // on ferme la connexion
                    mysql_close();
    
                    // si tout s'est bien passé on reçoit un message (popup)
                    $message='Vos données ont bien été enregistrées';
                    echo '<script type="text/javascript">window.alert("'.$message.'");</script>';
                }
                ?>
            </section>
    
    
    
        </body>
    </html>
        
    Étape 5 : Nous allons faire afficher le contenu de la table Critique dans une page web 
  • Dans Vscode dans le dossier TP-base-donnee, créer un nouveau fichier sous le nom de infos.php
  • Copiez coller ce qu’il faut depuis form.php pour obtenir : (la même chose qu'au début)
  •     1. On se connecte à la base (en utilisant notre fonction de connexion toute prête).
        2. On prépare la commande sql en la stockant dans une variable PHP du type $sql (pour langage sql).
        3. On la lance, en récupérant le résultat dans une variable que nous appellerons $req (pour requête sql et qui sera un tableau).
        4. On scanne $req avec une boucle while et grâce à la fonction mysql_fetch_array($req), chaque élément de ce tableau se convoquera ainsi : $data['champ'].
        5. Maintenant qu'on a tout récupéré dans des variables "solides" PHP, on libère la mémoire sql mobilisée par cette requête.
        6. On ferme la connexion sql.
  • Voilà donc le script :
  • 
            <section>
           
            
    
                <?php
        
                //On se connecte
        
                connectMaBase();
        
        // On prépare la requête qui va mettre dans un tableau tout ce qui concerne le réalisateur Tim Burton ( pas un très bon exemple car il y a prénom et nom mais j'aime ce réalisateur)
        
                $sql = 'SELECT * FROM Films WHERE realisateur="Tim Burton"';  
        
         // On lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas (or die)  
        
                $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());  
        
         
        
                //on organise $req en tableau associatif  $data['champ']
        
                //en scannant chaque enregistrement récupéré
        
                //on en profite pour gérer l'affichage
        
                //titre de la section avant la boucle
        
                echo'<h2>Fiche de : Tim Burton </h2>';
        
         
        
                //boucle
        
                while ($data = mysql_fetch_array($req)) { 
        
                    // on affiche les résultats 
        
                    echo 'Titre :<strong>'.$data['titre'].'</strong><br/>'; 
        
                   echo 'Référencé sous le n° : <strong>'.$data['id'].'</strong><br/>'; 
        
                    echo 'Genre :'.$data['genre'].'<br/>';  
        
                    echo 'Année :'.$data['annee'].'<br/>';  
        
                    echo 'Note:'.$data['note'].'<br/>';  
        
                    echo 'Commentaire :'.$data['resume'].'<br/><br/><br/>';  
        
                   
        
                }  
        
                //On libère la mémoire mobilisée pour cette requête dans sql
        
                //$data de PHP lui est toujours accessible !
        
                mysql_free_result ($req);  
        
         
        
                //On ferme sql
        
                mysql_close ();  
        
                ?>
        
                
                </section>
                                            
  • Lancez la page infos.php depuis www Site, vos enregistrements apparaissent…
  • Étape 6 : Nous allons faire afficher tout ce qui concerne un auteur…
  • Créer un nouveau fichier sous le nom de selection.php
  • Copiez et Collez le code ci-dessous dans selection.php
  • <?php include("fonctions.php"); ?>
                <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
                
                <head>
                    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
                    <title>Informations </title>
                    <link href="style.css" rel="stylesheet" media="all" type="text/css">
                </head>
                
                <body>
                    <h1 align=center>TP-BDD</h1><br>
                    <section>
                        <?php //On se connecte 
                        connectMaBase(); 
                // On prépare la requête qui va mettre dans un tableau tout ce qui concerne le réalisateur
                $sql = 'SELECT * FROM Films WHERE realisateur="Tim Burton"'; 
                // On lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas (or die)
                 $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 
                //on organise $req en tableau associatif $data['champ'] 
                //en scannant chaque enregistrement récupéré 
                //on en profite pour gérer l'affichage 
                //titre de la section avant la boucle 
                echo'<h2>Fiche de : Tim Burton </h2>'; 
                //boucle 
                while ($data = mysql_fetch_array($req)) { 
                    // on affiche les résultats 
                    echo 'Titre :<strong>'.$data['titre'].'</strong><br/>';
                     echo 'Référencé sous le n° : <strong>'.$data['id'].'</strong><br/>';
                      echo 'Genre :'.$data['genre'].'<br/>'; 
                      echo 'Année :'.$data['annee'].'<br/>'; 
                      echo 'note :'.$data['note'].'<br/>';
                    echo 'Résumé :'.$data['resume'].'<br/><br/><br/>'; }
                     //On libère la mémoire mobilisée pour cette requête dans sql
                //$data de PHP lui est toujours accessible ! 
                mysql_free_result ($req); 
                //On ferme sql 
                mysql_close (); ?>
                    </section>
                </body>
                
                </html>
                                            
    Étape 7 : Dans une nouvelle page nous allons faire afficher des enregistrements suivant des critères
  • Créer un nouveau fichier sous le nom recherche.php et copiez-collez ce qu’il faut pour…
  • 
            <?php
            include("fonctions.php");
            ?>
            
            <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
            
            <head>
            
                <meta http-equiv="content-type" content="text/html; charset=utf-8" />
                <title>Formulaire de saisie utilisateur </title>
                <link href="style.css" rel="stylesheet" media="all" type="text/css">
            </head>
            
            <body>
                <h1 align=center>TP-BDD</h1><br>
                <section>
                    <h2>Choisissez le champ qui vous intéresse et entrez manuellement un critère</h2>
                    <h4>Une absence de critères vous montre toutes les données du champ</h4>
                    <!-- Commentaires HTML On construit une liste déroulante ( un select et plusieurs options) Chaque option sera remplie par une donnée SQL récupérée par notre requête PHP -->
                    <form method="post" action="recherche.php"> <select name="champ">
                            <?php 
                            //On se connecte 
                            connectMaBase(); 
                            //On prépare la requête SQL qui récupère les champs 
                            $sql = 'Show fields from films'; 
                            /* On lance la requête (mysql_query) et on impose un message d'erreur si la requête ne passe pas (or die) */ 
                            $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 
                            //On scanne le résultat et on construit chaque option avec 
                            while($data = mysql_fetch_array($req)){ 
                                // on affiche chaque champ 
                                echo '<option name="'.$data['Field'].'">'.$data['Field'].'</option>'; } 
                                //On libère mysql de cette première requête 
                                mysql_free_result ($req); 
                                //On ferme le select 
                                ?>
                        </select> 
                        Entrez votre critère de sélection sur ce champ : <input type="text" name="critere" />
                         <input  type="submit" name="Valider" value="OK" /> 
                        </form> <!-- On ferme le formulaire -->
                    <?php //On traite le formulaire 
                    if(isset($_POST['Valider'])){ $champ=$_POST['champ']; $critere=$_POST['critere']; 
                    // On prépare la requête 
                    //requête différente selon qu'on veut tout le champ 
                    //ou un champ avec une condition 
                    if(($critere=='')||($critere==NULL)){ 
                        $sql='SELECT '.$champ.' FROM films'; } 
                        else{ 
                        $sql = 'SELECT * FROM films WHERE '.$champ.'="'.$critere.'"'; } 
                    /* On lance la requête (mysql_query) et on impose un message d'erreur si la requête ne passe pas (or die)*/ 
                    $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 
                    //Affichage du résultat 
                    echo'<h2>Résultat</h2>';
                     //On scanne chaque résultat et affiche 
                     while($data = mysql_fetch_array($req)){ 
                        /* on affiche les résultats C'est pas très propre mais la fonction print_r vous permet de tout voir sur votre objet tableau : Quand vous êtes complètement perdu sur ce que votre tableau est censé comporter : Tapez cette commande print_r($tableau), vous retrouverez facilement la structure du tableau (index et valeurs)*/
                         print_r($data); 
                         echo'<br/><br/><br/>'; } 
                         //On libère la mémoire mobilisée pour cette seconde requête dans SQL 
                         mysql_free_result ($req); 
                         //On ferme sql 
                         mysql_close (); } ?>
                </section>
            
            
            
            </body>
            
            </html>
    
        

    Prenez le temps d'analiser la page et son fonctionnement

    Étape 8 : Il ne reste plus qu’à construire une page index. html qui appelle ces différentes pages en php…
    A vous de jouer

    Il existe sur internet beaucoup de tutoriel sur ce sujet plus ou moins abordable suivant vos connaissances (ce TP vous donne déjà une première approche) .

    Vous pouvez développer ou reprendre l'architecture en utilisant plusieurs tables pour effectuer des jointures

    J'espère que ça vous a donné des idées de projet 😉