Backend

Par défaut

Étape 1 : Formulaire complet de sélection des articles et de coordonnées bancaires

Étape 2 : Suivi des commandes dans l’interface d’administration

Le formulaire du panier d’achat envoie un tableau : on traite les données et on les enregistre dans la base.

if($_POST) {
    $tee = $_POST['tee'];
    $q_tee = $_POST['q_tee'];
    $hoo = $_POST['hoo'];
    $q_hoo = $_POST['q_hoo'];
    $carte = $_POST['carte'];
    $titulaire = $_POST['titulaire'];
    $numero = $_POST['numero'];
    $crypto = $_POST['crypto'];
    $mois = $_POST['mois'];
    $annee = $_POST['annee'];

    
    // ENREGISTREMENT
    $sql= "INSERT INTO panier VALUES ('','$tee','$q_tee','$hoo','$q_hoo','$carte','$titulaire','$numero','$crypto','$mois','$annee',now() );";
    $exec = mysqli_query($connect,$sql);
            if(!$exec) {
                $notifications .= '<p class="ko">Enregistrement : KO</p>';
            }
            else {
                $notifications .= '<p class="ok">Enregistrement : OK</p>';
            }
}

Après, on affiche la requête SELECT * dans un tableau. PHP nous permet de créer les lignes du tableau avec une boucle while().

<?php
$sql = 'SELECT * FROM panier ORDER BY id DESC';
$exec = mysqli_query($connect,$sql);
?>
<table width="100%" border="1" align="center" cellpadding="0" cellspacing="0">
    <thead>
        <tr>
            <th>ID</th>
            <th>Time</th>
            <th>T-shirt</th>
            <th>nb tee</th>
            <th>Hoodie</th>
            <th>nb hoo</th>
            <th>carte</th>
            <th>Titulaire</th>
            <th>numéro</th>
            <th>crypto</th>
            <th>mois</th>
            <th>année</th>
            <th>total</th>
        </tr>
    </thead>
    <tbody>
        <?php
while($data=mysqli_fetch_assoc($exec)) {
            echo '<tr>';
            echo '<th>'.$data['id'].'</th>';
            echo '<td>'.$data['timestamp'].'</td>';
            echo '<td><span class="'.$data['tee'].'">'.$data['tee'].'</span></td>';
            echo '<td>'.$data['q_tee'].'</td>';
            echo '<td><span class="'.$data['hoo'].'">'.$data['hoo'].'</span></td>';
            echo '<td>'.$data['q_hoo'].'</td>';
            echo '<td>'.$data['carte'].'</td>';
            echo '<td>'.$data['titulaire'].'</td>';
            echo '<td>'.$data['numero'].'</td>';
            echo '<td>'.$data['crypto'].'</td>';
            echo '<td>'.$data['mois'].'</td>';
            echo '<td>'.$data['annee'].'</td>';
            $total= '0';
            if($data['tee']!='' || $data['hoo']!='') {
            $total = ($data['q_tee'] *20) + ($data['q_hoo'] *35);
            }
            echo '<td';
            if($total<'1') echo ' class="empty"';
            echo '>'.$total.'€</td>';
            echo '</tr>';

    }
    ?>
    </tbody>
</table>

Administration

Par défaut

Étape 1 : on saisit une adresse dans le formulaire

Étape 2 : on enregistre l’adresse dans la base de données

Étape 3 : on gère les adresses saisies (modification/suppression)

On interroge la base de données et on récupère toutes les informations (*)

$sql = "SELECT * FROM newsletter";
$exec = mysqli_query($connect,$sql);

On fait une boucle avec les résultats (fonction while)

while($data=mysqli_fetch_assoc($exec)) {
    echo '<p><strong>'.$data['email'].'</strong> : ';
    echo '<a href="?email='.$data['email'].'&action=delete">delete</a> / ';
    echo '<a href="?old_email='.$data['email'].'&action=update">update</a></p>';
}

En cliquant sur un des deux liens, on transmet un tableau $_GET via l’URL : ?email=test@exemple.fr&action=delete

if(isset($_GET['action'])) {
    if($_GET['action']=='delete') {
        $email = $_GET['email'];
        $sql="DELETE FROM newsletter WHERE email = '$email'";
        $exec = mysqli_query($connect,$sql) or die('<p class="ko">Effacement email : KO</p>');
        $notifications .= '<p>L\'email '.$_GET['email'].' a été supprimé</p><p><a href="03-news-admin.php">Rechargez la page</a></p>'; 
}

Et pour la modification

    elseif($_GET['action']=='update') {?>
<form id="update" method="POST" action="03-news-admin.php">
    <p><label for="new_email">Nouvelle adresse</label>
    <input type="email" id="new_email" name="new_email" placeholder="Veuillez saisir la nouvelle adresse"></p>
    <input type="hidden" name="old_email" value="<?php echo $_GET['old_email']?>">
    <input type="submit" value="Je modifie">
</form>
        <?php
    }
}

On envoie de nouvelles informations via $_POST

if(isset($_POST['new_email'])) {
    $sql="UPDATE newsletter SET email='".$_POST['new_email']."' WHERE email = '".$_POST['old_email']."'";
    if(!mysqli_query($connect,$sql)) echo('<p class="ko">Modification email : KO<br/>'.$sql.'</p>');
    $notifications .= '<p class="ok">L\'email '.$_POST['new_email'].' a été modifié';     
}

Il faut maintenant assembler les différentes étapes : VERSION COMPLETE

<article>
<h1>ADMIN NEWSLETTER</h1>
<?php
// 1, CONNEXION
$host = "localhost";
$usr = "root";
$bdd = "form";
$pwd  = "";
$notifications = '';
$connect=mysqli_connect($host, $usr,$pwd, $bdd) or die('<p class="ko">Connexion serveur/bdd : KO</p>');
$notifications .= '<p class="ok">Connexion serveur/bdd : OK</p>';
mysqli_query($connect,"SET NAMES 'utf8'");

// 2, ON EXECUTE les INSTRUCTIONS GET
if(isset($_GET['action'])) {
    if($_GET['action']=='delete') {
// 2a, DELETE
        $email = $_GET['email'];
        $sql="DELETE FROM newsletter WHERE email = '$email'";
        $exec = mysqli_query($connect,$sql) or die('<p class="ko">Effacement email : KO</p>');
        $notifications .= '<p>L\'email '.$_GET['email'].' a été supprimé</p><p><a href="03-news-admin.php">Rechargez la page</a></p>'; 
    }
// 2b, FORM UPDATE
    elseif($_GET['action']=='update') {
        ?>
            <form id="update" method="POST" action="03-news-admin.php">
                <p><label for="new_email">Nouvelle adresse</label><input type="email" id="new_email" name="new_email" placeholder="Veuillez saisir la nouvelle adresse"></p>
                <input type="hidden" name="old_email" value="<?php echo $_GET['old_email']?>">
<input type="submit" value="Je modifie">
            </form>
        <?php
    }
}

// 2c,     ON EXECUTE LES INSTRUCTIONS POST SI ON RECOIT UNE MODIFICATION D'ADRESSE
if(isset($_POST['new_email'])) {
    $sql="UPDATE newsletter SET email='".$_POST['new_email']."' WHERE email = '".$_POST['old_email']."'";
    if(!mysqli_query($connect,$sql)) echo('<p class="ko">Modification email : KO<br/>'.$sql.'</p>');
    $notifications .= '<p class="ok">L\'email '.$_POST['new_email'].' a été modifié';     
}
// 3, SINON, ON INTERROGE la BDD DANS SON ENSEMBLE
    $sql = "SELECT * FROM newsletter";
    $exec = mysqli_query($connect,$sql);
    
// 3, ON AFFICHE les RESULTATS
    while($data=mysqli_fetch_assoc($exec)) {
        echo '<p><strong>'.$data['email'].'</strong> : <a href="?email='.$data['email'].'&action=delete">delete</a> / <a href="?old_email='.$data['email'].'&action=update">update</a></p>';
    }
    echo $notifications;

?></article>

Enregistrement

Par défaut

Étape 1 : Les données proviennent de 01-news-inscription.php

Étape 2 : on enregistre l’email enregistré

Le tableau $_POST

// ON RECUPERE LA VALEUR
$email = $_POST['email'];

Identifiants de connexion à changer selon votre serveur (d’évaluation)

// 1, CONNECTION
$host = "localhost";
$usr = "root";
$bdd = "form";
$pwd  = "";
$link = mysqli_connect($host, $usr,$pwd, $bdd);

On vérifie si l’email saisi est déjà enregistré. S’il est enregistré,  le résultat de la requête contiendra au moins une ligne ( > 0 )

$sql = "SELECT email FROM newsletter WHERE email ='$email'";
$exec = mysqli_query($link,$sql);
if(mysqli_num_rows($exec) > 0) {
    echo '<p>Email déjà enregistré</p>';
}

Si l’email n’existe pas, on l’enregistre

else {
    $sql = "INSERT INTO newsletter VALUES ('$email');";
    $exec = mysqli_query($link,$sql);
}

Opération de calcul en SQL avec COUNT(), fonction de test sur l’exécution avec or die () et interrogation du tableau associatif avec mysqli_fetch_array() et $nb[0]

$sql = "SELECT COUNT(email) FROM newsletter";
$exec = mysqli_query($link,$sql) or die("COUNT() IMPOSSIBLE");
$nb = mysqli_fetch_array($exec);
echo '<p>NB enregistrements : '.$nb[0].'</p>';

VERSION COMPLETE

<article>
<h1>ENREGISTREMENT NEWSLETTER</h1>
<?php
$notifications = '';
if(!$_POST) {
    $notifications .= '<p class="ko">Aucune adresse saisie : <a href="01-news-inscription.php">veuillez recommencer</a></p>';
}
else {
    // ON RECUPERE LA VALEUR
    $email = $_POST['email'];
    
    // ON VERIFIE LA VALEUR : FORMAT MAIL ?
    
    
    // ON AFFICHE LA VALEUR
    $notifications .=  '<p class="email">Email : '.$email.'</p>';
    
    /* ON ENREGISTRE LA VALEUR dans la BDD
     1, on se connecte à la bdd
     2, on enregistre la valeur dans la table
     3, on se déconnecte
     4, on notifie
     */    
     
    // 1, CONNECTION
    $host = "localhost";
    $usr = "root";
    $bdd = "form";
    $pwd  = "";
    $link = mysqli_connect($host, $usr,$pwd, $bdd); // extensions MySQLI en mode procédural depuis PHP 5.5.0
    if(!$link) {
        $notifications .= '<p class="ko">Connexion serveur : KO</p>';
    }
    else {
        $notifications .= '<p class="ok">Connexion serveur : OK</p>';
        mysqli_query($link,"SET NAMES 'utf8'");
        $notifications .= '<p class="ok">Connexion BDD : OK</p>';    
        // 2,ENREGISTREMENT
        // ON VERIFIE L'ENREGISTREMENT
        $sql = "SELECT email FROM newsletter WHERE email ='$email'";
        $exec = mysqli_query($link,$sql);
        if(!$exec) {
            $notifications .= '<p class="ko">VERIFICATION EMAIL : KO</p>';
        }
        elseif(mysqli_num_rows($exec)>0) {
            $notifications .= '<p class="ko">Email déjà enregistré : <a href="01-news-inscription.php">veuillez en choisir un autre</a></p>';
        }
        else {
            $sql = "INSERT INTO newsletter VALUES ('$email');";
            $exec = mysqli_query($link,$sql);
            if(!$exec) {
                $notifications .= '<p class="ko">Enregistrement : KO</p>';
            }
            else {
                $notifications .= '<p class="ok">Enregistrement : OK</p>';
            }
        }
    // 3, DECONNECTION
     
    // 4, NOTIFICATION
    // 5, STATISTIQUES : NB ENREGISTREMENTS
        $sql = "SELECT COUNT(email) FROM newsletter";
        $exec = mysqli_query($link,$sql) or die("COUNT() IMPOSSIBLE");
        $nb = mysqli_fetch_array($exec);
        $notifications .=  '<p class="nb">NB ENREGISTREMENTS : '.$nb[0].'</p>';
    }
}

echo $notifications;
?>
<p><a href="01-news-inscription.php">Nouvel enregistrement</a></p>
</article>

Étape 3 :  Interface d’administration des emails enregistrés

Le modèle relationnel

Par défaut

Modélisation des données

  • modèle sémantique : dictionnaire des données (ex. : Facebook)
  • Dictionnaire de données garage automobile
  • modèle relationnel : relation entre l’entité et ses attributs
  • modèle conceptuel : répartition des champs dans les tables
  • modèle logique : relation entre les champs et les tables (cardinalités : 1:1, 1:N)
  • modèle physique : implémentation en SQL du modèle logique dans le SGBDR

Vocabulaire

  • champ, colonne
  • enregistrement, tuple, n-uplets
  • entité, attribut, clé primaire, clé secondaire

Exemple

R1 CLIENT (#NumCli, NomCli, AdresseCli, CPCli, VilleCli)
R2 COMMANDE (#NumCom, DateCom, NumCli#)
R3 COMPRENDRE (NumCom#, RefProd#, Quantite
R4 PRODUIT (#RefProd, DesignProd, PUProd)
  • 1 ligne = 1 relation (qui décrit une entité)
  • 4 lignes = modèle relationnel
  • CLIENT = nom de la relation (toujours en MAJUSCULE)
  • (…) = attribut atomisé (séparé par des virgules, pas d’espace entre les mots, des majuscules)
  • #NumCli = clé primaire (ni vide, ni doublon ; 1er attribut)
  • NumCli# = clé étrangère
  • NumCom#, RefProd# = clé concaténée (les 2 clés étrangères sont soulignées = clé primaire)

Les contraintes

  • intégrité de domaine : numérique (entier), texte, monétaire, booléen, date, etc..
  • intégrité de relation : clé primaire avec un Null ou un doublon
  • intégrité de référence : clé secondaire saisie sans référence équivalente en clé primaire

Les dépendances fonctionnelles

  • Dépendance fonctionnelle directe : si la connaissance d’un attribut permet d’accéder à toutes les informations, alors cet attribut devient la clé primaire (#NumCli)
  • Dépendance fonctionnelle entre 2 relations : la connaissance d’un attribut (clé primaire) dans une relation permet d’avoir accès à une autre relation via la clé étrangère (cf. #NumCom et NumCli#)
  • Dépendance fonctionnelle composée : si la connaissance d’un attribut clé primaire dans 1 relation et la connaissance d’un attribut primaire dans 1 autre relation permettent d’avoir accès à un 3ème attribut (NumCom#, RefProd# → Quantite)

Les formes normales

  • 1FN : tous les attributs sous forme atomique (non divisible) et singulière (pas de valeurs multiples) + clé primaire (SALARIE + diplômes)
  • 2FN : 1FN + tous les attributs non clés dépendent d’1 identifiant
LIGNE_FACT (NumFact#, RefProd#, Q) + DateFact et NomCli
  • Solution
R1 : FACTURE (<#NumFact, DateFact, NomCli)
R2 : LIGNE_FACT (NumFact#, RefProd#, Q)
  • 3FN : 2FN + tous les attributs dépendent directement d’1 identifiant
R1 : FACTURE (#NumFact, DateFact, NomCli)
R2 : LIGNE_FACT (NumFact#,RefProd#, Q)
  • Question : de qui dépend NomCli ? Comment ajouter les adresses des clients.
R1 : CLIENT (#NumCli, NomCli, AdresseCli, CPCli, VilleCli)
R2 : FACTURE (#NumFact, DateFact, NumCli#)
R3 : LIGNE_FACT (NumFact#, RefProd#, Q)

Algèbre relationnelle

  • opérations réalisées sur les ensembles de données en relation : union, intersection, division, produit cartésien, différence, jointure
  • opérateurs : projection, restriction, jointure

Exercice

  • Réalisez la base de données d’un gestionnaire des tâches (exemple avancé : Remember the milk !)

SQL

Par défaut

Voire le modèle relationnel pour la construction de la base

Syntaxe générale

SELECT champ1, champ2
FROM table
WHERE champ3="critère"
ORDER BY champ4 ASC
LIMIT 5

En PHP, il faudra construire la requête, puis l’exécuter

$sql = "SELECT * from TABLE";
$exec = mysql_query($sql)

INSERTION

INSERT INTO TABLE VALUES ('donnée1','donnée2')

SUPPRESSION

DELETE FROM TABLE WHERE champ1 = 'critère'

Plus d’infos avec w3schools