Cours 420-2D7-LL Développement web

*** lundi, 20 avril 2026 --> semaine 12 !!! ***



Semaine 11 - upload+LibGD+Gestion de panier virtuel

 

Télécharger : upload.zip

 

Quelques rappels …

 

Démarrer apache

 

sudo apache2ctl -k start

sudo apache2ctl -k stop

sudo apache2ctl -k restart

 

Au démarrage de linux

 

Ajouter "apache2ctl -k start" à etc/rc.d/rc.local

 

- Inclure le contenu d'un fichier dans une page html

<? include("copyright.txt"); ?>

 

Donner les droits d'accès aux fichiers!

 

Truc

 

Utiliser ' dans les "    -->  echo "<img src='toto.jpg'>";

 

Pour les caractères spéciaux ou reconnue…. Utiliser le backslash       " /" "

 

Passer les variables comme dans un Post:

 

 

PHP

 

$var = case "salut";

return;

@ devant un ligne d'erreur

 

Compléments sur les formulaires

 

Utilisation d'un champ caché de formulaire (HIDDEN)

Pour le savoir, nous allons ajouter un espion, à savoir un champ invisible (HIDDEN), qui va être envoyé en même temps que le nom et le prénom quand l'utilisateur aura cliqué sur le bouton, et il suffit de contrôler si cet espion contient bien une valeur pour se permettre d'engueuler l'utilisateur à bon escient !

Voici le champ de formulaire que vous allons utiliser :

 

<input type="hidden" name="Espion" value="JaiToutVu">

 

La première fois que nous entrons dans le formulaire de saisie, ce champ est évidemment vide, mais dès qu'on clique sur SUBMIT pour recharger la même page, cet espion vaut JaiToutVu.

 

Boutons radio

 

<input type='radio' name='affichage' value=1>choix1<br>
<input type='radio' name='affichage' value=2>choix2<br>
<input type='radio' name='affichage' value=3 checkedchoix3

 

php

$radio1 = $_REQUEST["affichage"];

 
 
Les listes déroulantes

 

<select name="liste">
      <option>Choix 1</option>
      <option>Choix 2</option>
      <option>Choix 3</option>
   </select><br>

 

php

$radio1 = $_REQUEST["liste"];

 


Les cases à cocher

 

<input type="checkbox" name="options[]" value="Injection">Injection<br>

<input type="checkbox" name="options[]" value="Trois">Trois<br>

 

php

$options = $_REQUEST ['options'];

Utiliser count ???


Les listes

<select name="var[]" multiple="yes">

<option value="Val1"> Valeur1</option>

<option value="Val2"> Valeur2</option>

<option value="Val3"> Valeur3</option>

</select>

 

php

$options = $_REQUEST ['var'];

Utiliser count ???

 

 

Transfert d'un fichier sur le serveur

 

 

<HTML>
<HEAD>
<TITLE>Fichier de test Upload</TITLE>
</HEAD>
<BODY>
Fichier de test Upload
<form method="post" action="upload.php" enctype="multipart/form-data">
<p>Exemple : Quelle fichier voulez-vous me transmettre ?</p>
<p>Votre fichier :<br>
<input type="hidden" name="MAX_FILE_SIZE" value="0">
<input type="file" name="fichier"><br><br>
</p>
<input type="submit" name="Submit" value="R-Envoyer le fichier">
</form>
 
</BODY>
</HTML>
 
PHP
<?php
function code()
{
                         echo "<br> 0= réussi, 1= taille du fichier trop grande selon php.ini";
                         echo "<br> 2= taille du fichier trop grande selon formulaire, 3= partiellement transmis, 4= fichier non transmis";
}                       
//chemin pour l'enregistrement du fichier
// E:/Mes Document/2F7/upload/
$dir = "/var/mers/upload/";    //  /var/mers/php/chap23/Sources/photos/
//si le fichier existe
if (isset($_FILES["fichier"])){
                         echo "Upload du fichier ". $_FILES["fichier"]["name"] . " en cours...<P>";
}
//copie du fichier du dossier temporaire au bon endroit
if ( @copy($_FILES["fichier"]["tmp_name"],$dir.$_FILES["fichier"]["name"])){
                         echo "Transmission réussis!!!<BR>dans le dossier ".$dir." <P>";
                         echo "Code d'erreur=".$_FILES["fichier"]["error"];
                         code();
}
 
else {
                         echo "Transmission non-réussis !@%*&**¾*$!<P>";
                         echo "Code d'erreur=".$_FILES["fichier"]["error"];
                         code();
}
 
?>
                         <HTML>
                         <HEAD>
                         <TITLE>Fichier de test</TITLE>
                         </HEAD>
                         <BODY>
                         <CENTER>
                         <A HREF="upload.html">Page upload.html</A>
                         </CENTER>
                         </BODY>
                         </HTML>
 
 

DEMO : https://php.dinf.ca/cours/upload.html

 

 

 


 

 

Télécharger : gd.zip

 

Les fonctions et la librairie GD

 

apt-get install php7.?-gd

dans php.ini, vérifier la présence de la ligne suivante: extension = gd.so ou gd2.so selon la version !!!

 

function miniature( $imgSrc, $nomImage){

. . .

return $nomImage;

}

. . .

$toto = miniature( $imgSrc[$i], $nomImage);

 

 

<?php

 

/************************************************************/

/* La fonction miniature crée à la volée l'image miniature  */

/************************************************************/

 

function miniature( $imgSrc, $nomImage){

   // Largeur et hauteur des images miniatures

   $largeur = 200; $hauteur=150;

 

 

   // quelle taille fait notre image ?

   $largeurSrc = imagesx($imgSrc);

   $hauteurSrc = imagesy($imgSrc);

  

   // Création de l'image miniature en essayant de respecter le format portrait ou paysage

   if($hauteurSrc > $largeurSrc){

      $l = $hauteur; $h = $largeur;

      $lSrc = $hauteurSrc; $hSrc = $largeurSrc;

   } else{

      $l = $largeur; $h = $hauteur;

      $lSrc = $largeurSrc; $hSrc = $hauteurSrc;

   }

   $mini = @ImageCreateTrueColor ($l, $h);

 

   // Création de quelques couleurs pour le cadre de la miniature

   $blanc = ImageColorAllocate ($mini, 255, 255, 255);

   $gris[0] = ImageColorAllocate ($mini, 90, 90, 90); 

   $gris[1] = ImageColorAllocate ($mini, 110, 110, 110);        

   $gris[2] = ImageColorAllocate ($mini, 130, 130, 130); 

   $gris[3] = ImageColorAllocate ($mini, 150, 150, 150); 

   $gris[4] = ImageColorAllocate ($mini, 170, 170, 170); 

   $gris[5] = ImageColorAllocate ($mini, 190, 190, 190); 

   $gris[6] = ImageColorAllocate ($mini, 210, 210, 210); 

   $gris[7] = ImageColorAllocate ($mini, 230, 230, 230); 

 

   // Dessin du cadre de la miniature

   for ($i=0; $i<=7; $i++) {

     ImageFilledRectangle ($mini, $i, $i, $l-$i, $h-$i, $gris[$i]);

   }

  

   // On ressample l'image initiale pour en créer une copie en miniature

   ImageCopyResampled($mini, $imgSrc, 8, 8, 0, 0, $l-(2*8), $h-(2*8), $lSrc, $hSrc);

 

   // On écrit en blanc en bas à gauche le nom et la taille de l'image d'origine

   ImageString($mini, 0, 12, $h-18, "$nomImage - ($lSrc x $hSrc)", $blanc);

  

   // On enregistre l'image dans le répertoire des miniatures

   imageJpeg ( $mini,"mini/$nomImage.jpg");

   return $nomImage;

}

 

 

 

?><html>

   <head>

      <title>Album photo</title>

   </head>

  

   <body>

      <center>

      <h1>Album photos de Mers</h1>

     

      <?php

         /********************************************/

         /* Définition des constantes pour le script */

         /********************************************/

        

         // Répertoire dans lequel sont situées les différentes photos

         $imageDir = "photos";

         $i=0;

                     $c=1;

        

         /*************************************/

         /* Affichage des images dans la page */

         /*************************************/

         echo "<table border=0>";

         $dossier = opendir("$imageDir");

         while($image = readdir($dossier)){

                        $i=$i+1;

                       

            $info = pathinfo($image);

                     

            $extension = strtolower ( $info["extension"]);

          

            $nomImage = substr($image,0,strrpos($image,"."));

          

            switch($extension){

               case "jpg":

                  $imgSrc[$i] = imagecreatefromjpeg("$imageDir/$image");

                  break;

               case "png":

                  $imgSrc = imagecreatefrompng("$imageDir/$image");

                  break;

               case "gif":

                  $imgSrc = imagecreatefromgif("$imageDir/$image");

                  break;

               default:

                  unset($imgSrc);

                  break;

            }

           

            if(isset($imgSrc[$i])){ // Sinon il ne s'agit pas d'un type d'image supporté par notre application

               if ($c>3){

                                       $c = 1;

                                       echo "<tr>";

                                       }

                           echo "<td>";

                           $c++;

               // Affichage de l'image miniature dans la page (X)Html

                          printf ("<a href="%s/%s" target="Photos"><img src="./mini/%s.%s" alt="Miniature générée dynamiquement" /></a>", $imageDir,$image, miniature( $imgSrc[$i], $nomImage),$extension);

                           echo "</td>";

            }           

         }   

      ?>

   </table>

   </center>

   </body>

</html>

 

 

 

DEMO : https://php.dinf.ca/cours/chap23/Sources/c23-01a.php

 


 

Télécharger : Panier Virtuel.zip

 

 

Panier virtuel

 

Le panier virtuel ou « caddy », est le dispositif d'un site de commerce électronique dans lequel se retrouvent tous les articles sélectionnés durant la visite du site. Il reprend les détails de ces articles et calcule les taxes et totaux de commandes. Il se transforme en commande au moment de sa validation.

 

 

3 types de Panier:

 

1.    En local, sur le FRONTEND avec javaScript et ses dérivées. Panier temporaire. (Rappel, cours de session 1 = Interfaces web)

2.    Sur le serveur BACKEND avec les variables SESSION. Panier temporaire.

3.    Sur le serveur BACKEND avec les tables d'une base de données. Permanent si désiré!

 

NOTE: Plusieurs disponible sur internet (gratuit et payant)


 

Exemple très, très, très  simple avec les sessions:

 

Avec un serveur BACKEND apache, PHP et MySql.

 

liste.php (liste des articles disponible pour l'achat)

 

liste.php


<HTML>
<HEAD>
<TITLE>Fichier de test Liste des Voitures Sport</TITLE>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</HEAD>
<BODY>
<CENTER>
    <?php

    /**
     * Renvoie la liste des voitures dans $con
     */
    require 'connecter_angular.php';
    

    /* affichage sélection */
    /*avec mysqli */
    $query2 = "SELECT * FROM voiture_sport ORDER BY id;";
    $result2 = $con->query($query2);


    echo "Contenue de la table Voiture_sport!!!<P>";
    
    /* Utilisez une boucle pour afficher dans un tableau */
    echo "<TABLE border=1>";
    echo "<TR>"."<TD>"."id"."<TD>"."Voiture"."<TD>"."Disponible ou Non"."</TR>";
    
    while ($val = $result2->fetch_assoc()){

    $bouton = "<a href='panier.php?action=ajouter&id=".$val["id"]."&nom=".$val["nom"]."&disponible="
        .$val["statut"]."' onclick='window.open(this.href, '', 'toolbar=no, location=no, directories=no, status=yes, scrollbars=yes, resizable=yes, copyhistory=no, width=600, height=350'); return false;'>Ajouter au panier</a>";

        
        echo "<TR>"."<TD>".$val["id"]."<TD>".$val["nom"]."<TD>"
        .$val["statut"]."<TD>".$bouton."</TR>";
        //echo "<TR>"."<TD>".$val["id"]."<TD>".utf8_encode($val["nom"])."<TD>"
        //.utf8_encode($val["statut"])."</TR>";
    }

    echo "</TABLE>";

    /* déconnection avec MySQLi */
    $result2->free();
    $con->close();

//    break;

//    default:
//    echo "Ne fonctionne pas!!!";

//<textarea name="description" ROWS=1 COLS=60></textarea>    
    ?>
<P><A HREF="panier.php">Voir le Panier !!!</A><P> 
</CENTER>
</BODY>
</HTML>


panier.php (panier)

 


<?php
session_start();
include_once("fonctions-panier.php");

@$action = $_REQUEST['action'];
@$id = $_REQUEST['id'];
@$nom = $_REQUEST['nom'];
@$disponible = $_REQUEST['disponible'];




   switch($action){
      Case "ajouter":
         ajouterArticle($id,$nom,$disponible);
         break;

      Case "suppression":
         supprimerArticle($id);
         break;

      Case "refresh" :
         for ($i = 0 ; $i < count($_SESSION['panier']['id']) ; $i++)
         {
            //modifierQTeArticle($_SESSION['panier']['id'][$i],round($QteArticle[$i]));
         }
         break;

      Default:
         break;
   }


echo '<?xml version="1.0" encoding="utf-8"?>';?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<title>Votre panier</title>
</head>
<body>

<form method="post" action="panier.php">
<table style="width: 600px">
    <tr>
        <td colspan="4">Votre panier</td>
    </tr>
    <tr>
        <td>id</td>
        <td>nom</td>
        <td>disponible?</td>
        <td>Action</td>
    </tr>


    <?php
    if (creationPanier())
    {
       $nbArticles=count($_SESSION['panier']['id']);
       if ($nbArticles <= 0)
       echo "<tr><td>Votre panier est vide </ td></tr>";
       else
       {
          for ($i=0 ;$i < $nbArticles ; $i++)
          {
             echo "<tr>";
             echo "<td>".htmlspecialchars($_SESSION['panier']['id'][$i])."</ td>";
             //echo "<td><input type="text" size="4" name="q[]" value="".htmlspecialchars($_SESSION['panier']['nom'][$i]).""/></td>";
             echo "<td>".htmlspecialchars($_SESSION['panier']['nom'][$i])."</td>";
         echo "<td>".htmlspecialchars($_SESSION['panier']['disponible'][$i])."</td>";
             echo "<td><a href="".htmlspecialchars("panier.php?action=suppression&id=".rawurlencode($_SESSION['panier']['id'][$i]))."">Supprimer</a></td>";
             echo "</tr>";
          }

          echo "<tr><td colspan="2"> </td>";
          echo "<td colspan="2">";
          echo "Total : ".MontantGlobal()." $";
          echo "</td></tr>";

          echo "<tr><td colspan="4">";
          echo "<input type="submit" value="Rafraichir"/>";
          echo "<input type="hidden" name="action" value="refresh"/>";

          echo "</td></tr>";
       }
    }
    ?>
</table>
</form>
<P><A HREF="liste.php">Retour aux achats !!!</A><P>
</body>
</html>

fonctions-panier.php (contient les fonctions…)

 <?php

/**
 * Verifie si le panier existe, le crée sinon
 * @return booleen
 */
function creationPanier(){
   if (!isset($_SESSION['panier'])){
      $_SESSION['panier']=array();
      $_SESSION['panier']['id'] = array();
      $_SESSION['panier']['nom'] = array();
      $_SESSION['panier']['disponible'] = array();
      $_SESSION['panier']['verrou'] = false;
   }
   return true;
}


/**
 * Ajoute un article dans le panier
 * @param string $id
 * @param string $nom
 * @param string $disponible
 * @param float $prixProduit
 * @return void
 */
function ajouterArticle($id,$nom,$disponible){

   //Si le panier existe
   if (creationPanier() && !isVerrouille())
   {
      //Si le produit existe déjà on ajoute seulement la quantité
      $positionProduit = array_search($id,  $_SESSION['panier']['id']);

      if ($positionProduit !== false)
      {

      }
      else
      {
         //Sinon on ajoute le produit
         array_push( $_SESSION['panier']['id'],$id);
         array_push( $_SESSION['panier']['nom'],$nom);
         array_push( $_SESSION['panier']['disponible'],$disponible);
      }
   }
   else
   echo "Un problème est survenu veuillez contacter l'administrateur du site.";
}


/**
 * Supprime un article du panier
 * @param $id
 * @return unknown_type
 */
function supprimerArticle($id){
   //Si le panier existe
   if (creationPanier() && !isVerrouille())
   {
      //Nous allons passer par un panier temporaire
      $tmp=array();
      $tmp['id'] = array();
      $tmp['nom'] = array();
      $tmp['disponible'] = array();
      $tmp['verrou'] = $_SESSION['panier']['verrou'];

      for($i = 0; $i < count($_SESSION['panier']['id']); $i++)
      {
         if ($_SESSION['panier']['id'][$i] !== $id)
         {
            array_push( $tmp['id'],$_SESSION['panier']['id'][$i]);
            array_push( $tmp['nom'],$_SESSION['panier']['nom'][$i]);
        array_push( $tmp['disponible'],$_SESSION['panier']['disponible'][$i]);
         }

      }
      //On remplace le panier en session par notre panier temporaire à jour
      $_SESSION['panier'] =  $tmp;
      //On efface notre panier temporaire
      unset($tmp);
   }
   else
   echo "Un problème est survenu veuillez contacter l'administrateur du site.";
}


/**
 * Montant total du panier
 * @return int
 */
function MontantGlobal(){
   $total=0;
   for($i = 0; $i < count($_SESSION['panier']['id']); $i++)
   {
      $total += $_SESSION['panier']['id'][$i];
   }
   return $total;
}


/**
 * Fonction de suppression du panier
 * @return void
 */
function supprimePanier(){
   unset($_SESSION['panier']);
}

/**
 * Permet de savoir si le panier est verrouillé
 * @return booleen
 */
function isVerrouille(){
   if (isset($_SESSION['panier']) && $_SESSION['panier']['verrou'])
   return true;
   else
   return false;
}

/**
 * Compte le nombre d'articles différents dans le panier
 * @return int
 */
function compterArticles()
{
   if (isset($_SESSION['panier']))
   return count($_SESSION['panier']['id']);
   else
   return 0;

}

?>

 

 

DEMO : https://php.dinf.ca/projet/h2026/Mers2/browser/panier/liste.php

 

 


   

Voici mes coordonnees: Stéphane Mercier (Mers), stephane.mercier@cegeplevis.ca, 418 833-5110, poste 5511, Local G205A (disponnible par MIO)

Tout droit réservé à personne !!!

.