Gilbert1.png

PHP et MySql, les outils côté serveur

Un langage serveur et une base de données pour parfaire votre site web

Vous n'avez besoin d'aucun logiciel payant pour créer votre site
Dans ces pages vous apprendrez à manier le code PHP et la base de données MySql, des outils gratuits pour parfaire votre site web...

Mon site web étape par étape

Mon code PHP et ma base de données MySql

BoutonPrecedent BoutonSommaire BoutonSuite Cette page s'affiche mal ? - cliquez ici   

Dans ces pages vous apprendrez à manier le code PHP et la base de données MySql, des outils gratuits pour parfaire votre site web...

Si des erreurs se sont glissées dans le texte n'hésitez pas à me contacter...
Les liens ci-dessous vous renverront au chapitre correspondant.


ÉTAPE 10 : Dynamiser mon site avec PHP

10.1 Un serveur web sur votre machine personnelle

      10.1.1 Téléchargement de Wamp server
      10.1.2 Détails de votre installation

10.2 Pour commencer

      10.2.1 À quoi sert le PHP
      10.2.2 Balises d'ouverture - fermeture
      10.2.3 Commentaires
      10.2.4 Le point virgule
      10.2.5 Apostrophes et guillemets

10.3 Variables et constantes

      10.3.1 Les $variables
      10.3.2 Les CONSTANTES

10.4 Quelques Gadgets pour se familiariser

      10.4.1 Afficher la date du jour
      10.4.2 Validité d’une date saisie
      10.4.3 Temps d’exécution d’un script php
      10.4.4 Récupérer mon adresse IP

10.5 Les opérateurs

      10.5.1 Les opérations
      10.5.2 Le Modulo '$a % 2 ;'
      10.5.3 Opérateurs d'incrémentation
      10.5.4 Opérateurs de concaténation
      10.5.5 Opérateurs de comparaison
      10.5.6 Opérateurs logiques

10.6 Les tableaux

      10.6.1 Les tableaux indexés
      10.6.2 Les tableaux associatifs
      10.6.3 Tableau de tableau, panier d’articles
      10.6.4 Matrices

10.7 Tests de base

      10.7.1 L’instruction if else elseif
      10.7.2 L’instruction switch

10.8 Les boucles

      10.8.1 La boucle WHILE
      10.8.2 La boucle DO WHILE
      10.8.3 La boucle FOR
      10.8.4 La boucle FOREACH
      10.8.5 Les instructions break et continue

10.9 Les fonctions utilisateurs

      10.9.1 Déclaration d’une fonction utilisateur
      10.9.2 Le mot-clé return
      10.9.3 Déclaration et appel d’une fonction
      10.9.4 Convertisseur en Euros
      10.9.5 Passage des arguments (visibilité et portée des variables)
      10.9.6 Passage des arguments par copie
      10.9.7 Passage des arguments par référence

10.10 Sécurité des formulaires

      10.10.1 Caractères spéciaux : urlencode, urldecode
      10.10.2 Sécurité des champs texte : htmlentities
      10.10.3 Sécurité des champs texte : failles d'injection de headers de mail

10.11 Les formulaires

      10.11.1 Création d’un formulaire en HTML : <form>…</form>
      10.11.2 Où vont les données : action
      10.11.3 Transmission des données : methode GET
      10.11.4 Transmission des données : methode POST
      10.11.5 Comment entrer les données dans le formulaire : balise <input>
      10.11.6 Les boutons : input type="button"
      10.11.7 Des boutons graphiques
      10.11.8 Zone de saisie de texte : input type="text"
      10.11.9 Champs pour mots de passe : input type="password"
      10.11.10 Champs cachés : input type="hidden"
      10.11.11 Taille de la saisie et du texte : size, maxlength, <textarea>…</textarea>
      10.11.12 Cases à cocher : input type="checkbox"
      10.11.13 Boutons radio : input type="radio"
      10.11.14 Liste de sélection déroulante : <select>…</select>
      10.11.15 Envoi de fichiers et d’images : input type="file"
      10.11.16 Une calculatrice

10.12 Formulaires d’envoi de mails

      10.12.1 Un envoi de mail tout simple
      10.12.2 Un envoi de mail qui récupère les données d’un formulaire
      10.12.3 Un envoi de mail complet qui teste la validité des champs

10.13 Les fichiers

      10.13.1 Inclure les données d’un fichier texte : include() ou include_once()
      10.13.2 Lecture d’un fichier texte : file_get_contents() ou file()
      10.13.3 Lecture d’un fichier de configuration : parse_ini_file()
      10.13.4 Lecture d’un fichier CSV issu d’un tableur : fgetcsv()
      10.13.5 Ecriture dans un fichier : file_put_contents()
      10.13.6 Ouverture d’un fichier : fopen()
      10.13.7 Verrouillage d’un fichier : flock()
      10.13.8 Tronquer un fichier : ftruncate()
      10.13.9 Fermer un fichier : fclose()
      10.13.10 Lire un fichier : fread()
      10.13.11 Ecrire dans un fichier : fwrite()
      10.13.12 Taille d’un fichier : filesize()

10.14 Fichiers et gestion documentaire

      10.14.1 Le formulaire
      10.14.2 La page de récupération des données

10.15 Les cookies

      10.15.1 Ecriture et lecture d’un cookie : setcookie(), $_COOKIE[]
      10.15.2 Suppression d’un cookie : setcookie(), sans valeur
      10.15.3 Enregistrer dans un cookie les données d’un formulaire
      10.15.4 Enregistrer dans un cookie le nombre de visites d’un visiteur
      10.15.5 Personnaliser l’interface graphique de la page à l’aide d’un cookie

10.16 Les sessions

      10.16.1 Comment marche une session
      10.16.2 Lecture et écriture de sessions
      10.16.3 Suppression d’une session : session destroy();
      10.16.4 Autres instructions (facultatives)
      10.16.5 Quelques règles de sécurité

10.17 Utiliser une base de données MySQL

      10.17.1 La structure d'une base de données
      10.17.2 Les formats des données en MySQL
      10.17.3 Les opérateurs de MySQL
      10.17.4 PhpMyAdmin
      10.17.5 Créer une base de données MySQL avec PhpMyAdmin
      10.17.6 Créer des tables dans une base de données MySQL avec PhpMyAdmin
      10.17.7 Les types de champs MySQL (PhpMyAdmin)
      10.17.8 Insérer un enregistrement de données avec PhpMyAdmin
      10.17.9 Ajouter un champ à une table avec PhpMyAdmin

10.18 Utiliser MySql depuis PHP

      10.18.1 Créer un utilisateur administrateur
      10.18.2 Se connecter à la base de données MySql depuis PHP
            10.18.2 - 1) Connexion MySQL - méthode orientée objet (PDO)
            10.18.2 - 2) Connexion MySQL - méthode procédurale (mysqli)
      10.18.3 Afficher le contenu d'une table depuis PHP
            10.18.3 - 1) Lire le contenu d’une table MySQL - méthode orientée objet (PDO)
            10.18.3 - 2) Lire le contenu d’une table MySQL - méthode procédurale (mysqli)
      10.18.4 Insérer des données à partir d'un formulaire depuis PHP
            10.18.4 - 1) Insérer des données dans une table MySQL - méthode orientée objet (PDO)
            10.18.4 - 2) Insérer des données dans une table MySQL - méthode procédurale (mysqli)
      10.18.5 Modifier un enregistrement depuis PHP
            10.18.5 - 1) Modifier des données dans une table MySQL - méthode orientée objet (PDO)
            10.18.5 - 2) Modifier des données dans une table MySQL - méthode procédurale (mysqli)
      10.18.6 Supprimer un enregistrement depuis PHP
            10.18.6 - 1) Supprimer un enregistrement d’une table MySQL - méthode orientée objet (PDO)
            10.18.6 - 2) Supprimer un enregistrement d’une table MySQL - méthode procédurale (mysqli)
      10.18.7 Trier une table depuis PHP
            10.18.7 - 1) Trier par noms une table MySQL - méthode orientée objet (PDO)
      10.18.8 Un script d’administration pour gérer la table

10.19 Créer un système d’authentification sécurisé – méthode orientée objet (PDO)

      10.19.1 le formulaire pour s’identifier : auth.php - méthode orientée objet (PDO)
      10.19.2 le formulaire pour s’inscrire : 53_auth_inscript.php - méthode orientée objet (PDO)
      10.19.3 la validation du nom et du mot de passe : verif.php - méthode orientée objet (PDO)
      10.19.4 le script de protection de la page : secure.php - méthode orientée objet (PDO)

10.20 Créer un site marchand sécurisé – méthode procédurale (mysqli)

       10.20.A Connexion et menu – méthode procédurale (mysqli)
             10.20.A1 le script de connexion - méthode procédurale (mysqli)
             10.20.A2 le script d’authentification - méthode procédurale (mysqli)
             10.20.A3 Modifier le mot de passe - méthode procédurale (mysqli)
             10.20.A4 la page d’administration - méthode procédurale (mysqli)
             10.20.A5 la Déconnexion - méthode procédurale (mysqli)
             10.20.A6 la page du site web (ultra-simplifiée) - méthode procédurale (mysqli)
       10.20.B Gérer l’utilisateur – méthode procédurale (mysqli)
             10.20.B1 Affichage des utilisateurs - méthode procédurale (mysqli)
             10.20.B2 Détail d’un utilisateur - méthode procédurale (mysqli)
             10.20.B3 Ajouter un utilisateur - méthode procédurale (mysqli)
             10.20.B4 Modifier un utilisateur - méthode procédurale (mysqli)
             10.20.B5 Effacer un utilisateur - méthode procédurale (mysqli)
       10.20.C Gérer les articles du site – méthode procédurale (mysqli)
             10.20.C1 Affichage des articles - méthode procédurale (mysqli)
             10.20.C2 Détail d’un article - méthode procédurale (mysqli)
             10.20.C3 Ajouter un article - méthode procédurale (mysqli)
             10.20.C4 Modifier un article - méthode procédurale (mysqli)
             10.20.C5 Supprimer un article - méthode procédurale (mysqli)
             10.20.C6a Statistiques sur les articles - méthode procédurale (mysqli)
             10.20.C6b Statistiques sur les articles avec la bibliothèque Artichow

10.21 Conclusion


InTheDarkBlue

ÉTAPE 10 : Dynamiser mon site avec PHP

Ce mémento sur PHP et MySQL est un simple aide-mémoire. Pour rester pratique, ce mémento est agrémenté de modèles de code que j’ai tous testés, ceci afin d’éviter d’entrer dans la catégorie des scripts truffés d’erreurs que l’on trouve habituellement sur internet. Pour plus de détails, je vous renvoie cependant aux tutoriels que vous trouverez sur internet : http://php.net/manual/fr/index.php - http://www.phpfrance.com/ - http://www.siteduzero.com/ ainsi qu’à l'excellent livre "PHP 5 Avancé - 4e édition" de Éric Daspet et Cyril Pierre de Geyer, chez Eyrolles.


10.1 Un serveur web sur votre machine personnelle

Il est extrêmement utile, pour ne pas dire absolument indispensable, de commencer par installer un serveur web sur votre machine personnelle. Ceci vous permettra de reproduire le comportement de vos scripts pour les tester sur votre propre machine, ce qui est bien plus pratique et plus rapide que de les télécharger à chaque fois sur le serveur de votre hébergeur. Le but est de transformer votre machine en serveur web fictif pour simuler le comportement de vos scripts sur le vrai serveur web de votre hébergeur avant de les télécharger.


      • 10.1.1 Téléchargement de Wamp server

Rechercher Wamp server dans Google : p10.1.1-1.gif

Choisissez l’option 1 "Téléchargez la dernière version de Wampserver 2"

p10.1.1-2.gif
Inutile de remplir le formulaire, allez directement dans "TELECHARGER WampServer 2.0c"

p10.1.1-3.gif
Attention, si vous utilisiez Wamp 5, désinstallez cette version avant d'installer WampServer 2

p10.1.1-4.gif
Puis cliquez sur "TELECHARGER WampServer 2
Enregistrez

p10.1.1-5.gif
Cliquez sur Yes si c’est une première installation
Puis double-cliquez sur l’icône bleue Wamp server

p10.1.1-6.gif
Puis sur Run pour lancer l’installation

p10.1.1-7.gif

Fermez tous les programmes et cliquez sur Next

p10.1.1-8.gif

Acceptez la licence générale GNU et cliquez sur Next

p10.1.1-9.gif

Le répertoire d’installation devrait être c:\wamp

p10.1.1-10.gif

Mettez une icône de lancement rapide

p10.1.1-11.gif

Continuez l’installation

p10.1.1-12.gif

Et attendez ...

p10.1.1-13.gif


Si un fichier php.ini existe déjà, l’installeur vous proposera de le renommer

p10.1.1-14.gif

Utilisez de préférence Firefox comme navigateur par défaut (avec FireBug : il sera utile pour éventuellement débugger vos programmes PHP)

p10.1.1-15.gif

Conservez localhost comme nom de serveur SMTP mais changez votre adresse e-mail

p10.1.1-16.gif
Et cliquez sur Finish pour terminer l’installation


p10.1.1-17.gif

Une petite icône de lancement rapide apparaît en bas à droite de votre écran :

p10.1.1-18.gif

p10.1.1-19.gif

Cliquez sur l'icone W puis démarrez tous les services

p10.1.1-20.gif


Vous pourrez ainsi explorez votre répertoire www, ou bien ouvrir les pages de localhost dans votre navigateur, ou encore lancer phpMyAdmin
… et bien d’autres options !


      • 10.1.2 Détails de votre installation : phpinfo()


A ce stade nous supposons que vous avez terminé avec succès l’installation du serveur web Wamp sur votre machine personnelle. Lorsqu’il est installé, démarrez le serveur Wamp, puis ouvrez votre navigateur (Firefox de préférence). Et dans la barre d'adresses, entrez :
http://localhost/01_phpinfo.php pour obtenir tous les détails de votre installation PHP et pour vous assurer qu’elle fonctionne bien.

Code du fichier 01_phpinfo.php :

<?php
phpinfo();
?>

GrandTraitBleu1180x12.gif
BoutonHautDePage

10.2 Pour commencer

      • 10.2.1 À quoi sert le PHP


Le PHP sert à dynamiser vos pages, il permet d’interagir avec vos visiteurs à l’aide de formulaires, il peut générer dynamiquement du code html au milieu d’une page.
Le code PHP est souvent inclus au milieu du code html : Dans ce cas le fichier qui contient du PHP doit avoir l'extension *.php


      • 10.2.2 Balises d'ouverture - fermeture


Le code PHP s’ouvre et se ferme comme ceci :
<?php ___ ?>


      • 10.2.3 Commentaires

/*
Commentaires sur plusieurs lignes
(Recommandé)
bla bla bla
*/
ou bien 
// Sur une seule ligne

      • 10.2.4 Le point virgule


Chaque instruction se termine par un ";"


      • 10.2.5 Apostrophes et guillemets


Entre apostrophes on a des chaines de caractères (non interprétables)
Entre guillemets on a des chaines et éventuellement des variables interprétables


<?php
$toto = 'une voiture';
echo "la variable vaut $toto";
// affiche la "variable vaut une voiture" (la variable $toto est interprétée)
echo 'la variable vaut $toto';
// affiche "la variable vaut $toto" ($toto est conservée sous forme de chaine)
?>


echo sert à afficher dans la page html les chaines entre apostrophes ou guillemets, les variables ou les constantes

GrandTraitBleu1180x12.gif
BoutonHautDePage

10.3 Variables et constantes

      • 10.3.1 Les $variables


Les variables commencent par un $ (05_variables.php)


<?php
$toto = 'une voiture';
$texte = 'Ceci est du texte <br /> Avec du html.';
echo "$toto";
echo "$texte";
?>


Visibilité des variables :
Une variable est visible (accessible) là où elle a été déclarée.
Par exemple si on la déclare dans une fonction, elle ne sera pas accessible dans le script principal, et vice versa.

      • 10.3.2 Les CONSTANTES


Les constantes sont déclarées par la fonction define (en MAJUSCULES mais pas de $ devant)


<?php
define ('MA_CONSTANTE', 10);
$resultat = 10 * MA_CONSTANTE;
echo MA_CONSTANTE;
?>
GrandTraitBleu1180x12.gif
BoutonHautDePage

10.4 Quelques Gadgets pour se familiariser

      • 10.4.1 Afficher la date du jour


La fonction date(format, timestamp) : Pour afficher la date on utilise la fonction date()
La fonction strtotime () : convertit une chaine date en temps
La fonction mktime() : donne un timestamp à partir d'une date

(02.1_datejour.php)

<html>
<body>
<center>Bonjour nous sommes le :
<?php
$date = date("d-m-Y");
echo "$date";
// Affiche la date sous la forme 08-05-2011
$format = 'd-m-y, H:i:s';
// H majuscule veut dire heures de 0 à 24h
// Y majuscule veut dire année sur 4 caractères, etc.
$date = date($format);
// Affiche la date sous la forme 08-05-11, 07:40:29 (l'heure est en temps universel)
echo "<br>$date";
// strtotime convertit une chaine date en temps
$date = strtotime ('16 November 1976');
echo "<br>$date";
$format = 'd-m-y';
$date = date($format, $date);
echo "<br>$date";
// mktime (heure, minute, seconde, mois, jour, annee) donne un timestamp à partir d'une date
echo "<br>".date("d/M/Y", mktime (0,0,0,12,32,2011))."<br>";
echo date("d/m/Y", mktime (0,0,0,13,1,2012))."<br>";
echo date("M-d-Y", mktime (0,0,0,1,1,2011))."<br>";
?>
</center>
</body>
</html>

      • 10.4.2 Validité d’une date saisie


La fonction checkdate( mois, jour, annee ) : envoie true si la date en paramètres est valide

<?php
/* On récupère la date de naissance saisie dans un formulaire sous la forme JJ/MM/AAA */
$naissance = $_REQUEST['naissance'] ;
$tab = explode("/", $naissance) ;
/* Vérifions la validité de cette date */
if (checkdate($tab[1], $tab[0], $tab[2])) {
/* notez que dans $tab les arguments sont dans l’ordre anglosaxon et non dans l’ordre français */
echo 'La date est valide. ';
}else{
echo 'La date est invalide. ';
}
?>

      • 10.4.3 Temps d’exécution d’un script php


La fonction time( ) : retourne le timestamp actuel que l’on peut ensuite comparer à différents moments du script.
La fonction microtime() : renvoie en plus les millionièmes de secondes

(02.2_tempspasse.php)

<?php
$temps1 = microtime() ;
/* microtime renvoie la partie décimale de l'heure */
echo "<br>Début du script à $temps1<br>" ;
/* placez vos traitements ici */
$i=1;
While ($i<=10000) {
echo "$i - " ;
$i++ ;
}
/* fin des traitements */
/* Les traitements doivent bien sûr être assez longs avec la fonction time() */
$temps2 = microtime() ;
echo "<br>Fin du script à $temps2" ;
$tempspasse = $temps2 - $temps1 ;
echo "<br>Ce traitement a duré $tempspasse" ;
?>


Un script plus élégant pour calculer les temps d’exécution...

(02.3_tempspasse.php)

<?php
function tempspasse($temps)
{
  /* Temps passé en secondes */
  $ecart = time()-$temps ;
  $ecart_jour = floor($ecart/60/60/24) ;
  $ecart -= $ecart_jour*60*60*24 ;
  $ecart_heure = floor($ecart/60/60) ;
  $ecart -= $ecart_heure*60*60 ;
  $ecart_minute = floor($ecart/60) ;
  $ecart -= $ecart_minute*60 ;
  $ecart_seconde = $ecart ;
  return ('Temps passé ='.$ecart_jour.'j '.$ecart_heure.'h '
  .$ecart_minute.'mn '.$ecart_seconde.'s');
}
/* Par exemple, affichons le temps passé depuis qu'on a créé le fichier phpinfo.php */
echo "<br>temps passé depuis qu'on a créé le fichier 01_phpinfo.php<br>" ;
echo tempspasse(filectime('01_phpinfo.php')) ;
/* filectime() = file creation time */
?>

      • 10.4.4 Récupérer mon adresse IP


(04_monAdresseIP.php)

<html>
<body>
<center>Récupérer mon adresse IP : 
<?php
echo 'Votre adresse IP est : ' . $_SERVER['REMOTE_ADDR'];
?>
</center>
</body>
</html>
GrandTraitBleu1180x12.gif
BoutonHautDePage

10.5 Les opérateurs

      • 10.5.1 Les opérations


Les opérateurs servent à faire des opérations, affecter des valeurs, ou les comparer.
=     Affectation : $a = 4; //affecte la valeur 4 à la variable $a
+     Addition
-      Soustraction
*      Multiplication
/      Division
%    Modulo : echo $a % $b; //donne le reste de la division de $a par $b


      • 10.5.2 Le Modulo '$a % 2 ;'


Le Modulo $a % 2; //sert à savoir si un nombre est pair ou impair
Il nous permet d'afficher une liste avec 1 ligne sur 2 d'une couleur différente pour faciliter la lecture

(14_UneLigneSurDeuxColor.php)

<?php
$i = 0;
echo '<table width="100">';
while ($i < 10) {
  if (($i % 2)==0) { //cas d'une ligne paire
    echo "<tr><td bgcolor=#FFFFFF align=center>$i</td></tr>";
  } else { //cas d'une ligne impaire
    echo "<tr><td bgcolor=#CCCCCC align=center>$i</td></tr>";
  }
  $i++;
}
echo '</table>';
?>

      • 10.5.3 Opérateurs d'incrémentation

<?php
$i = 1;
$i++; /* est équivalent à */ $i = $i + 1;
$i--; /* est équivalent à */ $i = $i - 1;
++$i; /* Si l'opérateur est devant, la variable est d'abord incrémentée puis évaluée */ 
?>

      • 10.5.4 Opérateurs de concaténation

<?php
$a='hello ';
$b='world';
echo $a.$b; /* concaténation de $a et $b => résultat 'hello world' */
echo $a.='you'; /* ajoute 'you' à 'hello ' => résultat 'hello you' */
?>

      • 10.5.5 Opérateurs de comparaison

  $a == $b;   //est vrai si $a égal $b
  $a === $b;   //est vrai si $a égal $b et ont toutes deux le même type
  $a != $b;   //est vrai si $a différent de $b
  $a !== $b;   //est vrai si $a différent de $b en valeur OU en type
  $a > $b;   //est vrai si $a plus grand que $b
  $a < $b;   //est vrai si $a plus petit que $b
  $a >= $b;   //est vrai si $a plus grand ou égal à $b
  $a <= $b;   //est vrai si $a plus petit ou égal à $b










      • 10.5.6 Opérateurs logiques

  ! $b;   //est vrai si $b est faux
  $a && $b;   //est vrai si $a et $b sont tous deux vrais
  $a AND $b;   //est vrai si $a et $b sont tous deux vrais
  $a || $b;   //est vrai si au moins $a ou $b est vrai
  $a OR $b;   //est vrai si au moins $a ou $b est vrai
  $a XOR $b;   //est vrai si uniquement un des deux est vrai









GrandTraitBleu1180x12.gif
BoutonHautDePage

10.6 Les tableaux

      • 10.6.1 Les tableaux indexés


Les tableaux indexés ont des index commençant à 0 (et non 1), on peut les remplir de différentes façons :
(09_testtab.php)

<?php
$tab=array('a','b','c','d');
/* Si l'on ne précise pas les index ils seront 0, 1, 2, 3 automatiquement */
echo '<pre>';
print_r($tab);
echo '</pre>';
echo'<br/>';
?>


Ce qui donne :
Array
(
      [0] => a
      [1] => b
      [2] => c
      [3] => d
)


(10_testtab1.php)

<?php /* On peut aussi remplir le tableau de la façon suivante */
$tab[0] = 12250;
$tab[1] = 15555;
$tab[3] = 12000;
$tab[4] = 21300;
echo '<pre>';
print_r($tab);
echo '</pre>';
echo'<br/>';
?>


Ce qui donne :
Array
(
      [0] => 12250
      [1] => 15555
      [3] => 12000
      [4] => 21300
)


      • 10.6.2 Les tableaux associatifs


Les tableaux associatifs ont pour clés des noms et non plus des index :

<?php
/* Dans les tableaux associatifs, les index sont remplacés par des noms */
$tab=array(
	'prem elem'=>'a',
	'2e elem'=>'b',
	'3e elem'=>'c',
	'4e elem'=>'d'
	);
echo '<pre>';
print_r($tab);
echo '</pre>';
echo'<br/>';
?>


Ce qui donne :
Array
(
      [prem elem] => a
      [2e elem] => b
      [3e elem] => c
      [4e elem] => d
)

Exemple de tableau associatif :
(10_testtabassociatif.php)

<?php
$tab=array(
	'email'=>'mon.adresse@monhebergeur.fr',
	'nom'=>'Pernot',
	'prenom'=>'Gilbert',
	'sexe'=>'M',
	'ville'=>'Orsay',
	'codpost'=>'91400',
	'pays'=>'France',
	'telport'=>'0611705146'
	);
echo "Votre contact à {$tab['ville']} ({$tab['pays']}-{$tab['codpost']}) sera Monsieur ";
echo $tab['prenom']." ".$tab['nom'];
echo "<br>Son téléphone est le ";
echo $tab['telport'];
?>


Ce qui donne :
Votre contact à Orsay (France-91400) sera Monsieur Gilbert Pernot
Son téléphone est le 0611705146


      • 10.6.3 Tableau de tableau, panier d’articles


Objectif : Transformer un tableau $articles en tableau de tableau dans une variable $panier. Les valeurs de $panier sont des tableaux associatifs (prix, description) et les clés de $panier sont numériques. Afficher le panier.
(13_x.tableau_panier.php)

<?php
$articles=array(
'oranges'=>1.52,
'pommes'=>4.35,
'tomates'=>5.70,
'celeri'=>3.80,
'poivre'=>2.77
);
echo '<pre>';
print_r($articles);
echo '</pre>';
echo'<br/>';
echo'<hr/>';
//---  création du panier ---
foreach ($articles as $key => $value)
{
$panier[]=array($key,$value);
}
echo '<pre>';
print_r($panier);
echo '</pre>';
echo'<hr/>';
/* exemple foreach 4 : tableaux multi-dimensionnels */
// --- affichage du panier : meilleure méthode ---
echo "Article:        Prix:";
foreach ($panier as $v1) {
    echo'<br/>';
    foreach ($v1 as $v2) {
        echo "$v2\n";

    }
}
echo'<hr/>';
// --- affichage du panier la totale ---
echo "Article:     Prix:";
foreach ($panier as $tcle => $tval) {
    echo'<br/>';
    foreach ($tval as $cle => $val) {
        echo "Ref. $tcle) $val"." ";
    }
}
echo'<hr/>';
?>

      • 10.6.4 Matrices


Un tableau peut avoir plusieurs dimensions (matrice) :

<?php
/* Une matrice pourrait s'écrire comme ceci */
$matrice = array(
	array(5,4),
	array(2,3),
	array(8,2),
	array(7,9),
	array(1,6)'
	);
/* ou comme cela */
$matrice[0][0] = 5;
$matrice[0][1] = 4;
$matrice[1][0] = 2;
$matrice[1][1] = 3;
$matrice[2][0] = 8;
$matrice[2][1] = 2;
$matrice[3][0] = 7;
$matrice[3][1] = 9;
$matrice[4][0] = 1;
$matrice[4][1] = 6;
?>


Les index peuvent aussi être remplacés par des noms (matrices associatives)

GrandTraitBleu1180x12.gif
BoutonHautDePage

10.7 Tests de base

      • 10.7.1 L’instruction if else elseif


Changez la valeur de $age et testez!...
(06_b_if else elseif.php)

<?php
$age = 25;
If ($age < 18) /* Si vrai on exécute ce qui se trouve entre les premiers crochets */
{
echo 'Vous êtes trop jeune pour entrer ici' ;
exit(0) ; /* La fonction exit() arrête l’exécution du script */
} 
/* Sinon on exécute ce qui se trouve ensuite */
elseif ($age > 18)
{
	echo "Vous avez $age ans, soit plus de 18 ans";
}
else
{
	echo "Vous avez $age ans tout juste";
}
?>



Autre exemple :
La fonction mt_rand(1,6000) donne une valeur aléatoire entre 1 et 6000 testez le code ci-dessous!...
(06_testiftrous.php)

<?php
$salaire=mt_rand(1,6000);
if($salaire<1000)
{
echo 'Vous gagnez '.$salaire.' € par mois. Vous êtes payé en-dessous du SMIC';
}
elseif($salaire<3000)
/* Notons qu’il est inutile de répéter ici que le salaire doit être supérieur à 1000 */
{
echo 'Vous gagnez '.$salaire.' € par mois. Vous avez une bonne paye';
}
else
{
echo 'Vous gagnez '.$salaire.' € par mois. Contactez-moi, vous avez un bon job!';
}
?>


Les accolades sont inutiles si une seule instruction suit la condition :

<?php
If ($temps == 'ensoleillé')
echo 'Il fait beau ' ;
?>

      • 10.7.2 L’instruction switch


Elle permet de faire plusieurs tests sur la valeur d’une variable $var (entre les parenthèses du 'switch') en la comparant successivement à chacun des 'case' :
(15_switch.php)

<?php
$var=mt_rand(0,5);
echo "Variable tirée au hazard : $var<br><br>" ;
/* 'switch' compare la valeur d’une variable $var successivement à chacun des 'case' */
switch ($var)
{
case 1 : /* Chaque 'case' se termine par deux points */
case 2 : /* L’ordre des 'case' est très important */
echo "la variable vaut 1 ou 2, en fait elle vaut $var<br>" ;
break ; /* Avec un break je sors du bloc, sinon je continue à exécuter ce qui suit */
case 3 :
echo "la variable vaut $var<br>" ;
break ; 
case 4 :
echo "la variable vaut $var<br>" ;
break ; 
case 5 :
echo "la variable vaut $var<br>" ;
break ; 
default :
echo "la variable n'est pas comprise entre 1 et 5<br>" ;
}
;
?>
GrandTraitBleu1180x12.gif
BoutonHautDePage

10.8 Les boucles

      • 10.8.1 La boucle WHILE


Un type de boucle très utile si on ne sait pas combien de fois itérer : 'while' veut dire 'tant que' la condition est vraie, les instructions sont exécutées, puis s’arrêtent dès que la condition est fausse.
(16_while.php)

<?php
$i=1;
while ($i<=10)
{
echo "$i - " ;
$i++ ;
}
/* affiche 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 -  */
?>

      • 10.8.2 La boucle DO WHILE


Encore un type de boucle très utile si on ne sait pas combien de fois itérer : 'While' veut dire 'tant que' la condition est vraie, les instructions sont exécutées, puis s’arrêtent dès que la condition est fausse.
(17_do_while.php)

<?php
$i=1;
do
{
echo "$i - " ;
$i++ ;
}
While ($i<=10)
/* on exécute la boucle, on fait le test ensuite */
/* affiche 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 -  */
?>

      • 10.8.3 La boucle FOR


Un type de boucle adapté lorsqu’on sait combien de fois itérer : cette boucle intègre la valeur de départ, la condition d’arrêt et l’incrémentation.
(18_for.php)

<?php
for ( $i=0 ; $i<=9 ; $i++ )
{
echo "$i - " ;
}
/* affiche 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -  */
?>

      • 10.8.4 La boucle FOREACH


Un moyen simple de passer en revue tous les éléments d’un tableau.
(18_foreach.php)
Syntaxe : pour toutes les cases du tableau ayant une valeur...

<?php
$tab = array(
'nom' => 'Pernot',
'prenom' => 'Gilbert',
'email' => 'mon.adresse@monhebergeur.fr',
'codpost' => '91400',
'ville' => 'Orsay'
);
foreach ($tab as $value) {
echo  "Valeur : $value <br>\n";
 }
/* c’est la valeur de la case du tableau qui est affectée à la variable $value */
/* affiche 
Valeur : Pernot
Valeur : Gilbert
Valeur : mon.adresse@monhebergeur.fr
Valeur : 91400
Valeur : Orsay
 */
foreach ($tab as $key => $value) {
echo  " Clé : $key; Valeur : $value <br>\n"; 
}
/* c’est la clé de la case du tableau qui est affectée à la variable $key */
/* affiche 
Clé : nom; Valeur : Pernot
Clé : prenom; Valeur : Gilbert
Clé : email; Valeur : mon.adresse@monhebergeur.fr
Clé : codpost; Valeur : 91400
Clé : ville; Valeur : Orsay 
 */
?>

      • 10.8.5 Les instructions break et continue


L’instruction break permet de sortir d’une boucle for, while, foreach ou d’un test switch par exemple.
L’instruction continue permet d’ignorer la fin de boucle et donc de sauter les instructions de l’itération en cours d’une boucle pour exécuter les instructions de l’itération suivante.
Un argument numérique (optionnel), par exemple break (2) indique combien de structures emboitées ont été interrompues, et par exemple continue (2) indique combien de structures emboitées ont été ignorées.



GrandTraitBleu1180x12.gif
BoutonHautDePage

10.9 Les fonctions utilisateurs


Vous pouvez déclarer vous-mêmes des fonctions utilisateurs ou les tirer de bibliothèques. On peut assimiler ces fonctions utilisateurs à des sous-programmes plus ou moins complexes que l’on appelle depuis le programme principal. Elles évitent aussi de répéter plusieurs fois dans le programme principal un code qui sert souvent.


      • 10.9.1 Déclaration d’une fonction utilisateur

<?php
function nom_de_la_fonction ($argument1 = 'valeur_par_defaut', $argument2, $argument3) {
// Liste d’instructions
}
?>

      • 10.9.2 Le mot-clé return


Le mot-clé return permet d’arrêter la fonction et de retourner une valeur au programme qui a appelé la fonction.
(20_multiplier.php)

<?php
// Déclaration de la fonction multiplie ()
function multiplie ($var1, $var2) {
$resultat = $var1 * $var2;
return $resultat ;
}
// Appel de la fonction multiplie
echo multiplie (10,15) ;
// Affiche 150
?>

      • 10.9.3 Déclaration et appel d’une fonction


Les arguments ayant une valeur par défaut sont optionnels, mais les autres sont obligatoires.
(19_fonction.php)

<?php
// Déclaration de la fonction texte_bienvenue ()
function texte_bienvenue ($prenom, $texte = 'Bonjour ') {
if(empty($prenom)) {
return FALSE ;
// Si $prenom est vide, la fonction retourne FALSE
}else{
echo "$texte $prenom <br>";
// La fonction affiche le texte
return TRUE ;
// La fonction retourne TRUE en cas de succès
}
}
// Appel de cette fonction.  Si on passe les deux arguments
texte_bienvenue ('cher Gilbert', 'Bienvenue ') ;
// Affiche "Bienvenue cher Gilbert"

// Si on ne passe qu’un seul argument on utilise la valeur par défaut du second
texte_bienvenue ('cher Gilbert') ;
// Affiche "Bonjour cher Gilbert"

// Si on teste la valeur de retour
if(!texte_bienvenue ("")) { 
echo "Erreur" ;
// On affiche "Erreur"
// En effet, comme la chaîne passée en paramètres est vide, la fonction retourne FALSE
}
?>

      • 10.9.4 Convertisseur en Euros



(23_convertisseur_euro.php)

<?php
function convertisseur_euro($valeur) {
    $retour = $valeur /  6.55957;
    return round($retour,2);
}
echo '10 Francs = '.convertisseur_euro(10). ' Euros';
?>

      • 10.9.5 Passage des arguments (visibilité et portée des variables)


Variable "local" : par défaut, une variable est visible (accessible) là où elle a été déclarée. Par exemple si on la déclare dans une fonction, elle ne sera pas accessible dans le script principal, et vice versa.
Variable "static" : la variable locale à la fonction existe pendant tout le temps d’exécution du script et conserve sa dernière valeur à chaque nouvel appel de la fonction.
Variable "global" : la variable est visible partout, dans la fonction et dans le script principal.

<?php
$param = 3 ;
// Déclaration de la fonction decremente ()
function decremente ($valeur) {
$valeur = $valeur -1;
echo $param ;
// Déclenche une erreur et n'affiche rien car $param n'est pas défini au sein de la fonction mais en dehors, dans le script principal
}
// Appel de la fonction decremente
decremente ($param) ;
echo $param ;
// Affiche 3 car la valeur modifiée $valeur n'est pas la même que la valeur actuelle $param
echo $valeur ;
// Déclenche une erreur et n'affiche rien car $valeur n'est pas défini au sein du script principal
?>

      • 10.9.6 Passage des arguments par copie


Passage des arguments par copie : Les arguments passés à une fonction le sont normalement par copie. Si la fonction modifie la copie de cette variable cela ne modifiera donc pas la variable en dehors de la fonction.

<?php
function decremente ($valeur) {
$valeur = $valeur -1;
}
$param = 3;
decremente ($param) ;
echo $param ;
// Affiche 3
?>


Si on veut que çà marche, il est préférable d’utiliser return pour récupérer le résultat comme ceci :
(21_parcopie.php)

<?php
function decremente ($valeur) {
$valeur = $valeur -1;
return $valeur ;
}
$param = 3 ;
echo decremente ($param) ;
// Affiche 2
?>

      • 10.9.7 Passage des arguments par référence


Passage des arguments par référence : On peut toutefois passer des arguments à une fonction par référence. Il suffit d’ajouter dans la déclaration un "&" devant l’argument. Alors PHP utilisera la valeur d’origine de la variable et non plus une copie.

<?php
function decremente (&$valeur) {
$valeur = $valeur -1;
}
$param = 3 ;
decremente ($param) ;
echo $param ;
// Affiche 2
?>
GrandTraitBleu1180x12.gif
BoutonHautDePage

10.10 Sécurité des formulaires


Le formulaire est la partie dynamique du PHP, il ouvre un espace interactif entre l’internaute et le site web, permettant à l’utilisateur d’envoyer des données vers le serveur, et au site web de récupérer ces données pour éventuellement y répondre.
Cependant en offrant à l’utilisateur d’envoyer des données vers le serveur, on lui offre aussi la possibilité d’envoyer des virus !... Un certain nombre de précautions sont donc nécessaires pour bien gérer certains caractères spéciaux accentués ou autres, les caractères spéciaux du code html, pour empêcher un utilisateur d’envoyer du code malveillant dans un champ texte, pour sécuriser les failles d'injection de headers de mail, etc.


      • 10.10.1 Caractères spéciaux : urlencode, urldecode


Avant toutes choses il faut préciser que certains caractères spéciaux accentués ou autres poseraient problème parce qu’ils ne peuvent pas être transmis par l’url (méthode get).
urlencode prend en charge les caractères spéciaux

<?php
/* urlencode prend en charge les caractères spéciaux */
$nom = urlencode("Pernõt");
$prenom = urlencode("Gilbert");
$email = urlencode ("mon.adresse@monhebergeur.fr");
?>


Ensuite, bien sûr, il faudra décoder ces caractères au moment de la récupération des données :

<?php
$nom = urldecode($_GET["nom"]);
?>

      • 10.10.2 Sécurité des champs texte : htmlentities


Si on envoyait tel quel dans un champ texte certains caractères spéciaux du code html tels que les délimiteurs de balises ‘<…>’ les ‘&’, etc., ils seraient interprétés et non pas affichés par le navigateur. De même, pour empêcher un utilisateur d’envoyer du code malveillant dans un champ texte il faut le rendre inopérant grâce à la fonction ‘htmlentities’ de PHP. On écrit alors :

<?php
$np = htmlentities ($_POST[‘nom’]);
echo "Votre nom est $np <br />";
?>

      • 10.10.3 Sécurité des champs texte : failles d'injection de headers de mail


Dès qu’on laisse à l’utilisateur la possibilité de remplir un champ texte quelconque, la fonction mail() peut être détournée par des spammeurs ou hackers à des fins malveillantes : pour envoyer par exemple un mail anonyme, ou pour une arnaque quelconque.
Le problème se pose si l'utilisateur peut choisir le contenu du sujet du mail, son message, l'expéditeur ou le destinataire. En introduisant des sauts de lignes ou des retours chariot il peut facilement ajouter des headers supplémentaires telles que Cc, Bcc, Content-Type contenant du code malveillant (html ou autre). De même les headers To, Subject, peuvent être définis deux fois dans le même but. Le détail est exposé sur le site :
http://www.phpsecure.info/v2/article/MailHeadersInject.php
Pour sécuriser ces failles d'injection de headers de mail, une idée parmi d’autres serait d'ajouter, après la ligne :

$nom=$_POST["nom"];


le code suivant :

if (preg_match("/\r/i",$nom) || preg_match("/\n/i",$nom))
{
die("Ni retour à la ligne ni en début de ligne, champ nom : (");
}


Le script est stoppé grâce à la fonction die() si $nom contient "\r" (le retour en début de ligne) ou "\n" (le saut de ligne ou "Carriage Return") ou la combinaison des deux. Le filtre vérifie tout ceci car il n'y a aucune autre raison que le piratage pour qu’ils soient utilisés.
Note : nous utilisons preg_match() et non plus eregi(), en effet il ne faut plus utiliser la fonction eregi() qui est OBSOLETE depuis PHP 5.3.0.

GrandTraitBleu1180x12.gif
BoutonHautDePage

10.11 Les formulaires

      • 10.11.1 Création d’un formulaire en HTML : <form>…</form>


Un formulaire est délimité par la balise <form> ... </form> La balise form doit contenir un certain nombre de paramètres :


      • 10.11.2 Où vont les données : action


- action indique vers quelle page iront les données entrées par l’utilisateur après action du bouton envoi.
En principe on a généralement deux pages :
une pour le formulaire à remplir et une autre qui récupère les données envoyées par votre visiteur.

    <form action="reception_donnees.php">


      • 10.11.3 Transmission des données : méthode GET


- method indique comment les données entrées par l’utilisateur sont transmises.
- method="GET" est la méthode la plus simple : les données sont transmises par l'URL avec une limite de 255 caractères et avec l’inconvénient de transmettre les mots de passe en clair, donc pas terrible au point de vue sécurité.

1) Pour transmettre les données, on peut utiliser indifféremment soit un formulaire <form>, comme ceci :
    <form action="reception_donnees.php" method="GET" >

2) soit écrire directement toutes les variables dans un simple lien <a href=' ... '> construit à la main comme cela :
    <a href='reception_donnees.php?nom=Pernot&prenom=Gilbert&email=g.pernot%40aliceadsl.fr'>Lien</a>

Dans les deux cas, les variables transmises seront récupérées exactement de la même façon, dans la variable super-globale $_GET

La page de formulaire d’envoi :
(24_url-get.php)

<?php
$nom = urlencode("Pernõt");
$prenom = urlencode("Gilbert");
$email = urlencode ("mon.adresse@monhebergeur.fr");
/* urlencode prend en charge les caractères spéciaux */
?>
Pour envoyer des variables avec la méthode GET vous pouvez utiliser un formulaire comme ci-dessous,<br>
Entrez votre nom, votre prénom et votre email :
<form action="25_script.php" method="get">
<input type="text" name="nom" value="<?php echo "$nom";?>"> 
<!-- value est la valeur par défaut (facultatif) //-->
<input type="text" name="prenom" value="<?php echo "$prenom";?>"> 
<input type="text" name="email" value="<?php echo "$email";?>"> 
<br><input type="submit" value="valider">
</form>


Sinon vous pouvez envoyer les variables avec un lien comme ci-dessous, çà marchera exactement de la même façon au moment de récupérer les données.

<?php
$lien = "25_script.php?nom=$nom&prenom=$prenom&email=$email";
echo "<a href='$lien'>Lien</a><br>";
/* Affiche le Lien  */
echo "$lien";
/* Affiche 25_script.php?nom=Pern%F5t&prenom=Gilbert&email=gilbert.pernot%40aliceadsl.fr */
?>


Et la page de récupération des données :
(25_script.php)

<?php
echo "Page de récupération des données :<br><br>";
$nom = urldecode($_GET["nom"]);
echo "Nom = $nom <br>";
$prenom = urldecode($_GET["prenom"]);
echo "Prénom = $prenom <br>";
$email = urldecode($_GET["email"]);
echo "email = $email <br>";
?>

      • 10.11.4 Transmission des données : méthode POST


- method="POST" : Les données sont transmises dans les variables super-globales que PHP peut récupérer dans la page définie dans action. Cette méthode est très bien pour transmettre des données confidentielles (mot de passe), des fichiers de grande taille, etc.

<html>
<form action="reception_donnees.php" method="post" >
</html>


La page de formulaire d’envoi :
(26_meth-post.php)

<html>
<body>
<form action="27_script.php" method="post" >
    <input type="text" name="nom">
    <input type="submit" name="Submit" value="Envoyer">
</form>
</body>
</html>



Et la page de récupération des données :
(27_script.php)
Si on a input type="text" name="nom" on récupère $_POST["nom"]

<html>
<body>
<?php 
    echo "Page de récupération des données :<br><br>";
    $nom = urldecode($_POST["nom"]);
    /* Si on a input type="text" name="nom" on récupère $_POST["nom"] */
    echo "Votre nom est $nom <br>";
?>
</body>
</html>

      • 10.11.5 Comment entrer les données dans le formulaire : balise <input>


On utilise la balise <input> Exemple : <input type="submit" name="Submit" value="Envoyer">

Syntaxe générale :
<input type="GenreDeControle" name="NomDuControle" value="ValeurDuControle" style="Longueur:XX; Hauteur:XX; Couleur:XX; XX:YY..." disabled accesskey=UneLettreDAcces>
Tous les paramètres sont optionnels, mais les 3 premiers paramètres type, name et value, sont à peu près indispensables pour une bonne gestion du contrôle.

Tableau des paramètres :

  Paramètre   Explication   Exemple Visualisation
  GenreDeControle   C'est un mot réservé qui détermine s'il
  s'agit d'une case à cocher, d'un bouton
  ou autre.
  button : Simple bouton
  text : Zone de saisie simple
  password : Zone de mot de passe (***)
  file : Zone de récupération de fichier
  checkbox : Case à cocher
  radio : Bouton Radio
  submit : Envoi de formulaire
  reset : Remise à 0 de tous les contrôles
  d'un formulaire
  <input type="button"> p10.11.5-1
  NomDuControle   Un nom parlant que l'on pourra réutiliser
  en JavaScript. On peut normaliser les
  noms des contrôles de la manière
  suivante :
  Button : BDCNomBoutonDeCommande
  text : TXTNomZoneDeTexte
  password : PWDNomZoneMotDePasse
  (Password)
  file : FILNomZoneDeFichier
  checkbox : CACNomCaseACocher
  radio : BTRNomBoutonRadio
  submit : SUBNomBoutonSubmit
  reset : RESNomBoutonReset
  <input type="button"
  name="BDCValider">
p10.11.5-1
  ValeurDuControle   Le contenu du contrôle. En cas de case à
  cocher ou de bouton radio, ce nom ne
  sera pas visible, par contre, pour les
  boutons ou les zones d'édition,
  ValeurDuControle apparait sur le contrôle
  <input type="button" name="BDCValider"
  value="Cliquez sur moi">
p10.11.5-2
  style   Permet de déterminer la largeur et la
  hauteur du contrôle, mais aussi d'autres
  choses, comme par exemple la couleur
  de fond ou des caractères.
  Les différents paramètres de style sont
  installés entre guillemets, chaque fois
  séparés par un point-virgule.
  Exemple d’un bouton de 74 pixels de
  large sur 33 de haut
  <input type="button" style="width: 74px;
  height: 33px">
  Autre exemple, un bouton dont le fond
  est jaune :
  <input type="button" style=
  "background-color: yellow">
  Et avec une police de caractères
  extra-large :
  <input type="button" style="font-size:
  x-large" value=test>
p10.11.5-3
  disabled   Une autre propriété à titre d'exemple :
  disabled désactive le contrôle.
  Dans l'exemple, value est placée à droite
  de disabled pour montrer que l'ordre des
  paramètres n'a pas d'importance.
  <input type="button" disabled
  value="Test">
p10.11.5-4
  accesskey   Une autre propriété qui permet cette fois
  d'accéder au contrôle avec ALT+ la lettre
  convenue
  <input type="button" accesskey="t">
  Alt-t mettra le focus sur ce bouton
p10.11.5-1

      • 10.11.6 Les boutons : input type="button"


- type - Pour obtenir un bouton, il est nécessaire de préciser le type comme ceci :
    <input type="button">    Voici le résultat :     p10.11.5-1
- value - Pour écrire quelque chose sur ce bouton, il faut préciser l’attribut value :
    <input type="button" value="Cliquez sur moi">    Voici le résultat :     p10.11.5-2
- name - L'attribut name permet de donner un nom à ce bouton :
    <input type="button" value="Cliquez sur moi" name="LeBouton">

- style - L'attribut style permet de dimensionner le bouton :
    <input type="button" style="width: 180px; height: 50px">    Le voici :     p10.11.5-5


      • 10.11.7 Des boutons graphiques


On peut tout à fait remplacer les boutons standards par une image graphique.

    <input type="image" name="img" src="images/logo.gif" alt="logo" >


      • 10.11.8 Zone de saisie de texte : input type="text"


Le formulaire :
(28_SaisieTexte)

<html>
<body>
<form action="28_script.php" method="post" >
    Remplissez les cases ci-dessous :<br><br>
    <input type="text" name="champ1" value="Entrez votre nom ici"><br>
    <!--value="Entrez votre nom ici" est la valeur par défaut //-->
    <input type="submit" name="Submit" value="Soumettre la requête">
</form>
</body>
</html>


Voici à quoi ressemble ce formulaire : p10.11.8-1

Page de récupération des données :
(28_script.php)

<html>
<body>
<?php 
echo "Page de récupération des données :<br><br>";
$nom = ($_POST["champ1"]);
$nom = htmlentities($nom, ENT_QUOTES);
/* htmlentities convertit les caractères spéciaux tels que (<) (>) et (&) en (<) (>) et (&) de sorte qu’ils soient affichés, et non interprétés, par le 
navigateur. ENT_QUOTES rend les guillemets et les apostrophes lisibles par le navigateur */
echo "Votre nom est $nom <br>";
?>
</body>
</html>


Et voici le résultat : p10.11.8-2


      • 10.11.9 Champs pour mots de passe : input type="password"


<input type="password" name="mot_de_passe" size="8" >

Le mot de passe restera caché, mais attention, il ne faut pas utiliser de valeur par défaut (value) ou faire transiter ce mot de passe par la méthode GET, sinon il redeviendrait visible.


      • 10.11.10 Champs cachés : input type="hidden"


<input type="hidden" name="identifiant" value="62" >

Le champ caché sert à envoyer une valeur à l’insu de l’utilisateur, et sans qu’il puisse la modifier. Les champs cachés sont utiles pour stocker des données dans les formulaires en plusieurs pages, ils permettent de n’effectuer le traitement qu’à la toute dernière page, et ce, pour éviter des données incomplètes ou incohérentes.


      • 10.11.11 Taille de la saisie et du texte : size, maxlength, <textarea>…</textarea>


Taille dynamique de la zone de saisie : avec l’attribut size

<?php 
$t = 'Nombre d'articles disponibles en stock :';
/* en général ce titre est récupéré dans une base de données */
$s = strlen($t) ;
/* strlen détermine la longueur de la chaîne */ 
echo '<input type="text" name="t" value=" ' .$t. ' " size=" ' .$s. ' ">' ;
/* ce qui permet d’adapter dynamiquement la taille de la boite de saisie */
?>


La taille du texte : la limiter avec l’attribut maxlength

<input type="text" name="login" maxlength="8" value="eda"><br>

Attention l’attribut maxlength n’empêchera pas un hacker d’envoyer une donnée trop longue : il faut donc contrôler la taille dans nos scripts de gestion.

Une grande zone de texte : avec les balises <textarea> ... </textarea> Le formulaire :
(30_SaisieGrandTexte.php)

<html>
<body>
<form action="30_script.php" method="post" ><p>
	Contenu de l'article :<br><br>
	<textarea name="texte_long" rows="10" cols="50">
	Valeur par défaut éventuelle
	</textarea><br>
	<input type="submit" name="Submit" value="Soumettre la requête">
</p></form>
</body>
</html>


Voici à quoi ressemble ce formulaire :

p10.11.11-1

Page de récupération des données :
(30_script.php)

<html>
<body>
<?php 
echo "Page de récupération des données :<br><br>";
$nom = ($_POST["texte_long"]);
$nom = htmlentities($nom, ENT_QUOTES);
/* htmlentities convertit les caractères spéciaux tels que (<) (>) et (&) en (<) (>) et (&) de sorte qu’ils soient affichés, et non interprétés, par le 
navigateur. ENT_QUOTES rend les guillemets et les apostrophes lisibles par le navigateur */
echo "Votre article donne ceci : <br>  $nom";
$txt = nl2br($_POST["texte_long"]);
$txt = htmlentities($txt, ENT_QUOTES);
echo "<br><br>Avec les sauts de ligne pour affichage XHTML : <br>  $txt";
$nl = array("\r\n","\r","\n");
$txt2 = str_replace($nl, "<br>\n", $_POST["texte_long"]);
$txt2 = htmlentities($txt2, ENT_QUOTES);
echo "<br><br>Et avec les sauts de ligne pour affichage HTML : <br>  $txt2";
?>
</body>
</html>


Et voici le résultat :

p10.11.11-2


      • 10.11.12 Cases à cocher : input type="checkbox"


La case à cocher permet de choisir 0, 1, 2 ou plusieurs options parmi une série de propositions. A présent c’est vous-mêmes qui définissez les réponses possibles. Le formulaire :
(31_caseacocher.php)

<html>
<body>
<form action="31_script.php" method="post" ><p>
	Sélectionnez les équipements que vous possédez déjà :<br><br>
	<input type="checkbox" name="qcm1" value="j’ai un ordinateur" checked>Un ordinateur<br>
	<!-- Pour la case à cocher le type="checkbox" //-->
	<!-- La valeur d’une case est "on" si elle est cochée sinon il n’y a aucune valeur comme si la case n’était pas présente //-->
	<!-- checked veut dire que, par défaut, la case est cochée //-->
	<input type="checkbox" name="qcm2" value="j’ai internet ADSL">Une connexion internet ADSL<br>
	<input type="checkbox" name="qcm3" value="j’ai une CB">Un moyen de paiement en ligne, CB, etc<br>
<input type="submit" name="Submit" value="Soumettre la requête">
</p></form>
</body>
</html>


Voici à quoi ressemble ce formulaire :

p10.11.12-1

Page de récupération des données :
(31_script.php)

Suivant que la case est cochée ou non, le champ ‘qcm1’ renvoie dans la variable $_POST la valeur de value ‘JeSuisMembre’ ou rien du tout.

<html>
<body>
<?php 
echo "Page de récupération des données :<br><br>";
if (isset($_POST["qcm1"]))
/* la case est cochée */
	$qcm1 = $_POST["qcm1"];
	else
	$qcm1 = "Je n'ai pas d'ordinateur";
if (isset($_POST["qcm2"]))
	$qcm2 = $_POST["qcm2"];
	else
	$qcm2 = "Je n'ai pas de connexion internet ADSL";
if (isset($_POST["qcm3"]))
	$qcm3 = $_POST["qcm3"];
	else
	$qcm3 = "Je n'ai pas de moyen de paiement en ligne, CB, etc";
/* Une case à cocher ne pose pas de problème de sécurité, la fonction ‘htmlentities’ est donc inutile */
	echo "Question 1 $qcm1 <br>";
	echo "Question 2 $qcm2 <br>";
	echo "Question 3 $qcm3 <br>";
?>
</body>
</html>


Et voici le résultat :
p10.11.12-2


      • 10.11.13 Boutons radio : input type="radio"


Les boutons radio fonctionnent exactement de la même manière que les cases à cocher, la seule différence c’est qu’ils ne permettent qu’un seul choix (pour les boutons radio ayant le même nom).

Le formulaire :
(32_boutonsradio.php)

<html>
<body>
<form action="32_script.php" method="post" ><p>
    Vous êtes : <br>
    <input type="radio" name="etatcivil" value="Marie" checked>Marié(e) <br>
    <input type="radio" name="etatcivil" value="Celibataire">Célibataire <br>
    <input type="radio" name="etatcivil" value="Divorce">Divorcé(e) <br>
    <input type="submit" name="Valider" value="Valider">
</p></form>
</body>
</html>



Page de récupération des données :
(32_script.php)

<html>
<body>
<?php 
echo "Page de récupération des données :<br><br>";
$etatcivil = $_POST["etatcivil"];
/* Un bouton radio ne pose pas de problème de sécurité, la fonction ‘htmlentities’ est donc inutile */
switch ($etatcivil)
{
case "Marie" : 
	$etatcivil = "Marié(e)";
	break ;
case "Celibataire" : 
	$etatcivil = "Célibataire";
	break ;
case "Divorce" :
	$etatcivil = "Divorcé(e)";
	break ;
}
;
	echo "Vous êtes :  $etatcivil <br>";
?>
</body>
</html>

      • 10.11.14 Liste de sélection déroulante : <select>…</select>


Elle permet de faire un choix dans une liste d’éléments affichés.

Le formulaire :
(33_listederoulante.php)

<html>
<body>
<form action="33_script.php" method="post" ><p>
    Votre salaire mensuel : sélectionnez et envoyez <br>
<select name="salaire" size="3">
<!-- size="3" permet d'afficher 3 lignes de la liste déroulante //-->
<!--si size est omis ou si size="1" nous n’afficherons qu’une ligne de la liste //-->
    <option value="1">Moins de 1000 € </option>
    <option value="2" selected>Entre 1000 et 2000 € </option>
	<!-- selected veut dire que ceci est le choix par défaut //-->
	<!-- pour cocher dynamiquement l'option, nous pouvons remplacer "selected" par un code php comme ceci,//-->
	<?php/* if ($selection == 2) echo 'selected'; */?>
    <option value="3">Entre 2000 et 4000 € </option>
    <option value="4">Plus de 4000 € </option>
</select>
    <input type="submit" name="Submit" value="Envoyer" >
</p></form>
</body>
</html>


Voici à quoi ressemble ce formulaire avec size="3":

p10.11.14-1

Si size n’est pas précisée ou si size="1"nous n’aurons qu’une ligne de la liste affichée :

p10.11.14-2

Page de récupération des données :
(33_script.php)

<html>
<body>
<?php 
echo "Page de récupération des données :<br><br>";
$salaire = $_POST["salaire"];
/* Une liste déroulante ne pose pas de problème de sécurité, la fonction ‘htmlentities’ est donc inutile */
switch ($salaire)
{
case "1" : 
	$salaire = "moins de 1000 €";
	break ;
case "2" : 
	$salaire = "entre 1000 et 2000 €";
	break ;
case "3" :
	$salaire = "entre 2000 et 4000 €";
	break ;
case "4" :
	$salaire = "plus de 4000 €";
	break ;
}
;

	echo "Vous gagnez $salaire par mois <br>";
?>
</body>
</html>

      • 10.11.15 Envoi de fichiers et d’images : input type="file"


L’administrateur d’un site d’e-commerce, par exemple, peut très bien envoyer la nouvelle image d’un produit ou un fichier PDF contenant sa description détaillée. On utilise pour cela la balise <input type="file"> mais en plus, dans la balise <form> l’attribut enctype="multipart/form-data" nous permet de préciser que les données envoyées ne sont pas du texte.

Le formulaire :
(34_envoifichiers.php)

<html>
<body>
<form action="34_script.php" method="post" enctype="multipart/form-data"><p>
<!-- seule la méthode post est possible pour envoyer des fichiers //-->
    Formulaire d’envoi de fichiers et d’images : <br>sélectionnez et envoyez <br>
    <input type="file" name="fichier" size="40" >
    <input type="submit" value="Envoyer" >
</p></form>
</body>
</html>


Page de récupération des données :
Pour récupérer le fichier on utilise la super globale $_FILES[] de php. C’est un tableau associatif à 2 dimensions : en premier on a le nom de champ du formulaire (name="fichier" dans notre cas) et en second des informations sur le fichier transmis.
Dans la page de récupération des données il faut aussi sauvegarder ce fichier, le traiter, le copier, le redimensionner, etc.
move_uploaded_file() déplace le fichier depuis son emplacement temporaire sur le serveur jusqu’à sa destination finale.

(34_script.php)

<html>
<body>
<?php 
echo "Page de récupération des données :<br><br>";
set_time_limit("30");
/* remet le compteur à zéro et ajoute 30 secondes au temps déjà écoulé */
ignore_user_abort();
/* Si l'utilisateur arrête le téléchargement en cours, ou se déconnecte, le script php se terminera quand même */
$nom_fichier = $_FILES['fichier'] ['name'];
/* nom et adresse d’origine du fichier sur le disque utilisateur */
$taille = $_FILES['fichier'] ['size'];
/* taille du fichier en octets */
$tmp = $_FILES['fichier'] ['tmp_name'];
/* nom et adresse du fichier temporaire sur le serveur (fichier détruit à la fin du script) */
$type = $_FILES['fichier'] ['type'];
/* type mime du fichier */
$erreur = $_FILES['fichier'] ['error'];
/* code d’erreur associé au téléchargement */

echo "Nom d’origine =>  $nom_fichier <br>";
echo "Taille =>  $taille octets <br>";
echo "Adresse temporaire sur le serveur =>  $tmp <br>";
echo "Type de fichier =>  $type <br>";
echo "Code erreur =>  $erreur. <br>";

$adresse_destination = './pict/'.$nom_fichier;
move_uploaded_file($tmp, $adresse_destination);
/* $tmp = on prend le fichier temporaire sur le serveur (le fichier est détruit à la fin du script) */
/* $adresse_destination = c'est là où le fichier sera sauvegardé sur le serveur, ici le répertoire www/pict/ */
/* dans $adresse_destination on a conservé le nom du fichier d’origine : bien entendu il faut gérer et changer 
ce nom pour éviter que deux utilisateurs envoient deux fichiers différents portant le même nom. 
Il convient aussi de vérifier que l’extension du fichier est celle qui est attendue */
echo "Adresse destination => $adresse_destination<br><br>";
/* Détection d’erreurs */
if ($erreur = $_FILES['fichier'] ['error']) 
{
    echo "Une erreur s’est produite<br>" ;
    if ($erreur == UPLOAD_ERR_INI_SIZE)
echo "Fichier plus gros que le maximum autorisé par PHP<br>" ;
    elseif ($erreur == UPLOAD_ERR_FORM_SIZE)
echo "Fichier plus gros qu’indiqué dans le formulaire<br>" ;
    elseif ($erreur == UPLOAD_ERR_PARTIAL)
echo "Téléchargement interrompu avant la fin, merci de réessayer<br>" ;
    elseif ($erreur == UPLOAD_ERR_NO_FILE)
echo "Aucun fichier n’a été téléchargé<br>" ;
} else echo "<b>Téléchargement du fichier réussi !</b>" ;
?>
</body>
</html>

      • 10.11.16 Une calculatrice


(36_calculatrice.php)

<?php
// récupération des variables 
echo '<pre>';
/* print_r($_POST); */
if (isset($_POST["nnb1"]))
{
echo '</pre>';
$nnb1 = $_POST['nnb1']; 
$op = $_POST['op']; 
$nnb2 = $_POST['nnb2'];
if(!empty($nnb1) && !empty($nnb2) ){
switch($op)
{
    case "plus":
    $resultat=$nnb1+$nnb2;
	$ope = "+";
    $sel1 = 'selected';
    break;
    case "moins":
    $resultat=$nnb1-$nnb2;
	$ope = "-";
    $sel2 = 'selected';
    break;
    case "mult":
    $resultat=$nnb1*$nnb2;
	$ope = "*";
    $sel3 = 'selected';
    break;
    case "div":
	$ope = "/";
    $resultat=$nnb1/$nnb2;
    $sel4 = 'selected';
    break;
}
echo 'Résultat : '.$nnb1.' '.$ope.' '.$nnb2.' = '.$resultat.'<br><br>';
echo 'Autre opération ?<br><br>';
/*
*/
} else { 
// S'il y a des champs vides 
echo 'merci de remplir les champs nombres et de choisir un operateur'; 
}
}
?>
<html>
<body>
<form action="36_calculatrice.php" method="post">
<input type="text" name="nnb1" value="">opérande
<select name="op">
<option selected value="plus">+</option>
<option selected value="moins">-</option>
<option selected value="mult">*</option>
<option selected value="div">/</option>
</select>opérateur
<input type="text" name="nnb2" value="">2<sup>e</sup> opérande
<input type="submit" value="Calculer">
</form>
</body>
</html>

GrandTraitBleu1180x12.gif
BoutonHautDePage

10.12 Formulaires d’envoi de mails

      • 10.12.1 Un envoi de mail tout simple


Je n’ai pas réussi à le faire fonctionner en local sur ma machine Windows, mais il marche très bien quand je le mets sur le serveur de mon hébergeur.

(35_form_mail1.php)

<?php
     /* adresse de l'expéditeur ci-dessous */
     $headers ='From: "nom"<mon.adresse@monhebergeur.fr>'."\n";
     $headers .='Reply-To: mon.adresse@monhebergeur.fr'."\n";
     $headers .='Content-Type: text/plain; charset="iso-8859-1"'."\n";
     $headers .='Content-Transfer-Encoding: 8bit';
     $message ='Un message de test ici'; 
     /* adresse du destinataire ci-dessous */
     if(mail('mon.adresse@monhebergeur.fr', 'Sujet', $message, $headers))
     {
          echo 'Le message a bien été envoyé';
     }
     else
     {
          echo 'Le message n\'a pas pu être envoyé';
     }
?>

      • 10.12.2 Un envoi de mail qui récupère les données d’un formulaire


(35_form_mail2.php)


<?php
$nom = "";
$prenom = "";
$tel = "";
$mail = "";
$subject = "";
$message = "";
$msg_nom = "";
$msg_mail = "";
if($_POST){
	//Récupération des données du formulaire----------------------------
	$nom = $_POST["nom"];
	$prenom = $_POST["prenom"];
	$tel = $_POST["tel"];
	$mail = $_POST["mail"];
	$subject = $_POST["subject"];
	//------------------------------------------------------------------

     $destinataire = "mon.adresse@monhebergeur.fr";
	 $expediteur   = $mail;
     $message .= $_POST['nom']."\n";
     $message .= $_POST['prenom']."\n";
     $message .= $_POST['tel']."\n";
     $message .= $_POST['mail']."\n";
     $message .= $_POST['message']."\n";
     /* adresse de l'expéditeur ci-dessous c'est à dire le Site Web */
     /* $headers ='From: "SiteWeb"<mon.adresse@monhebergeur.fr>'."\n"; */
     $headers ='From: "SiteWeb"<mon.adresse@monhebergeur.fr>'."\n";
     $headers .='Reply-To: mon.adresse@monhebergeur.fr'."\n";
     $headers .='Content-Type: text/plain; charset="iso-8859-1"'."\n";
     $headers .='Content-Transfer-Encoding: 8bit';
     /* adresse du destinataire ci-dessous */
     if(mail($destinataire, $subject, $message, $headers))
     {
          echo 'Le message a bien été envoyé';
     }
     else
     {
          echo 'Le message n\'a pas pu être envoyé';
     }
}
?>
<form name="form_mail" method="post" action="35_form_mail2.php">
  <table>
    <tr> 
      <td colspan="2"><span style="color: red">( * : Champs obligatoires )</span></td>
    </tr>
    <tr> 
      <td >Nom <span style="color: red">*</span> : </td>
      <td><input name="nom" type="text" value="<?php print $nom; ?>">
	  <?php echo $msg_nom; ?>
	</td>
    </tr>
    <tr> 
      <td>Prénom :</td>
      <td><input name="prenom" type="text" value="<?php print $prenom; ?>"></td>
    </tr>
    <tr> 
      <td>Tel :</td>
      <td><input name="tel" type="text" value="<?php print $tel; ?>"></td>
    </tr>
    <tr> 
      <td>Email <span style="color: red">*</span> :</td>
      <td><input name="mail" type="text" value="<?php print $mail; ?>"><?php echo $msg_mail; ?>;</td>
    </tr>
    <tr> 
      <td >Sujet du message :</td>
      <td><textarea name="subject" rows="1" ><?php print $subject; ?></textarea></td>
    </tr>
    <tr> 
      <td >Texte du message :</td>
      <td><textarea name="message" rows="5" ><?php print $message; ?></textarea></td>
    </tr>
    <tr> 
      <td> </td>
      <td> 
	  	<input name="verif" type="submit" value="Valider">
        <input name="effacer" type="reset" value="Effacer">
	  </td>
    </tr>
  </table>
</form>

      • 10.12.3 Un envoi de mail complet qui teste la validité des champs


(35_form_mail3.php)

<?php
	// Vérifie la syntaxe d'une adresse mail 
	function is_email($email)
	{
		return preg_match('/^[^@]+@[a-zA-Z0-9._-]+\.[a-zA-Z]+$/', $email);
	}
		/* preg_match($pattern, $email); */
		/* Analyse email pour trouver l'expression qui correspond à pattern */
		/* return retourne TRUE si vrai */
		/* voir dans http://php.net/manual/fr/function.preg-match.php */
		/* Exemple preg_match("/@/i", $email); vérifie si $email contient un @ */
		/* Si on prend le modèle username@domain.tld */
		/* Se lit de la façon suivante */
		/* username:  au moins 1 caractère qui ne soit pas un @ */
		/* domain: au moins 1 caractère et qui ne contienne que des caractères valides. */
		/* tld: au moins 1 caractère, alphabétique seulement 
		(ce n'est pas tout à fait sûr que les nouvelles conventions que TLD permettront 
		ne nécessitent pas d'élargir à d'autres caractères que les alphanumériques). */
$nom = "";
$prenom = "";
$tel = "";
$mail = "";
$subject = "";
$message = "";
$msg_nom = "";
$msg_prenom = "";
$msg_mail = "";
$msg_message = "";
if($_POST){

	//Récupération des données du formulaire----------------------------
	$nom = $_POST["nom"];
	$prenom = $_POST["prenom"];
	$tel = $_POST["tel"];
	$mail = $_POST["mail"];
	$subject = $_POST["subject"];
	$message = $_POST["message"];
	if (preg_match("/\r/i",$nom) || preg_match("/\n/i",$nom))
	{
	die("Ni retour à la ligne ni en début de ligne, champ nom : (");
	/* le script est stoppé grâce à une fonction die() si l'expediteur contient "\r" ou "\n". "\n" 
	"\n" c'est le saut à la ligne, et "\r" correspond à CR "Carriage Return", le retour en début de ligne.*/
	}
	if (preg_match("/\r/i",$prenom) || preg_match("/\n/i",$prenom))
	{
	die("Ni retour à la ligne ni en début de ligne, champ prenom : (");
	}
	if (preg_match("/\r/i",$tel) || preg_match("/\n/i",$tel))
	{
	die("Ni retour à la ligne ni en début de ligne, champ tél : (");
	}
	if (preg_match("/\r/i",$mail) || preg_match("/\n/i",$mail))
	{
	die("Ni retour à la ligne ni en début de ligne, champ mail : (");
	}
	if (preg_match("/\r/i",$subject) || preg_match("/\n/i",$subject))
	{
	die("Ni retour à la ligne ni en début de ligne, champ subject : (");
	}
	//------------------------------------------------------------------
	
	//Gestion des erreurs de saisie-------------------------------------
    /*Vérifier la validité des champs du formulaire */
    $valide_form = TRUE;
    if ( $_POST['verif'] ) // le formulaire doit etre vérifié
	{
		if ( !$_POST['nom']) // le nom n'est pas renseigné
		{
			$msg_nom = '<span style="color: red">Veuillez entrez votre nom ici</span><br>';
            $valide_form = FALSE;
		}		
		if ( !$_POST['prenom']) // le prénom n'est pas renseigné
		{
			$msg_prenom = '<span style="color: red">Veuillez entrez votre prenom ici</span><br>';
            $valide_form = FALSE;
		}		
		if ( !is_email($_POST['mail']) ) // le mail n'est pas correct
		{
			$msg_mail = '<span style="color: red">Veuillez vérifier votre adresse mail ici</span><br>';
            $valide_form = FALSE;
		}
		if ( !$_POST['message']) // il n'y a aucun message
		{
			$msg_message = '<span style="color: red">Veuillez entrez votre message ici</span><br>';
            $valide_form = FALSE;
		}		
	}



	//------------------------------------------------------------------
    if ( $_POST['verif'] && $valide_form === TRUE )
	{
        // Création du message avec les données du formulaire
		$message = $_POST['nom']."\n";
		$message .= $_POST['prenom']."\n";
		$message .= $_POST['tel']."\n";
		$message .= $_POST['mail']."\n";
		$message .= $_POST["subject"];
		$message .= $_POST['message']."\n";
        // Création des entêtes
		/* adresse de l'expéditeur ci-dessous c'est à dire le Site Web*/
		$headers ='From: "SiteWeb"<mon.adresse@monhebergeur.fr>'."\n";
		$headers .='Reply-To: mon.adresse@monhebergeur.fr'."\n";
		$headers .= 'MIME-Version: 1.0' . "\n"; 
		$headers .='Content-Type: text/plain; charset="iso-8859-1"'."\n";
		/* $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\n"; */
		$headers .='Content-Transfer-Encoding: 8bit';
		/* adresse du destinataire ci-dessous*/
		$destinataire = "mon.adresse@monhebergeur.fr";
        // envoi du mail
        $resultat = mail($destinataire, $subject, $message, $headers);
		if($resultat) {
			echo "<h3>Le message a bien été envoyé</h3>";
			/* Redirige le client vers la page suivante */
			/* header("Location: 35_form_mail_suite2.php?nom=".$nom); 
			Note : header ne marche que si les entêtes n’ont pas été déjà envoyées */
			/* Par contre çà, çà marche à tous les coups : */
			/* echo "<a href=\"35_form_mail_suite2.php\" title=\"Retour à la page d'accueil\">
			<h3>Cliquez ici pour revenir à l'accueil</h3></a><br>";*/
			/* Autre solution plus "élégante" ... */
			$nom = urlencode($nom);
			$prenom = urlencode($prenom);
			/* urlencode prend en charge les caractères spéciaux */
			echo "<meta http-equiv='refresh' content='2; url=35_form_mail_suite2.php?nom=$nom&prenom=$prenom'>";
			/*  le 3 détermine le nombre de secondes ou l'ancienne page doit rester affichée à l'écran. Si ce nombre est égal à 0, 
			la redirection est instantanée.*/
			exit();
		} else {
			echo "<span style='color: red'>Le message n'a pas pu être envoyé</span>";
		}
		/* Garantie que le code ci-dessous n'est jamais exécuté.
		exit(); */
	
	}else{
		$nom = $_POST['nom'];
		$prenom = $_POST['prenom'];
		$tel = $_POST['tel'];
		$mail = $_POST['mail'];
		$subject = $_POST["subject"];
		$message = $_POST["message"];
        echo "<span style='color: red'>Le message n'a pas pu être envoyé</span>";
	}
	//------------------------------------------------------------------
}
?>
<form name="form_mail" method="post" action="35_form_mail3.php">
  <table>
    <tr> 
      <td colspan="2"><span style="color: red">( * : Champs obligatoires )</span></td>
    </tr>
    <tr> 
      <td >Nom <span style="color: red">*</span> : </td>
      <td><input name="nom" type="text" value="<?php print $nom; ?>">
	  <?php echo $msg_nom; ?>
	</td>
    </tr>
    <tr> 
      <td>Prénom <span style="color: red">*</span> :</td>
      <td><input name="prenom" type="text" value="<?php print $prenom; ?>">
	  <?php echo $msg_prenom; ?>
	</td>
    </tr>
    <tr> 
      <td>Tel :</td>
      <td><input name="tel" type="text" value="<?php print $tel; ?>"></td>
    </tr>
    <tr> 
      <td>Email <span style="color: red">*</span> :</td>
      <td><input name="mail" type="text" value="<?php print $mail; ?>">
	  <?php echo $msg_mail; ?>
	</td>
    </tr>
    <tr> 
      <td >Sujet du message :</td>
      <td><textarea name="subject" rows="1" ><?php print $subject; ?></textarea></td>
    </tr>
    <tr> 
      <td >Texte du message <span style="color: red">*</span> :</td>
      <td><textarea name="message" rows="5" ><?php print $message; ?></textarea>
	  <?php echo $msg_message; ?>
	</td>
    </tr>
    <tr> 
      <td> </td>
      <td> 
	  	<input name="verif" type="submit" value="Envoyez le message">
	  </td>
    </tr>
  </table>
</form>


Et la page sur laquelle on est redirigé
(35_form_mail_suite2.php)

<p>Votre message va maintenant être traité, nous vous en remercions, 
<br>vous allez recevoir notre réponse dans les meilleurs délais.</p>
<?php
$nom = urldecode($_GET['nom']);
$prenom = urldecode($_GET['prenom']);
echo 'Merci cher(e) ', $prenom, ' ', $nom;
?>

GrandTraitBleu1180x12.gif
BoutonHautDePage

10.13 Les fichiers

      • 10.13.1 Inclure les données d’un fichier texte : include() ou include_once()


Pour inclure des fichiers ou des bibliothèques, on peut utiliser l’instruction include() ou include_once(). Par exemple ce peut être un fichier Copyright, ou le fichier de configuration contenant les paramètres d’accès à la base de données, etc.

(03_includefilecontent.php) :

<html>
<body>
<center>Include file content : 
<?php
include("03_copyright.txt"); 
?>
</center>
</body>
</html>


et (03_copyright.txt) :
Copyright © 2011 PHP France. Tous droits réservés.

Autre exemple :
fichier (03_a_inclure.inc.php)

<?php
echo 'nous habitons Orsay dans l\'Essonne<br> ' ;
?>


Et le fichier principal (03_a_inclusion.php)

<?php
echo 'Dans quelle région habitez-vous ? <br> ' ;
include('03_a_inclure.inc.php') ; 
echo 'Oh quelle belle région !<br> ' ;
?>

      • 10.13.2 Lecture d’un fichier texte : file_get_contents() ou file()


file_get_contents() prend en argument le nom et l’adresse du fichier et retourne son contenu sous forme d’une chaîne de caractères. Syntaxe :

<?php
$contenu_fichier = file_get_contents('monfichier.txt') 
echo $contenu_fichier;
?>


file() prend en argument le nom et l’adresse du fichier et retourne son contenu dans un tableau ligne à ligne. Syntaxe :

<?php
$tab = file('monfichier.txt') ;
foreach($tab as $ligne)
{
echo $ligne '<br>' ;
}
?>

      • 10.13.3 Lecture d’un fichier de configuration : parse_ini_file()


Le fichier de configuration :
(40_test.ini)
; les commentaires commencent par un point virgule
; Fichier test.ini [text]

accept=*.gif,*.jpg,*.png,*.txt,*.log,*.mid,*.wav,*.zip
ignore=*.exe,*.com,*.bat,*.dll,*.ini,*.vbs,*.js,*.htm,*.html,*.php
network=Undernet
commandchar=/
linesep=-
timestamp=[HH:nn]
theme=mIRC Classic
[dirs]
logdir=logs\

Lecture du fichier de configuration :
(40_LectureFichierConfig) parse_ini_file() prend en argument le nom et l’adresse d’un fichier de configuration et retourne son contenu sous forme d’un tableau associatif. Syntaxe :

<?php
/* Lecture du fichier de configuration 40_test.ini */
$tab = parse_ini_file('40_test.ini') ;
echo 'Fichiers acceptés : '.$tab['accept']. '<br>' ;
echo 'Fichiers ignorés : '.$tab['ignore']. '<br>' ;
echo 'En vrac : <br>' ;
print_r ($tab) ;
/* Autre présentation */
$tab = parse_ini_file('40_test.ini',TRUE) ;
/* Si le 2e paramètre (optionnel) de parse_ini_file est TRUE, parse_ini_file analyse aussi les sections (mots entre crochets) */
echo '<pre>' ;
print_r ($tab) ;
echo '</pre>' ;
?>

      • 10.13.4 Lecture d’un fichier CSV issu d’un tableur : fgetcsv()


Pour lire un fichier CSV (Comma Separated Values) issu d’un tableur (Excel ou Open Office), il faut d’abord l’ouvrir avec fopen(), puis fgetcsv() permet de lire une ligne du fichier.
Arguments :
fgetcsv(nom_fichier, nbmax_caract_ligne, " ;") ;

Le fichier *.csv :
(41_Fichierdetableur.csv)

Titre;Page
Pour commencer;3
Détails de votre installation;3
À quoi sert le PHP;3
Balises d'ouverture - fermeture;3
Commentaires;3
Le point virgule;3
Apostrophes et guillemets;3
Variables et constantes;4
Les $variables;4
Les CONSTANTES;4
Quelques Gadgets;4
Afficher la date du jour;4
Validité d’une date saisie;5
Temps d’exécution d’un script php;5
Récupérer mon adresse IP;6
Les opérateurs;6
Les opérations;6
"Le Modulo '$a % 2 ;'";7
Opérateurs d'incrémentation;7
Opérateurs de concaténation;7
Opérateurs de comparaison;7
Opérateurs logiques :;7


Le fichier de lecture d’un fichier CSV :
(41_LectureFichierCSV.php)

<?php
/* Lecture du fichier 41_Fichierdetableur.csv */
$fp = fopen('41_Fichierdetableur.csv', 'a+') ;
while ($tab = fgetcsv($fp, 1000, ";") )
{
print_r ($tab) ;
}
/* Autre présentation */
echo "<br>";
$row = 1 ;
$fp = fopen('41_Fichierdetableur.csv', 'r') ;
while ($data = fgetcsv($fp, 1000, ";") )
{
	$num = count ($data) ;
	print "<b>$num champs dans la ligne $row :</b><br>\n" ;
	$row++ ;
	for ($c=0; $c < $num; $c++)
	{
	print $data[$c] . "<br>\n" ;
	}
}
fclose ($fp) ;
?>

      • 10.13.5 Ecriture dans un fichier : file_put_contents()


Arguments :
file_put_contents ('nom_fichier.txt', "chaîne contenue dans le fichier $var", FILE_APPEND) ;

La chaîne est alors écrite dans le fichier en écrasant ce qui préexistait.
L’option FILE_APPEND permet d’ajouter ce contenu à la fin.


      • 10.13.6 Ouverture d’un fichier : fopen()


fopen('nom_adresse_fichier.txt', 'mode') ; ouvre un fichier.

Le paramètre mode spécifie le type d'accès
'r' Ouvre en lecture seule, et place le pointeur de fichier au début du fichier.
'r+' Ouvre en lecture et écriture, et place le pointeur de fichier au début du fichier.
'w' Ouvre en écriture seule ; place le pointeur de fichier au début du fichier et réduit la taille du fichier à 0. Si le fichier n'existe pas, on tente de le créer.
'w+' Ouvre en lecture et écriture ; place le pointeur de fichier au début du fichier et réduit la taille du fichier à 0. Si le fichier n'existe pas, on tente de le créer.
'a' Ouvre en écriture seule ; place le pointeur de fichier à la fin du fichier. Si le fichier n'existe pas, on tente de le créer.
'a+' Ouvre en lecture et écriture ; place le pointeur de fichier à la fin du fichier. Si le fichier n'existe pas, on tente de le créer.
'x' Crée et ouvre le fichier en lecture seule ; place le pointeur de fichier au début du fichier. Si le fichier existe déjà, fopen() va échouer, en retournant FALSE et en générant une erreur de niveau E_WARNING. Si le fichier n'existe pas, fopen() tente de le créer. Ce mode est l'équivalent des options O_EXCL|O_CREAT pour l'appel système open(2) sous-jacent. Cette option est supportée à partir de PHP 4.3.2 et fonctionne uniquement avec des fichiers locaux.
'x+' Crée et ouvre le fichier pour lecture et écriture; le comportement est le même que pour 'x'.
'c' Ouvre le fichier pour écriture seulement. Si le fichier n'existe pas, il sera crée, s'il existe, il n'est pas tronqué (contrairement à 'w') et l'appel à la fonction n'échoue pas (comme dans le cas de 'x'). Le pointeur du fichier est positionné au début. Ce mode peut être utile pour obtenir un verrou (voyez flock()) avant de tenter de modifier le fichier, utiliser 'w' pourrait tronquer le fichier avant d'obtenir le verrou (vous pouvez toujours tronquer grâce à ftruncate()).
'c+' Ouvre le fichier pour lecture et écriture, le comportement est le même que pour le mode 'c'.
'b' lorsque vous travaillez avec des fichiers binaires, sinon vous pourriez rencontrer des problèmes avec vos données, comme des images corrompues ou des caractères \r\n inopinés.


      • 10.13.7 Verrouillage d’un fichier : flock()


flock — Verrouille le fichier : un système simple de verrous écriture/lecture, qui peut être utilisé sur n'importe quelle plate-forme (Unix et Windows compris).

L’opération peut prendre une des valeurs suivantes :
   ♦ LOCK_SH pour acquérir un verrou partagé (lecture).
   ♦ LOCK_EX pour acquérir un verrou exclusif (écriture).
   ♦ LOCK_UN pour libérer un verrou (partagé ou exclusif).
Il est également possible d'ajouter
   ♦ LOCK_NB comme masque d'une des opérations précédentes si vous ne voulez pas que la fonction flock() bloque durant le verrouillage. (non supporté sous Windows)

Exemple 1 :

<?php
$fp = fopen("/tmp/lock.txt", "r+");
if (flock($fp, LOCK_EX)) { // pose un verrou exclusif
    ftruncate($fp, 0);     // effacement du contenu
    fwrite($fp, "Écrire dans un fichier\n");
    flock($fp, LOCK_UN);   // libère le verrou
} else {
    echo "Impossible de verrouiller le fichier !";
}
fclose($fp);
?>


Exemple 2 : flock() en utilisant l'option LOCK_NB

<?php
$fp = fopen('/tmp/lock.txt', 'r+');
/* Activation de l'option LOCK_NB lors d'une opération LOCK_EX */
if(!flock($fp, LOCK_EX | LOCK_NB)) {
    echo 'Impossible d\'obtenir le verrou';
    exit(-1);
}
/* ... */
fclose($fp);
?>

      • 10.13.8 Tronquer un fichier : ftruncate()


ftruncate — Tronque un fichier bool ftruncate ( resource $handle , int $size )
Prend le pointeur de fichier handle et le tronque à la taille de size.

Exemple :

<?php
$filename = 'lorem_ipsum.txt';
$handle = fopen($filename, 'r+');
ftruncate($handle, rand(1, filesize($filename)));
rewind($handle);
echo fread($handle, filesize($filename));
fclose($handle);
?>

      • 10.13.9 Fermer un fichier : fclose()


Quand on a fini d’utiliser un fichier, il faut le fermer pour libérer les ressources système.
Arguments :

fclose('monfichier.txt') ;


      • 10.13.10 Lire un fichier : fread()


Arguments :

fread('nom_adresse_fichier.txt', nboctets) ; lit un fichier entier et retourne une chaîne de caractères.

<?php
/* lecture de 45 octets d'un fichier */
$fp = fopen ("monfichier.txt", "rb");
$s = fread( $fp, 45 ) ;
echo "les 42 premiers caractères sont : $s <br>" ;
if ( strlen($s) < 45 ) echo "le fichier contient moins de 42 caractères" ;
?>

      • 10.13.11 Ecrire dans un fichier : fwrite()


Arguments :

fwrite('nom_adresse_fichier.txt', 'chaine', nboctets) ; écrit dans un fichier une chaîne de caractères.

<?php
/* écrire dans un fichier */
$fp = fopen ("monfichier.txt", "ab");
$var = 'Le beaujolais nouveau est arrivé !' ;
fwrite( $fp, $var, 9 ) ;
/* on écrit 9 octets seulement, la fin du texte est donc ignorée */
echo $s ;
?>

      • 10.13.12 Taille d’un fichier : filesize()


Arguments :

filesize('nom_adresse_fichier.txt') ; retourne la taille en octets du fichier.

<?php
/* lecture de tout un fichier en mesurant sa taille avec filesize()  */
$fp = fopen ("monfichier.txt", "rb");
$s = fread( $fp, filesize('monfichier.txt') ) ;
echo $s ;
?>

GrandTraitBleu1180x12.gif
BoutonHautDePage

10.14 Fichiers et gestion documentaire


Voici un exemple d’utilisation de fichiers dans le cadre d’une gestion de documents partagés par plusieurs utilisateurs. Chaque utilisateur doit pouvoir modifier le document, le script gère les numéros de version et avertit si 2 personnes ont modifié la même version. A ce stade il n’est pas nécessaire d’utiliser une base de données.

Définir :
L’interface pour envoyer un fichier par formulaire
L’interface pour récupérer les initiales de la personne qui modifie le fichier

Structure des noms de fichiers :
nomDocument-VersionNo-initialesDernierAuteur.extension


      • 10.14.1 Le formulaire


(43_GEDenvoifichiers.php)

<?php 
/* session_start();
On définit ici par défaut les initiales de l'auteur
Pour bien faire il faudrait ouvrir une session mais nous verrons cela plus loin */
?>
<html>
<head><title>Envoi de fichier</title></head>
<body>
<form action="43_GEDscript.php" method="post" enctype="multipart/form-data">
<!-- seule la méthode post est possible pour envoyer des fichiers //-->
<p>
    Formulaire d’envoi de fichiers et d’images : <br><br>
	Entrez vos initiales ci-dessous :<br>
    <input type="text" name="initialesAuteur" value="xx"><br>
    <!--value est la valeur par défaut //-->
    <br>sélectionnez le fichier modifié et envoyez<br> 
	<input type="file" name="fichier" >
    <input type="submit" value="Envoyer" >
<!-- Attention, il faudra vérifier que le nom des fichiers est conforme à la structure : //-->
<!-- nomDocument-VersionNo-initialesDernierAuteur.extension//-->
</p>
</form>
</body>
</html>

      • 10.14.2 La page de récupération des données


(43_GEDscript.php)

<html>
<body>
<?php 
echo "Page de récupération des données :<br><br>";
/* remet le compteur à zéro et ajoute 30 secondes au temps déjà écoulé */
set_time_limit("30");
/* si l'utilisateur arrête le téléchargement en cours, ou se déconnecte, le script php se terminera quand même */
ignore_user_abort();
/* nom et adresse d’origine du fichier sur le disque utilisateur */
$initialesAuteur = $_POST['initialesAuteur'];
/* echo "initialesAuteur : $initialesAuteur<br><br>"; */
$nom_fichier = $_FILES['fichier'] ['name'];
/* taille du fichier en octets */
$taille = $_FILES['fichier'] ['size'];
/* nom et adresse du fichier temporaire sur le serveur (fichier détruit à la fin du script) */
$tmp = $_FILES['fichier'] ['tmp_name'];
/* type mime du fichier */
$type = $_FILES['fichier'] ['type'];
/* code d’erreur associé au téléchargement */
$erreur = $_FILES['fichier'] ['error'];
// -----------------------------------------------------------------------------
/* on ne garde que le nom du fichier, pas son chemin d'accès */
$nom_fichier = basename($nom_fichier);
/* on récupère l'extension du fichier (après le dernier point de la chaîne) */
$dernierPoint = strrpos($nom_fichier, '.');
$extension = substr($nom_fichier, $dernierPoint);
$nom_fichier = substr($nom_fichier, 0, $dernierPoint);
/* on récupère les initiales du précédent auteur */
$dernierTiret = strrpos($nom_fichier, '-') ;
$ancienAuteur = substr($nom_fichier, $dernierTiret +1);
$nom_fichier = substr($nom_fichier, 0, $dernierTiret);
/* on récupère le numéro de l'ancienne version */
$dernierTiret = strrpos($nom_fichier, '-');
$ancienneVersion = substr($nom_fichier, $dernierTiret +1);
$nom_fichier = substr($nom_fichier, 0, $dernierTiret);
/* le reste est le nom du document */
$document = $nom_fichier;
// -----------------------------------------------------------------------------
/* dans le répertoire, voyons maintenant quelle est la dernière version de ce document */
$versionActuelle = 0 ;
foreach(glob($document.'-*-*'.$extension) as $fichier)
{
$debut = strpos($fichier, '-' ) +1;
$longueur = strrpos($fichier, '-' ) - $debut;
$version = substr($fichier, $debut, $longueur );
if($version > $versionActuelle)
	{
	$versionActuelle = $version;
	$fichierActuel = $fichier;
	}
}
// -----------------------------------------------------------------------------
/* interprétation et envoi des résultats ci-dessus à l'utilisateur */
session_start();
if($versionActuelle > $ancienneVersion)
	{
	echo "Le document a été modifié depuis votre dernière visite. <br>";
	echo "Merci de récupérer la dernière version ($fichier), <br>";
	echo "de la mettre à jour et de la renvoyer.";
	}else{
	$fichier = $document
			.'-'.($ancienneVersion +1)
			.'-'.$initialesAuteur
			.$extension;
	}
// -----------------------------------------------------------------------------
/* l'adresse de destination = $fichier, c'est là où le fichier sera sauvegardé sur le serveur */
/* echo "Adresse de destination = $fichier<br><br>"; */
move_uploaded_file($_FILES['fichier']['tmp_name'], $fichier);
/* détection d’erreurs */
if ($erreur = $_FILES['fichier'] ['error']) 
{
    echo "Une erreur s’est produite<br>" ;
    if ($erreur == UPLOAD_ERR_INI_SIZE)
	echo "Fichier plus gros que le maximum autorisé par PHP<br>" ;
    elseif ($erreur == UPLOAD_ERR_FORM_SIZE)
	echo "Fichier plus gros qu’indiqué dans le formulaire<br>" ;
    elseif ($erreur == UPLOAD_ERR_PARTIAL)
	echo "Téléchargement interrompu avant la fin, merci de réessayer<br>" ;
    elseif ($erreur == UPLOAD_ERR_NO_FILE)
	echo "Aucun fichier n’a été téléchargé<br>" ;
}else{
	echo "<b>Fichier correctement mis à jour vers $fichier</b>" ;
}
?>
</body>
</html>

GrandTraitBleu1180x12.gif
BoutonHautDePage

10.15 Les cookies


Les cookies sont des petits fichiers texte (faisant au maximum 65 Ko) sauvegardés par le navigateur sur la station utilisateur et qui permettent de conserver des informations sur un utilisateur : se souvenir de son nom pour lui éviter de le ressaisir à la prochaine authentification, ou à des fins statistiques, ou se souvenir des informations d’un formulaire pour lui éviter de les ressaisir la prochaine fois, ou le pré remplir, se souvenir des sites visités, etc.
Toutefois, les données sensibles et confidentielles ne doivent pas être stockées dans des cookies, car ces derniers sont accessibles et modifiables par l’utilisateur.



Une seule fonction gère les cookies :

setcookie (nomcookie, valeur, dureeDeVie) ;
   ♦ valeur est une chaîne
   ♦ dureeDeVie du cookie : 24 heures => time()+ 60*60*24
On accède aux cookies à l’aide du tableau $_COOKIE[]

Exemple 1 :
(45_cookies.php)

<?php
/* Attention, dans php.ini => output_buffering = 0 */
/* Attention, aucun texte HTML ne doit être envoyé avant le cookie */
/* En début de code, pas de blancs */
setcookie('langage', 'PHP version 5', time()+ 60*60*24);
/* time()+ 60*60*24 => cookie à durée  de vie 24 heures */
?>
<html>
<head>
<title>Les cookies</title></head>
<body>
<?php
/* Vérifions si le cookie a été reçu */
if(isset($_COOKIE['langage']))
{
/* Dans le cas où le cookie existe */
echo '<p>un cookie a été envoyé</p>';
echo '<p>son nom est langage</p>';
/* Lecture et affichage du contenu du cookie */
echo '<p>Son contenu est : ';
echo $_COOKIE['langage'];
echo '</p>';
}else{
/* Autrement c'est que le cookie n'a pas été reçu */
echo '<p>Aucun cookie du nom de langage n\'a été reçu</p>';
}
echo '<p>Liste de tous les cookies :</p>';
echo '<pre>';
print_r($_COOKIE);
echo '</pre>';
echo'<br/>';
?>
</body>
</html>


Exemple 2 :
(45_cookie2.php)

<?php
if (@setcookie('langage','PHP version 5'))
{
?>
<html>
<head>
<title>Un cookie envoyé</title>
</head>
<body>
<p>Un cookie a été envoyé</p>
<p>son nom est langage</p>
<p>son contenu est PHP version 5</p>
</body>
</html>
<?php
}else{
?>
<html>
<head>
<title>Erreur cookie</title>
</head>
<body>
<p>Erreur cookie</p>
</body>
</html>
<?php
}
?>


Pour effacer un cookie on envoie un cookie de même nom, ou avec un temps de vie dépassé.

Exemple :
(45_cookieSuppr.php)

<?php
/* Si un cookie compteur de visites existe */
If ( isset( $_COOKIE['visites']))
{
/* On demande au navigateur d'effacer son cookie */
setcookie('visites');
/* Ou
setcookie('visites', 0,1);
cookie valable jusqu’au 01/01/1970 à 00h00 et 1 seconde demande au navigateur d'effacer son cookie */
/* On efface aussi la valeur du cookie en local pour éviter de l'utiliser par erreur dans la suite du script */
unset( $_COOKIE['visites']);
}
?>


On souhaite créer une page spéciale destinée à recevoir la commande semestrielle d'un client.
Après une identification, le client remplit un formulaire, et valide sa commande.
Chaque semestre la commande est quasi-similaire à part pour quelques champs (qqté, lieu, etc.)
Pour ne pas obliger le client à tout ressaisir à chaque fois, on va stocker dans un cookie un historique de chaque champ.
(C’est aussi utile si les commandes viennent à se multiplier) !...
Source : http://www.commentcamarche.net/forum/affich-6385941-php-formulaire-cookies#q=formulaire+cookie&cur=1&url=%2F

Exemple :
(45_cookieForm1.php)

<?php
$nom = "";
$msg_nom = "";
$prenom = "";
$msg_prenom = "";
$mail = "";
$msg_mail = "";
//------------------------------------------------------------------
If (isset($_POST['nom'])) {
		$nom = $_POST['nom'];
		$prenom = $_POST['prenom'];
		$mail = $_POST["mail"];
		$contenu = "$nom && $prenom && $mail";
		// on définit une durée de vie de notre cookie (en secondes), donc un an dans notre cas
		$temps = 365*24*3600;
		// on envoie un cookie de nom pseudo portant la valeur de la variable $nom, c'est-à-dire la valeur qu'a saisi la personne qui a 
		rempli le formulaire
		setcookie ("pseudo", $contenu, time() + $temps);
echo '<span style="color: red"><b>Vos données personnelles sont bien notées!</b></span><br>';
echo '<span style="color: red">Vous pouvez encore les vérifier et les modifier ci-dessous</span><br>';
echo '<span style="color: red">Sinon cliquez sur \'Accès direct à la page d\'accueil du site\'</span><br>';
/* echo 'Contenu = '.$contenu.' !'; */
//------------------------------------------------------------------
	// Vérifie la syntaxe d'une adresse mail 
	function is_email($email)
	{
		return preg_match('/^[^@]+@[a-zA-Z0-9._-]+\.[a-zA-Z]+$/', $email);
	}
	/* le script est stoppé grâce à une fonction die() si l'expediteur contient "\r" ou "\n". "\n" 
	"\n" c'est le saut à la ligne, et "\r" correspond à CR "Carriage Return", le retour en début de ligne.*/
	if (preg_match("/\r/i",$nom) || preg_match("/\n/i",$nom))
	{
	die("Ni retour à la ligne ni retour début de ligne, champ nom : (");
	}
	if (preg_match("/\r/i",$prenom) || preg_match("/\n/i",$prenom))
	{
	die("Ni retour à la ligne ni retour début de ligne, champ prenom : (");
	}
	if (preg_match("/\r/i",$mail) || preg_match("/\n/i",$mail))
	{
	die("Ni retour à la ligne ni en début de ligne, champ mail : (");
	}
	//------------------------------------------------------------------
	// Gestion des erreurs de saisie-------------------------------------
    /* Vérifier la validité des champs du formulaire */
    $valide_form = TRUE;
    // le formulaire doit etre vérifié
		if ( !$_POST['nom']) //le nom n'est pas renseigné
		{
			$msg_nom = '<span style="color: red">Il manque votre nom ici</span>';
            $valide_form = FALSE;
		}		
		if ( !$_POST['prenom']) //le prénom n'est pas renseigné
		{
			$msg_prenom = '<span style="color: red">Il manque votre prénom ici</span>';
            $valide_form = FALSE;
		}		
		if ( !is_email($_POST['mail']) ) //le mail n'est pas correct
		{
			$msg_mail = '<span style="color: red">Veuillez vérifier votre adresse mail ici</span><br>';
            $valide_form = FALSE;
		}
	//------------------------------------------------------------------
		// fonction nous permettant de faire des redirections
		function redirection($url){
			if (headers_sent()){
				print('<meta http-equiv="refresh" content="0;URL='.$url.'">');
			}
			else {
				header("Location:$url");
			}
		}
		/* on effectue une redirection vers la page d'accueil 
		redirection ('45_cookieForm2.php'); */
}
/* else {
		echo 'La variable du formulaire n\'est pas déclarée.';
} */
?>
<html>
<head>
<title>Formulaire du site</title>
<body>
<?php
// on teste la déclaration de notre cookie
if (isset($_COOKIE['pseudo'])) {
		/* echo 'Bonjour '.$_COOKIE['pseudo'].' !'; */
		$pseudo = explode(" && ", $_COOKIE['pseudo']); // On extrait les données séparées par des &|&
		/* echo 'print_r($pseudo) = ';
		print_r($pseudo);*/
		$nom = $pseudo[0];
		$prenom = $pseudo[1];
		$mail = $pseudo[2];
		echo 'Bonjour '.$prenom.', Merci de revenir sur notre site!<br>';
} else {
		echo 'Merci de mettre à jour vos données personnelles si besoin, puis cliquer sur envoyer.<br>';
		/* si le cookie n'existe pas, on affiche un formulaire permettant au visiteur de saisir son nom 
		echo '<form action="45_cookieForm1.php" method="post">';
		echo 'Votre nom : <input type = "texte" name = "nom" value="<?php echo $nom; ?>"><br />';
		echo 'Votre prénom : <input type = "texte" name = "prenom" value="<?php echo $prenom; ?>"><br />';
		echo '<input type = "submit" value = "Envoyer">';</form>*/
}
?>

<!-- Si le cookie n'existe pas, on affiche un formulaire permettant au visiteur de saisir son nom, etc. //-->
<br><span style="color: red">( * : Champs obligatoires )</span>
<form action="45_cookieForm1.php" method="post">
	<table width=600 border=1>
	<tr>
	<td width=200 border=\"1\">
		Votre nom de famille <span style="color: red">(*)</span>
	</td>
	<td width=400 border=\"1\">
		<input type = "text" name = "nom" value="<?php echo $nom; ?>">
		<?php echo $msg_nom; ?>
	</td>
	</tr>
	<tr>
	<td>
		Votre prénom <span style="color: red">(*)</span>
	</td>
	<td>
		<input type = "text" name = "prenom" value="<?php echo $prenom; ?>">
		<?php echo $msg_prenom; ?>
	</td>
	</tr>
    <tr> 
	<td>
		Votre adresse mail <span style="color: red">(*)</span>
	</td>
    <td>
		<input name="mail" type="text" value="<?php print $mail; ?>">
		<?php echo $msg_mail; ?>
	</td>
    </tr>
	<tr>
	<td>
	</td>
	<td>
		<input type = "submit" value = "Envoyer vos informations personnelles"><br>
	</td>
	</tr>
</form>
</table>
		<br><input type="button" value="Effacer toutes vos informations personelles" name="LeLien1" 
		onclick="self.location.href='45_cookieForm1_kill.php'" style="background-color:#ececec" style="color:white; font-weight:bold"onclick><br> 
		<br><input type="button" value="Accès direct à la page d'accueil du site" name="LeLien1" 
		onclick="self.location.href='45_cookieForm1.php'" style="background-color:#ececec" style="color:white; font-weight:bold"onclick><br> 
</body>
</html>


Pour détruire le cookie :
(45_cookieForm1_kill.php)

<?php
	setcookie ("pseudo", $_POST['nom'], time() + $temps);
	unset( $_COOKIE["pseudo"]);
	// fonction nous permettant de faire des redirections
	function redirection($url){
		if (headers_sent()){
		print('<meta http-equiv="refresh" content="0;URL='.$url.'">');
		}else {
		header("Location:$url");
		}
	}
	// on effectue une redirection vers la page d'accueil
	redirection ('45_cookieForm1.php');
?>


On crée dans le répertoire cookies une page "46_NbVisites.php". Cette page crée un cookie qui compte le nombre de visites de l’utilisateur sur la page. On affiche ce nombre sur la page.

Comptage de visites :
(46_NbVisites.php)

<?php
if (!isset($_COOKIE['TestCookie'])) {
$valeur_cookie = 1;
}else{
$valeur_cookie = $_COOKIE['TestCookie'] + 1;
}
setcookie('TestCookie', $valeur_cookie ); // Incrémentation de la valeur du cookie
echo 'Bonjour, ceci est votre ';
echo $valeur_cookie;
echo 'e visite. Merci !';
?>


Destruction du cookie :
(46_NbVisites_kill.php)

<?php
	setcookie ('TestCookie');
	unset( $_COOKIE['TestCookie']);
?>


On crée un système qui permet au visiteur de choisir pour un an la couleur de fond du site parmi une sélection.

L’interface graphique d’une page :
(47_interface.php)

<?php
/* Toute premiere apparition sur la page*/
if (isset($_COOKIE['titre_cookie'])) {
	echo '<br>Il y a un cookie défini pour titre_cookie';
$titre_cookie = $_COOKIE['titre_cookie'];
}else{
//titre par défaut: Bienvenue
	echo '<br>Il n\'y a pas de cookie défini pour titre_cookie';
	echo '<br>Dans ce cas, j\'en crée un !';
$titre_cookie = '<h1>Bienvenue</h1>';
setcookie('titre_cookie', $titre_cookie ); // Création d'un cookie
}
if (isset($_COOKIE['couleur_cookie'])) {
	echo '<br>Il y a un cookie défini pour couleur_cookie';
$couleur_cookie = $_COOKIE['couleur_cookie'];
}else{
//couleur par défaut: Blanc
	echo '<br>Il n\'y a pas de cookie défini pour couleur_cookie';
	echo '<br>Dans ce cas, j\'en crée un !';
$couleur_cookie = '#fcfcfc';
setcookie('couleur_cookie', $couleur_cookie ); // Création d'un cookie
}
if (isset($_GET['titre'])) {
// Création du cookie pour le titre
if ($_GET['titre'] != '') {
	$titre_cookie = $_GET['titre'];
	/* echo 'titre_cookie = ';
	echo $titre_cookie;*/
	$titre_cookie = '<h1>'.$titre_cookie.'</h1>';	
	// Mise à jour du cookie
	setcookie('titre_cookie', $titre_cookie, time()+3600*24*365);
}
}
if (isset($_GET['couleur'])) {
// Création du cookie pour la couleur
if ( $_GET['couleur'] != '' )
{
	switch ($_GET['couleur'])
	{
		case 'rouge' : 
		$couleur_cookie = '#CC0000';
		break;
		case 'bleu' : 
		$couleur_cookie = '#0033CC';
		break;
		case 'vert' : 
		$couleur_cookie = '#009933';
		break;
		case 'orange' : 
		$couleur_cookie = '#FF6600';
		break;
		case 'jaune' : 
		$couleur_cookie = '#FFFF33';
		break;
		case 'blanc' : 
		$couleur_cookie = '#FCFCFC';
		break;
	}
	/* echo 'couleur_cookie = ';
	echo $couleur_cookie;*/
	// Mise à jour du cookie
	setcookie('couleur_cookie', $couleur_cookie, time()+3600*24*365);
}
}
	echo '<br>titre_cookie = ';
	echo htmlentities($titre_cookie);
	echo '<br>couleur_cookie = ';
	echo $couleur_cookie;
?>
<html>
<head>
<title>Cookie : Personnalisation d'interface</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor ="<?php echo $couleur_cookie; ?>">
<center><?php echo $titre_cookie; ?>;</center><br>

choix de la couleur de fond :<br>
<a href=47_interface.php?couleur=rouge>rouge</a><br>
<a href=47_interface.php?couleur=bleu>bleu</a><br>
<a href=47_interface.php?couleur=vert>vert</a><br>
<a href=47_interface.php?couleur=orange>orange</a><br>
<a href=47_interface.php?couleur=jaune>jaune</a><br>
<a href=47_interface.php?couleur=blanc>blanc</a><br>
<br>
<br>

choix du titre :<br>
<a href=47_interface.php?titre=Salut>Salut</a><br>
<a href=47_interface.php?titre=Bienvenue>Bienvenue</a><br>
<a href=47_interface.php?titre=Bonjour>Bonjour</a><br>
<a href=47_interface.php?titre=Hello>Hello</a><br>
<a href=47_interface.php?titre=Welcome>Welcome</a><br>
</body>
</html>


Pour détruire le cookie :
(47_interface_kill.php)

<?php
	setcookie('couleur_cookie',0,1);
	unset( $_COOKIE['couleur_cookie']);
	setcookie('titre_cookie',0,1);
	unset( $_COOKIE['titre_cookie']);
?>

GrandTraitBleu1180x12.gif
BoutonHautDePage

10.16 Les sessions


Les données sensibles et confidentielles ne doivent pas être stockées sur la machine utilisateur dans des cookies, car ces derniers sont accessibles et modifiables par l’utilisateur. Les sessions sont mieux adaptées à la sauvegarde de données confidentielles ou importantes telles que:
- L’authentification d’un visiteur ;
- Les données de l’utilisateur tant qu’il reste connecté à l’application ;
- Le panier d’achats du visiteur d’un site marchand ;
- Les formulaires en plusieurs parties, pour retenir les informations fournies par l’utilisateur dans les pages précédentes.
Toutefois, les sessions ne sont pas faites pour durer : après la visite de l’internaute, et dès la fermeture du navigateur, la session est perdue (comme un cookie sans date d’expiration).

      • 10.16.1 Comment marche une session


Contrairement aux cookies, PHP stocke les informations d’une session sur le serveur (et non plus sur la machine utilisateur). Le visiteur se voit attribuer un identifiant. Et chaque fois que le visiteur revient en annonçant son identifiant, PHP restitue toutes les informations qu’il avait sauvegardées à propos de ce visiteur.

Processus simplifié :
1) Le client (machine utilisateur) fait une première demande de page ;
2) Le serveur crée un identifiant de session, stocke les informations de sessions dans un fichier de sessions qui a pour nom cet identifiant, puis répond en renvoyant la page et l’identifiant de session ;
3) Ensuite le client peut refaire une 2e demande de page avec l’identifiant de session ;
4) L’identifiant de session permet au serveur de récupérer les données dans le fichier de sessions qui a pour nom cet identifiant.
5) Le serveur répond en renvoyant la page et l’identifiant de session.


      • 10.16.2 Lecture et écriture de sessions


Pour créer une session il faut d’abord initialiser la session avec :
session_start();
Note : Quand on fait session_start(); PHP cherche l’identifiant attribué à l’utilisateur dans un cookie nommé par défaut PHPSESSID. Si ce cookie n’existe pas, un nouvel identifiant aléatoire est créé puis envoyé au navigateur dans un cookie sans date d’expiration (donc éphémère).

L’initialisation doit se faire dans tous les scripts PHP qui utilisent les sessions, pas seulement le premier. Quand ceci est fait, on peut lire et écrire dans la variable super globale :
$_SESSION['...']
Cette variable super globale est un tableau dans lequel on peut ajouter, enlever ou modifier autant de variables (ou autres) que l’on veut.

Exemple : code à placer avant l’entête, et à mettre dans toutes les pages sécurisées.
(48_session.php)

<?php
// Initialisation de la session => A PLACER EN HAUT DU SCRIPT !
session_start();
// On teste d'abord si la variable 'langage' est présente  dans la session
if (isset($_SESSION['langage'])) {
echo 'langage existe dans la session et sa valeur est ';
echo $_SESSION['langage'];
} else {
echo 'langage n\'existe pas dans la session donc je la crée';
// Sinon on écrit la variable 'langage' dans la session
$_SESSION['langage'] = 'PHP5';
// On peut stocker des tableaux, des nombres, du texte, des objets (sans avoir à les sérialiser)
$tableau = array('un', 'deux', 'trois', 'quatre');
$_SESSION['tab'] = $tableau;
}
echo '<br>identifiant créé : ', session_id(),'<br>' ;
?>

      • 10.16.3 Suppression d’une session : session destroy();


Normalement c’est inutile puisque PHP efface automatiquement les fichiers sessions inutilisés depuis plus d’une heure et demie.
Cependant session_destroy(); efface le fichier de données, mais pas les variables contenues dans $_SESSION[], ni le cookie.

Exemple :
(49_session_destroy.php)

<?php
// Initialisation de la session.
// Si vous utilisez un autre nom
// session_name("autrenom")
session_start();
// Et on efface les variables contenues dans $_SESSION[]
$_SESSION = array(); // ou unset ( $_SESSION);
// Si vous voulez détruire complètement la session, effacez également
// le cookie de session.
// Note : cela détruira la session et pas seulement les données de session !
if (isset($_COOKIE[session_name()])) {
    setcookie(session_name(), '', time()-42000, '/');
}
// Finalement, on détruit la session.
session_destroy();
?>

      • 10.16.4 Autres instructions (facultatives)
echo '<br>L\'identifiant créé est : ', session_id(),'<br>' ; // donne l’id de session
session_regenerate_id() // régénère l’id à chaque aller-retour ce qui sécurise un peu plus
session_name('client') // le nom de la session sera 'client'
session_save_path() // donne l’adresse du répertoire temporaire de stockage des données session
session_save_path('/tmp') // le nom du répertoire de stockage des sessions sera tmp
session_set_cookie_params(nomcookie, valeur, dureeDeVie) /* Où le nomcookie et la valeur sont facultatifs 
(PHP leur donne le nom et l’identifiant de la session). Durée de vie du cookie : 24 heures => time()+ 60*60*24 */

      • 10.16.5 Quelques règles de sécurité


1) Stocker les sessions dans un répertoire privé : Dans le cas d’un serveur partagé, il ne faut laisser à quiconque l’accès aux sessions. Pour cela il faut définir, pour stocker les sessions, un répertoire auquel vous seul avez accès :
session.save_path = "/home/user/repertoire/personnel"

2) Ne pas utiliser la fonction de réécriture des liens dans l’URL. Dans un tel cas l’identifiant de session figurerait en clair dans la barre d’adresses et serait trop facile à pirater.

3) Les identifiants par défaut créés par PHP suffisent : évitez de définir vous-mêmes les identifiants de session même si PHP vous le permet.

4) Attaque par "fixation de session" : un attaquant peut fournir à la victime, avant qu’elle s’authentifie, un numéro de session connu. Il peut ainsi bénéficier de son authentification ensuite. La parade consiste à faire appel à :
- session_regenerate_id() à chaque fois, avant d’authentifier le visiteur, ou avant de stocker pour la première fois des informations très confidentielles ;
- session.use_only_cookie dans le fichier de configuration de PHP.

5) Vérifier l’identité de l’utilisateur : en plus de son nom, stockez dans la session son adresse IP, la version de son navigateur, etc. Ceci est insuffisant, mais ajoute des difficultés à notre attaquant.

6) Ne pas stocker le mot de passe dans la session : Stockez dans la session le nom du visiteur, mais pas le mot de passe lui-même : vérifiez juste si le mot de passe est valide.


GrandTraitBleu1180x12.gif
BoutonHautDePage

10.17 Utiliser une base de données MySQL

      • 10.17.1 La structure d'une base de données


Une base de données contient une ou plusieurs table(s).

Table abonnés
Table clients
Base de données     


Une table contient plusieurs enregistrements.

Table abonnés
nom-1 r-1
nom-2 r-2
nom-3 r-3
Table clients
Base de données     


Un enregistrement contient un ou plusieurs champs. Et un champ contient des données.

Table abonnés
nom-1 r-1
nom-2 r-2
nom-3 r-3
Table clients
Base de données     

      • 10.17.2 Les formats des données en MySQL


Les données numériques :
Elles peuvent être signées (signed) ou non signées (unsigned).

   Type de champ    Description
   TINYINT    Très petit entier. Compris entre -128 et 127 en signed et entre 0 et 256 en unsigned.
   SMALLINT    Petit entier. Compris entre -32 768 et 32 0767 en signed et entre 0 et 65535 en unsigned.
   MEDIUMINT    Entier moyen. Compris entre -8 388 608 et 8 388 607 en signed et entre 0 et 16 777 215 en unsigned.
   INT    Entier. Compris entre 2 147 483 648 et 2 147 483 647 en signed et entre 0 et 4 294 967 295 en
   unsigned.
   BIGINT    Grand entier. Compris entre -9 233 372 036 854 et 9 223 372 036 854 775 807 en signed et entre
   0 et 18 446 744 073 709 551 615 en unsigned.
   FLOAT    Nombre à virgule flottante en précision simple. L'intervalle de validité va de -3.402823466E+38 à
   -1.175494351E-38 en signed et entre 0 et de 1.175494351E-38 à 3.402823466E+38 en unsigned.
   DOUBLE    Nombre à virgule flottante en précision double. L'intervalle de validité va de
   -1.7976931348623157E+308 à -2.2250738585072014E-308 en signed et de
   2.2250738585072014E-308 à 1.7976931348623157E+308 en unsigned.
   DECIMAL    Nombre à virgule flottante signé. Les nombres sont enregistrés sous forme de chaînes de caractères.


Pour plus de précisions, reportez-vous à la documentation de MySQL.


Les chaînes de caractères :

   Type de champ    Description
   CHAR(x)    Chaîne de caractères de longueur fixe où x (compris entre 1 et 256) est le nombre de caractères.
   VARCHAR(x)    Chaîne de caractères de longueur variable où x (compris entre 1 et 256) est le nombre de caractères.
   TINYTEXT    Chaîne de 256 caractères maximum.
   TEXT    Chaîne de 65 585 caractères maximum.
   MEDIUMTEXT    Chaîne de 16 777 215 caractères maximum.
   LONGTEXT    Chaîne de 4 294 967 295 caractères maximum.


Pour plus de précisions, encore une fois, reportez-vous à la documentation de MySQL.


      • 10.17.3 Les opérateurs de MySQL


Les opérateurs arithmétiques :

   Opérateur    Description
   +    Addition
   -    Soustraction
   *    Multiplication
   /    Division


Les opérateurs de comparaison :

   Opérateur    Description
   =    Egal
   !=    Inégal
   <    Inférieur
   <=    Inférieur ou égal
   >    Supérieur
   >=    Supérieur ou égal


Les opérateurs logiques :

   Opérateur    Description
   NOT ou |    NON logique
   OR ou ||    OU logique
   AND ou &&    ET logique

      • 10.17.4 PhpMyAdmin


PhpMyAdmin se présente comme un site Web (en local). C’est un ensemble de scripts PHP permettant de gérer facilement et visuellement la base de données MySQL sans devoir passer par l'apprentissage du langage SQL.

La page d’accueil de PhpMyAdmin se présente comme ceci :

p10.17.4

PhpMyAdmin peut ainsi :

     • Créer et supprimer des bases de données.
     • Créer, modifier et supprimer des tables.
     • Éditer et ajouter des champs.
     • Insérer des données.
     • Gérer de multiples utilisateurs avec des permissions différentes.


      • 10.17.5 Créer une base de données MySQL avec PhpMyAdmin
Pour la suite de l'apprentissage de MySQL, nous aurons besoin d'une base de données
que nous allons créer avec PhpMyAdmin.

Pour ouvrir PhpMyAdmin : Il faut cliquer sur la petite icône verte en bas à droite de votre
écran. p10.17.5-1

Un panneau (ci-contre à droite) vous permet alors d’accéder à peu près à tous les services,
y compris PhpMyAdmin. Cliquez sur PhpMyAdmin.
p10.17.5-2


Créons sur le serveur MySQL une base de données nommée "base1", comme ceci :

p10.17.5-3

Et voici le résultat :

p10.17.5-4


      • 10.17.6 Créer des tables dans une base de données MySQL avec PhpMyAdmin


Dans cette base de données, nous allons créer la table liste. La table liste comportera 3 champs :

     • un index id, un entier qui servira de clé primaire.
     • un champ nom qui pourra contenir une chaîne de 50 caractères.
     • un champ email qui pourra contenir une chaîne de 70 caractères.

p10.17.6-1

"Nombre de colonnes" correspond au nombre de champs, ici nous avons demandé 3 champs, il y aura donc 3 colonnes.

Cliquez sur Exécuter.

Sur l’écran suivant, définissez les caractéristiques de vos champs comme ceci :

p10.17.6-2

Quand c’est fait, cliquez sur Sauvegarder en bas à droite de la page.

PhpMyAdmin vous demande beaucoup d'informations mais il n'est pas nécessaire de tout remplir. La plupart du temps, les informations les plus utiles seront :

     • Champ : permet de définir le nom du champ (important !)
     • Type : le type de données que va stocker le champ (nombre entier, texte, date...)
     • Taille/Valeurs : permet d'indiquer la taille maximale du champ, utile pour le type VARCHAR notamment afin de limiter le nombre de caractères autorisés.
     • Index : active l'indexation du champ. Ce mot barbare signifie dans les grandes lignes que votre champ sera adapté aux recherches. Le plus souvent, on utilise l'index PRIMARY sur les champs de type id.
     • AUTO_INCREMENT : permet au champ de s'incrémenter tout seul à chaque nouvelle entrée. On l'utilise fréquemment sur les champs de type "id".

Remplissons donc le formulaire comme ci-dessus. Veillons à bien cocher AUTO_INCREMENT et à définir un index PRIMARY sur le champ id.
Une fois que c'est fait, cliquez sur le bouton Sauvegarder en bas de la page. Votre table est créée !

On obtient alors l’écran ci-dessous :

p10.17.6-3


      • 10.17.7 Les types de champs MySQL (PhpMyAdmin)

Si vous déroulez la liste des types de champs que vous propose MySQL, vous constaterez qu’ils sont très nombreux (voir ci-contre à droite). En fait, phpMyAdmin a eu la bonne idée de proposer au tout début de cette liste les 4 types de données les plus courants :

     • INT : nombre entier.
     • VARCHAR : court texte (entre 1 et 255 caractères).
     • TEXT : long texte (on peut y stocker un roman sans problème).
     • DATE : date (jour, mois, année).

Nous n'aurons besoin de jongler qu'entre ces 4 types, donc ce sont eux qu'il faut retenir. Ils couvriront 99% de nos besoins. Vous pouvez aussi garder en tête le type DOUBLE qui permet de stocker des nombres décimaux.


Alors que PHP ne propose que quelques types de données comme int, string, bool..., MySQL propose une quantité très importante de types de données. Les types de données sont classés par catégories :

     • NUMERIC : ce sont les nombres. On y trouve des types dédiés aux petits nombres entiers (TINYINT), aux gros nombres entiers (BIGINT), aux nombres décimaux, etc.
     • DATE and TIME : ce sont les dates et les heures. De nombreux types différents permettent de stocker une date, une heure, ou les deux à la fois.
     • STRING : ce sont les chaînes de caractères. Là encore, il y a des types adaptés à toutes les tailles.
     • SPATIAL : cela concerne les bases de données spatiales, utile pour ceux qui font de la cartographie. Ce ne sera pas notre cas, donc nous n'en parlerons pas ici.
p10.17.7-1

      • 10.17.8 Insérer un enregistrement de données avec PhpMyAdmin


Sélectionnez l’onglet "Insérer", puis remplissez la case "valeur" pour chaque champ, comme ceci :

p10.17.8-1

Cliquez sur "Exécuter" pour enregistrer cet élément de la base.

Cliquez sur l’onglet "Afficher" pour visualiser les champs ainsi créés :

p10.17.8-2


      • 10.17.9 Ajouter un champ à une table avec PhpMyAdmin


Sélectionnez l'onglet "Structure" de la table, puis choisissez "Ajouter 1 colonne" en fin de table, comme ceci :

p10.17.9-1

Cliquez sur "Exécuter" pour enregistrer ce nouveau champ de la base.


GrandTraitBleu1180x12.gif
BoutonHautDePage

10.18 Utiliser MySql depuis PHP

      • 10.18.1 Créer un utilisateur administrateur


Il est essentiel de sécuriser nos accès à la base de données.
     • User = admin01
     • Mot de passe = monmotdepasse
     • Droits = tous les droits
Ouvrez PhpMyAdmin, sélectionnez la base de test (base1), et cliquez sur l’onglet "Privilèges".

p10.18.1-1

Conservez l’utilisateur "root" et "ajoutez un utilisateur" entrez le nom, le serveur, le mot de passe comme indiqué. Donnez tous les privilèges sur la base de données (base1), et quant aux privilèges globaux, choisissez "Tout cocher", enfin, cliquez sur "exécuter" en bas à droite de l’écran.

p10.18.1-2

Revenez sur base1 et cliquez sur l’onglet "Privilèges" pour vérifier si vous trouvez maintenant deux utilisateurs, root, et admin1 que vous venez de créer. Assurez-vous que l’utilisateur admin1 a bien "Grant" = oui et c’est fini.


      • 10.18.2 Se connecter à la base de données MySql depuis PHP


La connexion MySQL s'effectue soit avec la méthode mysqli_ (appelée à disparaître à plus ou moins longue échéance) soit avec la méthode PDO (PHP Data Object). PDO est un socle commun standard à toutes les SGBD, cette méthode est donc recommandée car aussi, elle seule a de l’avenir ! - A chaque exemple nous vous proposons des exemples testés avec les deux méthodes.

PHP propose plusieurs moyens de se connecter à une base de données MySQL :
     • L'extension mysql_ : ce sont des fonctions obsolètes qui permettent d'accéder à une base de données MySQL et donc de communiquer
avec MySQL. Leur nom commence toujours par mysql_. Toutefois, ces fonctions ont vieilli et on recommande de ne plus les utiliser aujourd'hui.
     • L'extension mysqli_ : ce sont des fonctions améliorées d'accès à MySQL. Elles proposent plus de fonctionnalités et sont plus à jour.
     • L'extension PDO : c'est un outil complet qui permet d'accéder à n'importe quel type de base de données. On peut donc l'utiliser pour se
connecter aussi bien à MySQL que PostgreSQL ou Oracle.

p10.18.2-1


            10.18.2 - 1) Connexion MySQL - méthode orientée objet (PDO)

Pour se connecter depuis une page PHP à une base de données MySQL, on spécifie plusieurs paramètres :
     • L’hôte (le serveur sur lequel MySQL est installé). Par défaut, "localhost".
     • Le nom de la base de données. Obligatoire
     • Le login utilisateur ou Username. Par défaut, "root".
     • Le mot de passe. Par défaut, "".
Comme ceci :

<?php
$dbh = new PDO('mysql:host=localhost;dbname=base1', 'root', '');
// ou plus précisément
$dbh = new PDO('mysql:host=sql.hebergeur.com;dbname=mabase', 'pierre.durand', 's3cr3t');
?>


Script de connexion complet avec PDO :
(52_mysql_connect.php)

<?php
// définition des variables de connexion
$user    = 'root';
$pass      = '';
$dsn = 'mysql:host=localhost;dbname=base1';
// Connexion à la base de données avec PDO (PHP Data Object)
try {
	$dbh = new PDO($dsn, $user, $pass);
} catch (PDOException $e) {
	die( "Erreur ! : ". $e->getMessage() );
}
echo 'Vous êtes connecté au serveur et à la base<br>';
?>


Bien entendu il serait utile d’inclure ce code dans un fichier externe, que nous vous recommandons de nommer connexion.inc.php et qu'il suffirait d'appeler ensuite à chaque script. Pour appeler cette librairie depuis n’importe quel script, il suffit d’y ajouter : include("connexion.inc.php") ou dans notre exemple, include("52_mysql_connect.php")


            10.18.2 - 2) Connexion MySQL - méthode procédurale (mysqli)

(51_connexion.inc.php)

<?php
$myserver   = 'localhost';
$mylogin    = 'root';
$mypwd      = 'xxxx';
$mybdd      = 'base1';
/* Connexion à la base de données */
$mysqli = new mysqli( $myserver, $mylogin, $mypwd, $mybdd );
/* Vérification de la connexion */
if (mysqli_connect_errno()) {
    printf("Échec de la connexion : %s\n", mysqli_connect_error());
    exit();
}
echo 'Vous êtes bien connecté au serveur et à la base<br>';
?>


La fonction retourne TRUE si la connexion est réussie et FALSE sinon. Il est recommandé de stocker le résultat de l'exécution de la fonction dans une variable et d'interrompre le processus en cas d’erreur.
L'utilisation de la fonction die() en cas d'erreur d'exécution. Si la fonction retourne la valeur 0 (c'est-à-dire s'il y a une erreur) la fonction die() [traduisez meurt] renvoie un message d'erreur. La fonction die() est équivalente à la fonction exit().


      • 10.18.3 Afficher le contenu d'une table depuis PHP

             10.18.3 - 1) Lire le contenu d’une table MySQL - méthode orientée objet (PDO)

Pour afficher le contenu d'une table, on se connecte à la base, puis on sélectionne la table (liste). On effectue la requête de sélection avec 'SELECT nom, email FROM liste' ou 'SELECT * FROM liste'. Puis il faut stocker le résultat de la requête (les enregistrements de la table) dans une variable, que l'on peut nommer $resultat et qui est donc un tableau associatif.


$sql = "SELECT * FROM liste";
$resultat = $dbh->query($sql);


Toutefois, la variable $resultat contient l'ensemble des enregistrements demandés dans un tableau et n'est donc pas exploitable telle quelle. On utilise donc la méthode (ou fonction) fetch() pour extraire les enregistrements du tableau :


$row = $resultat->fetch(PDO::FETCH_BOTH);


     • PDO::FETCH_OBJ => retourne un objet anonyme avec les noms de propriétés correspondant aux noms de colonnes.
     • PDO::FETCH_ASSOC => retourne un tableau associatif.
     • PDO::FETCH_BOTH => retourne un tableau indexé par les noms ET les numéros de colonnes. (valeur par défaut)

Note : fetchall() extrait d’un seul coup l’ensemble des données et libère MySql, et fetch() extrait les données séquentiellement.

L'affichage s'effectue ensuite par une boucle while qui parcourt les éléments du tableau associatif $row.

while ($row = $resultat->fetch(PDO::FETCH_BOTH)) {
echo $row['id'].' - '.$row['nom'].' - '.$row['email'].' - '.$row['age'].'<br>';
}


Voici le script complet avec la méthode PDO
(52_mysql_PDO_lire.php)

<?php
/* Connexion à la base de données */
include("52_MySQL_PDO_connect.php");
// On récupère tout le contenu de la table liste (de base1 où l'on s'est connecté)
// note, '*' après le SELECT,  veut dire 'tout sélectionner'
//avec 'SELECT nom, email FROM liste' on ne sélectionne que les champs nom et email dans la table liste
$sql = "SELECT * FROM liste";
$resultat = $dbh->query($sql);
echo '<br>Liste des enregistrements de la base :<br>';
// On affiche chaque entrée une à une
while ($row = $resultat->fetch(PDO::FETCH_BOTH)) {
/* print_r($row); */
echo $row['id'].' - '.$row['nom'].' - '.$row['email'].' - '.$row['age'].' ans<br>';
}
// Ne pas oublier de clore la connexion à la fin du script
$resultat->closeCursor();
// Fermeture de la connexion
$dbh = NULL;
?>
<html>
<head>
<title>Lecture de la table</title>
</head>
<body>
<br>
<input type="button" value="Retour à la page d'administration" name="LeLien1" onclick="self.location.href='52_MySQL_PDO_admin.php'" 
style="background-color:#ececec" style="color:white; font-weight:bold"onclick>
<br>
</body>
</html>


Ce script affiche toute la table liste qui contient quatre enregistrements :

p10.18.3-1


             10.18.3 - 2) Lire le contenu d’une table MySQL - méthode procédurale (mysqli)

Pour afficher le contenu d'une table, on se connecte d’abord à la base, puis on sélectionne la table (liste). On effectue la requête de sélection à l'aide de la fonction :

                  $mysqli->query("SELECT x, y, z FROM table LIMIT 10") ;


Puis il faut stocker le résultat de la requête (les enregistrements de la table) dans une variable, que l'on peut nommer $result, et qui est donc un tableau associatif :

                  $result = $mysqli->query("SELECT id, nom, email FROM liste LIMIT 10") ;


Toutefois, la variable $result contient l'ensemble des enregistrements demandés dans un tableau et n'est donc pas exploitable telle quelle. On utilise donc une autre fonction pour extraire les enregistrements du tableau :

                  $row = $result->fetch_array(MYSQLI_ASSOC) ;


     • MYSQLI_NUM => tableaux numériques
     • MYSQLI_ASSOC => tableaux associatifs
     • MYSQLI_BOTH => tableaux associatifs ET numériques

Ensuite on découpe les lignes de résultat et on les met dans un tableau associatif dans l'ordre où elles arrivent avec mysqli_fetch_array($result, MYSQLI_ASSOC). L'affichage s'effectue par une boucle while qui va parcourir les éléments du tableau. Enfin, $row est une variable de type tableau associatif.

                  while ( $row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
                  echo $row['id'].' - '.$row['nom'].' - '.$row['email'].'<br>';
                  }


Le script complet avec la méthode mysqli devient :
(52_MySQL_lire.php)

<?php
/* Connexion à la base de données */
include("51_connexion.inc.php");
/* Requête de sélection dans la base liste, puis on stocke les enregistrements de la table dans la variable $result.*/
/* La requête "Select" retourne un jeu de résultats */
$query = "SELECT id, nom, email FROM liste LIMIT 10";
$result = $mysqli->query($query);
if ($result = $mysqli->query($query)) {
    printf("Select a retourné %d lignes.\n", $result->num_rows);
}
echo '<br><br>Liste des enregistrements de la base :';
/* tableau numérique
$row = $result->fetch_array(MYSQLI_NUM);
 */
/* tableau associatif */
$row = $result->fetch_array(MYSQLI_ASSOC);
/* Traitement de la première ligne */
$id = $row["id"];
$nom = $row["nom"];
$email = $row["email"];
echo "<br>$id - $nom - $email<br>";
// on découpe les lignes de résultat et on les met dans un tableau associatif dans l'ordre où elles arrivent
while ( $row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
echo $row['id'].' - '.$row['nom'].' - '.$row['email'].'<br>';
}
/* tableau associatif ET numérique
$row = $result->fetch_array(MYSQLI_BOTH);
*/
/* Libération du jeu de résultats */
$result->close();
// Ne pas oublier de clore la connexion à la fin du script
$mysqli->close();
?>


Ce script affiche notre table liste qui contient à ce stade trois enregistrements :

p10.18.3-2


      • 10.18.4 Insérer des données à partir d'un formulaire depuis PHP


Dans un site dynamique, il est intéressant de prévoir la possibilité d'insérer des données en ligne. La requête INSERT INTO permet d'ajouter une entrée :

INSERT INTO liste(ID, nom, possesseur, console, prix, nbre_joueurs_max, commentaires) VALUES('', 'Battlefield 1942', 'Patrick', 'PC', 45, 50, 
'2nde guerre mondiale')


INSERT INTO = on veut insérer une entrée
liste = dans la table liste
Entre parenthèses = noms des champs dans lesquels vous souhaitez placer des informations
Note : on peut ne pas préciser les noms de champs, dans ce cas Il faut simplement lister les valeurs pour tous les champs sans exception (ID compris) dans le bon ordre.
VALUES = valeurs à insérer, dans le même ordre que les noms des champs indiqués
Les nombres (tels que 45 et 50 ici) n'ont pas besoin d'être entourés d'apostrophes. Seules les chaînes de caractères les nécessitent.


             10.18.4 - 1) Insérer des données dans une table MySQL - méthode orientée objet (PDO)

(52_mysql_PDO_insert.php)

<?php
if ( isset( $_POST['nom'] )) {
/* Connexion à la base de données avec PDO */
include("52_MySQL_PDO_connect.php");
$nom = $_POST['nom'];
$email = $_POST['email'];
$age = $_POST['age'];
// On ajoute une entrée dans la table liste à l’aide d’une requête préparée
$req = $dbh->prepare('INSERT INTO liste(nom, email, age) VALUES(:nom, :email, :age)');
$req->execute(array(
	'nom' => $nom,
	'email' => $email,
	'age' => $age
	));

echo '<span style="color: red">Le visiteur a bien été ajouté !</span>';
// Fermeture de la connexion
$dbh = NULL;
}
?>

<html>
<head>
<title>Insertion d'un enregistrement</title>
</head>
<body>
<br>Pour vous inscrire remplissez ces cases :<br>
<form method="post" action="52_MySQL_PDO_insert.php">
Nom : <input type="text" name="nom"><br>
Email : <input type="text" name="email"><br>
Âge : <input type="text" name="age"><br>
<input type="submit" name="submit" value="Je valide mon inscription"><br>
<br>
<input type="button" value="Retour à la page d'administration" name="LeLien1" onclick="self.location.href='52_MySQL_PDO_admin.php'" 
style="background-color:#ececec" style="color:white; font-weight:bold"onclick>
<br>
</form>
</body>
</html>


Un petit détour par PhpMyAdmin vous confirmera si l'enregistrement a bien été effectué.

p10.18.4-1


             10.18.4 - 2) Insérer des données dans une table MySQL - méthode procédurale (mysqli)

(52_MySQL_insert.php)

<?php
// La page d'insertion 
if ( isset( $_POST['nom'] )) {
include("51_connexion.inc.php");
$nom = $_POST['nom'];
$email = $_POST['email'];
$age = $_POST['age'];

// Préparation de la requete
$sql = "INSERT INTO liste (nom, email, age) VALUES ('$nom','$email','$age')";
// Envoi de la requête au serveur MySQL
mysqli_query($mysqli, $sql);
echo '<br>Nous avons bien enregistré votre inscription, merci.<br>';
echo '<br><a href = "52_MySQL_lire.php"><h1>Suite de la visite</h1></a><br>';
}
?>

<html>
<head>
<title>Formulaire d'inscription</title>
</head>
<body>
<br>Pour vous inscrire remplissez ces cases :<br>
<form method="post" action="52_mysql_insert.php">
Nom : <input type="text" name="nom"><br>
Email : <input type="text" name="email"><br>
Âge : <input type="text" name="age"><br>
<input type="submit" name="submit" value="Je valide mon inscription">
</form>
</body>
</html>


Un petit détour par PhpMyAdmin vous confirmera si l'enregistrement a bien été effectué.


      • 10.18.5 Modifier un enregistrement depuis PHP


La requête UPDATE vous permet de modifier les enregistrements d'un ou plusieurs champs dans votre table.

UPDATE liste SET email = 'annielg@orange.fr', age = '42' WHERE ID = '5' …. ou ….
UPDATE liste SET email = 'annielg@orange.fr', age = '42' WHERE nom = 'Annie Lecullier-Galvan'


     • UPDATE = on va modifier une entrée.
     • liste = Nom de la table.
     • SET = suivi des champs à modifier, entre apostrophes ou guillemets, séparés par des virgules.
       Les autres champs (non cités) ne seront pas modifiés.
     • WHERE = dire à MySQL quelle enregistrement il doit modifier (sinon toutes les entrées seraient affectées !) :
       Soit d’après le champ ID soit d’après le champ nom ... attention ce champ doit être unique !


             10.18.5 - 1) Modifier des données dans une table MySQL - méthode orientée objet (PDO)

(52_MySQL_PDO_modif.php)

<?php
$message = '';
$id = '';
$nom = '';
$email = '';
$age = '';
// La page d'insertion 
if ( isset( $_POST['nom'])) {
/* Connexion à la base de données avec PDO */
include("52_MySQL_PDO_connect.php");
$nom = $_POST['nom'];
/* "SELECT" étoile => On sélectionne tous les champs "FROM" la table liste */
$sql = "SELECT * FROM liste";
$resultat = $dbh->query($sql);
/* echo '<br>Liste des enregistrements de la base :<br>';*/
/* On affiche chaque entrée une à une */
while ($row = $resultat->fetch(PDO::FETCH_ASSOC)) {
/*print_r($row);
echo $row['id'].' - '.$row['nom'].' - '.$row['email'].' - '.$row['age'].' ans<br>';*/
If ($row['nom'] == $nom) /* Si vrai on exécute ce qui se trouve entre les crochets */
{
$id = $row['id'];
$nom = $row['nom'];
$email = $row['email'];
$age = $row['age'];
}}
/*echo "1) $nom $email $age<br>";*/
if ( isset( $_POST['email'] )) {
if ( $_POST['email'] != '') {
$email = $_POST['email'];
// Avec une requête préparée
$req = $dbh->prepare('UPDATE liste SET email = :email WHERE nom = :nom');
$req->execute(array('nom' => $nom,'email' => $email));
}}
/* echo "2) $nom $email $age<br>";*/
if ( isset( $_POST['age'] )) {
if ( $_POST['age'] != '') {
$age = $_POST['age'];
// Avec une requête préparée
$req = $dbh->prepare('UPDATE liste SET age = :age WHERE nom = :nom');
$req->execute(array('nom' => $nom,'age' => $age));
}}
/* echo "3) $nom $email $age<br>";*/
// Fermeture de la connexion
$dbh = NULL;
}else{
$message = '<span style="color: red"> <= entrez votre nom ici</span>';
}
if ( $nom != '' ) {
$message = '<span style="color: red"> <= entrez votre nom ici</span>';
}
/* echo "4) $nom $email $age<br>";*/
?>

<html>
<head>
<title>Modification d'un enregistrement</title>
</head>
<body>
<form method="post" action="52_MySQL_PDO_modif.php">
Entrez d'abord votre nom ici puis 'Envoyer' (vous modifierez après) :<br>
Nom  : <input type="text" name="nom" value="<?php print $nom; ?>"><?php echo '<span style="color: red">'.$message.'</span>' ?><br>
<input type="submit" name="submit" value="Envoyer"><br><br>
Modifiez votre mail puis cliquez sur 'Modifier' :<br>
Email: <input type="text" name="email" value="<?php print $email; ?>"><br>
Modifiez votre âge puis cliquez sur 'Modifier' :<br>
Âge : <input type="text" name="age" value="<?php print $age; ?>"><br>
<input type="submit" name="submit" value="Modifier"><br>
<br><input type="button" value="Retour à la page d'administration" name="LeLien1" onclick="self.location.href='52_MySQL_PDO_admin.php' " 
style="background-color:#ececec" style="color:white; font-weight:bold"onclick><br>
</form>
</body>
</html>


PhpMyAdmin vous confirmera que l'enregistrement a bien été modifié.


             10.18.5 - 2) Modifier des données dans une table MySQL - méthode procédurale (mysqli)

(52_MySQL_modif.php)

<?php
$msg = '';
$id = '';
$nom = '';
$email = '';
$age = '';
// La page d'insertion
if ( isset( $_POST['nom'])) {
/* Connexion à la base de données */
require_once('51_connexion.inc.php');
$nom = $_POST['nom'];
/* La requête "Select" retourne un jeu de résultats */
$query = "SELECT * FROM liste LIMIT 10";
$result = $mysqli->query($query);
echo '<br>Voici l\'enregistrement à modifier :';
/* tableau associatif */
$row = $result->fetch_array(MYSQLI_ASSOC);
// on découpe les lignes de résultat et on les met dans un tableau associatif dans l'ordre où elles arrivent
while ( $row = mysqli_fetch_array($result, MYSQLI_BOTH)) {
If ($row['nom'] == $nom) /* Si vrai on exécute ce qui se trouve entre les crochets */
{
$id = $row['id'];
$nom = $row['nom'];
$email = $row['email'];
$age = $row['age'];
echo "<br>$id - $nom - $email - $age ans<br><br>";
} }
// modification de l'email
if ( isset( $_POST['email'])) {
if ( $_POST['email'] != '') {
$oldemail = $email;
$email = $_POST['email'];
if ( $oldemail != $email) {
$sql = "UPDATE liste SET email = "."'$email'"." WHERE nom ="."'$nom'" ;
echo $sql."<br>";
//envoi de la requete au serveur MySQL
$result=mysqli_query($link, $sql);
/*test si la requete est executée */
if (mysqli_affected_rows($link) === 1) {
    $msg    =   '<span style="color: red">email modifié :)<br></span>';
} else {
    $msg    =   '<span style="color: red">Erreur de Modification email !<br>';
    $msg    .=   mysqli_error($link);
    $msg    .=  '</span>';
}
}}}
// modification de l'âge
if ( isset( $_POST['age']) ) {
if ( $_POST['age'] != '') {
$oldage = $age;
$age = $_POST['age'];
if ( $oldage != $age) {
$sql = "UPDATE liste SET age = "."'$age'"." WHERE nom ="."'$nom'" ;
//envoi de la requete au serveur MySQL
$result=mysqli_query($link, $sql);
/*test si la requete est executée */
if (mysqli_affected_rows($link) === 1) {
    $msg    .=   '<span style="color: red">âge modifié :)<br></span>';
} else {
    $msg    =   '<span style="color: red">Erreur de Modification âge !<br>';
    $msg    .=   mysqli_error($link);
    $msg    .=  '</span>';
}
}}}
;
echo $msg;
}
?>

<html>
<head>
<title>Modification</title>
</head>
<body>
Pour modifier votre mail ou votre âge entrez d'abord votre nom puis votre email ou votre âge :<br>
<form method="post" action="52_mysql_modif.php">
Entrez d'abord votre nom ici puis 'Envoyer' (vous modifierez après) :<br>
Nom  : <input type="text" name="nom" value="<?php print $nom; ?>"><?php echo '<br><span style="color: red">'.$msg.'</span>' ?>
<input type="submit" name="submit" value="Envoyer"><br><br>
Modifiez votre mail puis cliquez sur 'Modifier' :<br>
Email: <input type="text" name="email" value="<?php print $email; ?>"><br>
Modifiez votre âge puis cliquez sur 'Modifier' :<br>
Âge : <input type="text" name="age" value="<?php print $age; ?>"><br>
<input type="submit" name="submit" value="Modifier"><br>
</form>
</body>
</html>

      • 10.18.6 Supprimer un enregistrement depuis PHP


La clause WHERE vous permet de choisir l'enregistrement que vous souhaitez supprimer, si vous n'utilisez pas cette clause, la table sera complètement vidée de son contenu. L'instruction DELETE est donc à manipuler avec attention !


             10.18.6 - 1) Supprimer un enregistrement d’une table MySQL - méthode orientée objet (PDO)

(52_MySQL_PDO_suppr.php)

<?php
$nom = '';
$message = '';
if ( isset( $_POST['nom'] )) {
/* Connexion à la base de données avec PDO */
include("52_MySQL_PDO_connect.php");
$nom = $_POST['nom'];
// On ajoute une entrée dans la table liste à l’aide d’une requête préparée
$req = $dbh->prepare('DELETE FROM liste WHERE nom = :nom');
$req->execute(array('nom' => $nom));

echo '<span style="color: red"> Le visiteur '. $nom .' a bien été supprimé !</span>';
/* Fermeture de la connexion
$dbh = NULL;*/
} else {
$message = ' <= entrez le nom ici';
}
if ( $nom != '' ) {
$message = ' <= entrez le nom ici';
}
?>

<html>
<head>
<title>Suppression d'un enregistrement</title>
</head>
<body>
<form method="post" action="52_MySQL_PDO_suppr.php">
Entrez ici le nom à supprimer puis cliquez sur 'Supprimer' :<br>
Nom  : <input type="text" name="nom" value="<?php print $nom; ?>"><?php echo '<span style="color: red">'.$message.'</span>' ?><br>
<input type="submit" name="submit" value="Supprimer"><br>
<br><input type="button" value="Retour à la page d'administration" name="LeLien1" onclick="self.location.href='52_MySQL_PDO_admin.php'" style="background-color:#ececec" style="color:white; font-weight:bold"onclick><br>
</form>
</body>
</html>


Voici la page html après suppression d’un visiteur :

p10.18.6-1


             10.18.6 - 2) Supprimer un enregistrement d’une table MySQL - méthode procédurale (mysqli)

(52_MySQL_ suppr.php)

<?php
$nom = '';
$message = '';
if ( isset( $_POST['nom'] )) {
//connexion à la base de données
require_once('51_connexion.inc.php');
$nom = $_POST['nom'];
//preparation de la requete
$sql = "DELETE FROM liste WHERE nom="."'$nom'" ;
//envoi de la requete au serveur MySQL
$result=mysqli_query($link, $sql);
/*test si la requete est executée */
if (mysqli_affected_rows($link) === 1) {
    $msg    =   '<span style="color: red">Supprimé :)</span>';
} else {
    $msg    =   '<span style="color: red">Erreur de suppression!<br>';
    $msg    .=   mysqli_error($link);
    $msg    .=  '</span>';
}
;
echo $msg;
}
?>

<html>
<head>
<title>Suppression d'un enregistrement</title>
</head>
<body>
<form method="post" action="52_MySQL_suppr.php">
Entrez ici le nom à supprimer puis cliquez sur 'Supprimer' :<br>
Nom  : <input type="text" name="nom" value="<?php print $nom; ?>"><?php echo '<span style="color: red">'.$message.'</span>' ?><br>
<input type="submit" name="submit" value="Supprimer ce visiteur"><br>
</form>
</body>
</html>

      • 10.18.7 Trier une table depuis PHP


Trions la table par noms d’utilisateurs en ordre ascendant. ORDER BY vous permet de choisir un ordre pour l’affichage, en précisant ASC vous aurez une sortie en ordre croissant, et avec DESC en ordre décroissant.


             10.18.7 - 1) Trier par noms une table MySQL - méthode orientée objet (PDO)

(52_MySQL_PDO_tri_nom.php)

<?php
/* Connexion à la base de données */
include("52_MySQL_PDO_connect.php");
 
// on va chercher tous les noms de la table qu'on trie par ordre croissant
$resultat=$dbh->query("SELECT nom FROM liste ORDER BY nom ASC"); 
// on veut que le résultat soit récupérable sous forme d'objet
$resultat->setFetchMode(PDO::FETCH_OBJ); 
// on récupère la liste des noms
while( $ligne = $resultat->fetch() ) 
{
		// on affiche les noms
        echo 'Nom = '.$ligne->nom.'<br />'; 
}
// on ferme le curseur des résultats
$resultat->closeCursor(); 
?>

<html>
<head>
<title>Tri par nom des enregistrements</title>
</head>
<body>
<br>
<input type="button" value="Retour à la page d'administration" name="LeLien1" onclick="self.location.href='52_MySQL_PDO_admin.php'" 
style="background-color:#ececec" style="color:white; font-weight:bold"onclick>
<br>
</body>
</html>


Vous pourrez de même créer facilement des scripts pur trier votre table par id, par email, par âge, etc. à vous de jouer !...


      • 10.18.8 Un script d’administration pour gérer la table


Ce script est juste un simple tableau de liens, matérialisés par des boutons bien alignés et stylisés.

(52_MySQL_PDO_admin.php)

<html>
<head>
<title>Administration de la base de données</title>
</head>
<body>
<h1>Administration de la base de données</h1>
<p>
<table width=800 border=0>
  <tr>
    <td width=400 border=0>
      <input type="button" style="width: 198px; height: 25px" value="Affichage de toute la base" name="LeLien1" 
      onclick="self.location.href='52_MySQL_PDO_lire.php'" style="background-color:#ececec" style="color:white; font-weight:bold"onclick>
      <br>
    </td>
    <td width=400 border=0>
      <input type="button" style="width: 198px; height: 25px" value="Trier par id et afficher" name="LeLien1" 
      onclick="self.location.href='52_MySQL_PDO_tri_id.php'" style="background-color:#ececec" style="color:white; font-weight:bold"onclick>
      <br>
    </td>
  </tr>
  <tr>
    <td width=400 border=0>
      <input type="button" style="width: 198px; height: 25px" value="Insérer un enregistrement" name="LeLien1" 
      onclick="self.location.href='52_mysql_PDO_insert.php'" style="background-color:#ececec" style="color:white; font-weight:bold"onclick>
      <br>
    </td>
    <td width=400 border=0>
      <input type="button" style="width: 198px; height: 25px" value="Trier par nom et afficher" name="LeLien1" 
      onclick="self.location.href='52_MySQL_PDO_tri_nom.php'" style="background-color:#ececec" style="color:white; font-weight:bold"onclick>
      <br>
    </td>
  </tr>
  <tr>
    <td width=400 border=0>
      <input type="button" style="width: 198px; height: 25px" value="Modifier un enregistrement" name="LeLien1" 
      onclick="self.location.href='52_MySQL_PDO_modif.php'" style="background-color:#ececec" style="color:white; font-weight:bold"onclick>
      <br>
    </td>
    <td width=400 border=0>
      <input type="button" style="width: 198px; height: 25px" value="Trier par email et afficher" name="LeLien1" 
      onclick="self.location.href='52_MySQL_PDO_tri_email.php'" style="background-color:#ececec" style="color:white; font-weight:bold"onclick>
      <br>
    </td>
  </tr>
  <tr>
    <td width=400 border=0>
      <input type="button" style="width: 198px; height: 25px" value="Supprimer un enregistrement" name="LeLien1" 
      onclick="self.location.href='52_MySQL_PDO_suppr.php'" style="background-color:#ececec" style="color:white; font-weight:bold"onclick>
      <br>
    </td>
    <td width=400 border=0>
      <input type="button" style="width: 198px; height: 25px" value="Trier par âge et afficher" name="LeLien1" 
      onclick="self.location.href='52_MySQL_PDO_tri_age.php'" style="background-color:#ececec" style="color:white; font-weight:bold"onclick>
      <br>
    </td>
  </tr>
</table>
</body>
</html>

GrandTraitBleu1180x12.gif
BoutonHautDePage

10.19 Créer un système d’authentification sécurisé – méthode orientée objet (PDO)


On veut créer un extranet administrable à distance par une interface en PHP. Ce site doit être hautement sécurisé et accessible uniquement aux utilisateurs identifiés (figurant dans une liste). Les sessions PHP permettront de garder trace de l’identification donnée par les visiteurs et validée par l’application. Il y a deux solutions :
1) Utiliser les contrôles d’accès du serveur web : ceci nécessite de pouvoir modifier la configuration d’Apache via un fichier .htaccess
2) Utiliser une authentification gérée par l’application PHP dans le cadre d’une session. Nous préférons la seconde solution.

L’architecture du système comprend trois fichiers :
auth.php : est le formulaire pour s’identifier
verif.php : valide les données soumises et l’ensemble nom/mot de passe qui identifient le visiteur
secure.php : est placé en haut de chaque page à sécuriser. Il vérifie si le visiteur à bien accès à la ressource demandée.

PetitTraitBleu257x7

Avec PhpMyAdmin, créez d'abord une base de données "site_sur" et dans cette base, créez une table "users" contenant les champs login, nom, prenom, pass, email.

Voici la structure de la base :

p10.19-1

Voici la liste des personnes enregistrées dans la base :

p10.19-2


      • 10.19.1 Le formulaire pour s’identifier : auth.php - méthode orientée objet (PDO)


Si l’on faisait simple, le formulaire d’identification n’aurait besoin que de 2 champs, le nom (pseudonyme) et le mot de passe. Ici nous avons prévu les champs login, nom, prenom, pass, email.

Exemple :

(53_auth.php)

<html>
<head>
<title>Identification</title>
</head>
<!-- Premier fichier = authentification du visiteur //-->
<body>
<h2>Identifiez-vous pour accéder à ce site sécurisé</h2>
<table width=680 border=0>
<form method="post" action="53_verif.php">
<tr>
<td width=160 border=0><input type="text" name="login" value="Login ou pseudonyme"></td>
<td width=400 border=0>Login : Saisissez ici votre pseudonyme</td>
</tr>
<tr>
<td width=160 border=0><input type="text" name="nom" value="votre Nom ici"></td>
<td width=400 border=0>Nom : Saisissez ici votre Nom</td>
</tr>
<tr>
<td width=160 border=0><input type="text" name="prenom" value="votre Prénom ici"></td>
<td width=400 border=0>Prénom : Saisissez ici votre Prénom</td>
</tr>
<tr>
<td width=160 border=0><input type="password" name="motdepasse"></td>
<td width=400 border=0>Mot de passe : Saisissez ici votre mot de passe</td>
</tr>
<tr>
<td width=160 border=0><input type="text" name="email" value="votre_email@ici"></td>
<td width=400 border=0>E-Mail : Saisissez ici votre adresse email</td>
</tr>
<tr>
<td width=160 border=0><input type="text" name="email_2" value="votre_email@ici"></td>
<td width=400 border=0>E-Mail : Confirmez la saisie de votre email ici</td>
</tr>
<tr>
<td width=160 border=0><input type="submit" style="width: 150px; height: 24px" name="connexion" value="Je m'identifie">
</form></td>
<td width=400 border=0><input type="button" style="width: 250px; height: 24px" value="Pas encore inscrit ? - Cliquez ICI" name="LeLien1" 
onclick="self.location.href='53_auth_inscript.php'" style="background-color:#ececec" style="color:white; font-weight:bold"onclick>
</td>
</tr>
</table>
</body>
</html>

      • 10.19.2 le formulaire pour s’inscrire : 53_auth_inscript.php - méthode orientée objet (PDO)


Ce script vérifie si l’ensemble nom + mot de passe correspond bien à un utilisateur identifié (figurant dans la table MySql)

(53_auth_inscript.php)

<?php
if ( isset( $_POST['login'] )) {
/* Connexion à la base de données avec PDO */
include("53_MySQL_PDO_connect.php");
$login = $_POST['login'];
$nom = $_POST['nom'];
$prenom = $_POST['prenom'];
$motdepasse = $_POST['motdepasse'];
$email = $_POST['email'];
$email_2 = $_POST['email_2'];
If ($email != $email_2) {
/* Si email n'est pas correct email n'est pas égal à email_2 */
echo 'Votre email semble incorrect, merci de le rectifier. ' ;
echo '<a href = "53_auth.php"> retour</a>';
/* Si email est correct on exécute ce qui suit */
} else {
// On ajoute une entrée dans la table users à l’aide d’une requête préparée
$req = $dbh->prepare('INSERT INTO users(login, nom, prenom, pass, email) VALUES(:login, :nom, :prenom, :pass, :email)');
$req->execute(array(
	'login' => $login,
	'nom' => $nom,
	'prenom' => $prenom,
	'pass' => $motdepasse,
	'email' => $email
	));

echo '<span style="color: red">Cher visiteur, vous êtes maintenant inscrit ! - Souvenez-vous bien à l\'avenir de votre login et de votre mot de passe pour ce site. Merci.</span>';
echo '<br><a href = "53_verif.php"><h1>Suite de la visite</h1></a><br>';
// Fermeture de la connexion
$dbh = NULL;
}}
?>

<html>
<head>
<title>Inscription</title>
</head>
<!-- Inscription du visiteur //-->
<body>
<h2>Identifiez-vous pour accéder à ce site sécurisé</h2>
<table width=680 border=0>
<form method="post" action="53_auth_inscript.php">
<tr>
<td width=160 border=0><input type="text" name="login" value="Login ou pseudonyme"></td>
<td width=400 border=0>Login : Saisissez ici votre pseudonyme</td>
</tr>
<tr>
<td width=160 border=0><input type="text" name="nom" value="votre Nom ici"></td>
<td width=400 border=0>Nom : Saisissez ici votre Nom</td>
</tr>
<tr>
<td width=160 border=0><input type="text" name="prenom" value="votre Prénom ici"></td>
<td width=400 border=0>Prénom : Saisissez ici votre Prénom</td>
</tr>
<tr>
<td width=160 border=0><input type="password" name="motdepasse"></td>
<td width=400 border=0>Mot de passe : Saisissez ici votre mot de passe</td>
</tr>
<tr>
<td width=160 border=0><input type="text" name="email" value="votre_email@ici"></td>
<td width=400 border=0>E-Mail : Saisissez ici votre adresse email</td>
</tr>
<tr>
<td width=160 border=0><input type="text" name="email_2" value="votre_email@ici"></td>
<td width=400 border=0>E-Mail : Confirmez la saisie de votre email ici</td>
</tr>
<tr>
<td width=160 border=0><input type="submit" style="width: 150px; height: 24px" name="connexion" value="Je m'identifie"></form></td>
<td width=400 border=0></td>
</tr>
</table>
</body>
</html>

      • 10.19.3 la validation du nom et du mot de passe : verif.php - méthode orientée objet (PDO)


Ce script vérifie si l’ensemble nom + mot de passe correspond bien à un utilisateur identifié (figurant dans une liste). La fonction verifpass($nom,$pass) compare le nom et le mot de passe aux données d’une base mysql. On peut aussi, comme recommandé plus haut, récupérer l’adresse IP du visiteur :

echo 'Votre adresse IP est : ' . $_SERVER['REMOTE_ADDR'] ;

Exemple :

(53_verif.php)

<?php
function verifpass($nom,$motdepasse) {
/* Soit une base de données nommée "site_sur" et une table nommée "user" contenant les champs suivants 
- identifiant = id_user
- nom d'utilisateur = login
- mot de passe non crypté = pass
(dans un exemple réel, il faut toujours utiliser un mot de passe crypté avec la fonction crypt() par exemple) 
hashage du mot de passe
$pwd = md5($_POST['pwd']); */
// Connexion MySQL
$dbhote = 'localhost';
$dbuser = 'root';
$dbpass = '';
$dbbase = 'site_sur';

$dsn = "mysql:dbname=$dbbase;host=$dbhote" ;
$dbh = new PDO($dsn, $dbuser, $dbpass) ;

// Création de la requête SQL
$nom_sql = $dbh->quote($nom) ;
$pass_sql = $dbh->quote($motdepasse) ;
$sql ="SELECT count(*) as nbres FROM users "
		. " WHERE login=$nom_sql AND pass=$pass_sql" ;
		
// Exécution de la requête SQL
$result = $dbh->query($sql) ;
$row = $result->fetch() ;
$result = null ;
// Si un seul utilisateur est trouvé, c'est bon !
if ($row['nbres'] == 1) {
	return TRUE ;
} else {
	return FALSE ;
}}
/* @@@@@@@@ Fin de la fonction verifpass()  @@@@@@@@ */

// Initialisation de la session
session_start();
$message = '';
// Si on a reçu les données du formulaire 53_auth.php ou 53_auth_inscript.php
if (isset( $_POST['login']) &&  isset( $_POST['motdepasse'])  &&  isset( $_POST['email'] ) ) {
	// On les récupère
	$message = 'Votre adresse IP est : ' . $_SERVER['REMOTE_ADDR'] . '<br>';
	$nom = $_POST['login'];
	$motdepasse = $_POST['motdepasse'];
	$email = $_POST['email'];
	// Vérifions si le mot de passe est valide et dans la base de données à l'aide de la fonction verifpass()
	if (verifpass( $nom, $motdepasse )) {
	// si le mot de passe est valide le visiteur est identifié
	// on change alors d'identifiant de session pour plus de sécurité
    session_regenerate_id();
	// On sauvegarde alors le nom du visiteur dans la session (par sécurité, pas son mot de passe,)
	$_SESSION['nom'] = $nom ;
    $message .= '<br>Vous êtes correctement identifié';
	$message .= '<br><a href = "53_secure.php"><h1>Suite de la visite</h1></a><br>';
	} else {
	// Sinon on avertit le visiteur
    $message .= '<br>Erreur login ou mot de passe ';
    $message .= '<a href = "53_auth.php"> retour</a>';
	}
} else {
// Sinon un des champs 'login', 'motdepasse', ou 'email' n'est pas rempli
$message .= '<br>Un des champs login, mot de passe, ou email est vide ';
$message .= '<a href = "53_auth.php"> retour</a>';
}
?>

<html>
<head>
<title>Validation nom et mot de passe</title>
</head>
<body>
<p>
<?php echo $message ?>
</p>
</body>
</html>

      • 10.19.4 le script de protection de la page : secure.php - méthode orientée objet (PDO)


Ce script vérifie si le visiteur à bien accès à la ressource demandée. On ajoute en haut de chaque page à sécuriser : include('secure.php') ; qui y fait appel.

(secure.php)

<?php
// Initialisation de la session
session_start();
// On vérifie si le visiteur est identifié
if ( !isset( $_SESSION['nom'] )) {
/* si la variable $_SESSION n'existe pas, l'utilisateur n'est pas identifié, 
on le redirige donc vers la page d'authentification */
    header('Location: 53_auth.php');
	// Puis on arrête l'exécution du script
    exit();
}
?>

<html>
<head>
<title>Espace sécurisé</title>
</head>
<body>
<h1>Espace sécurisé</h1>

<p>Vous ne pouvez ....</p>
</body>
</html>


GrandTraitBleu1180x12.gif
BoutonHautDePage

10.20 Créer un site marchand sécurisé – méthode procédurale (mysqli)


On veut créer un extranet administrable à distance par une interface en PHP. Ce site doit être hautement sécurisé et accessible uniquement aux administrateurs identifiés (figurant dans une liste). Les sessions PHP permettront de garder trace de l’identification donnée par les administrateurs et validée par l’application.


PetitTraitBleu257x7
10.20.A Connexion et menu – méthode procédurale (mysqli)

      • 10.20.A1 le script de connexion - méthode procédurale (mysqli)


(55_ connexion.inc.php)

<?php
$myserver   = 'localhost';
$mylogin    = 'root';
$mypwd      = '';
$mybdd      = 'site_sur';
/* Connexion à la base de données */
$link       = mysqli_connect( $myserver, $mylogin, $mypwd, $mybdd );
$mysqli     = new mysqli( $myserver, $mylogin, $mypwd, $mybdd );
/* Vérification de la connexion */
if (mysqli_connect_errno()) {
    printf("Échec de la connexion : %s\n", mysqli_connect_error());
    exit();
}
echo 'Vous êtes connecté au serveur et à la base<br>';
?>

      • 10.20.A2 le script d’authentification - méthode procédurale (mysqli)


(55_auth.php)

<?php
$email = '';
$mypwd = '';
$message = '';
$nb_result = 0;

if ( isset( $_POST['email'] )) {
if ($_POST['email']) {
    require_once('55_connexion.inc.php');
    $email = $_POST['email'];
    /* hashage du mot de passe
    $mypwd        =   md5($_POST['mypwd']); */
    $mypwd = $_POST['mypwd'];
    $rqt        = "SELECT nom, prenom FROM users WHERE email = '$email' AND pass = '$mypwd'";
/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
if ($result = mysqli_query($link, $rqt)) {
    /* Détermine le nombre de lignes du jeu de résultats */
    $nb_result = mysqli_num_rows($result);
    printf("Le jeu de résultats a %d lignes.\n", $nb_result);
}
/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
    if ($nb_result = 1) {
	/* Si le nombre d'enregistrements === 1 alors authentification OK */
        session_start();
        $_SESSION['valide'] = 1;
    while ($row = $result->fetch_assoc()) {
		printf ("%s (%s)\n", $row["nom"], $row["prenom"]);
        $_SESSION['nom']    =   $row['nom'];
        $_SESSION['prenom'] =   $row['prenom'];
    }
        header('Location: http://localhost/55_menu.php');
        exit();
    } else {
	/* Authentification pas OK */
        $message = '<span style="color: red">Mauvais login ou mot de passe</span>';
    }
    /* Ferme le jeu de résultats */
    mysqli_free_result($result);
}}
?>

<html>
<head>
<title>Authentification</title>
</head>
<body>
<h1>Authentification</h1>
<form method="post" action="55_auth.php">
    EMail : <input type="text" name="email" value="<?php echo $email;?>">
    <br>
    pwd : <input type="password" name="mypwd" value="<?php echo $mypwd;?>">
    <br>
    <input type="submit" name="login" value="login">
</form>
<?php echo $message; ?>
</body>
</html>

      • 10.20.A3 Modifier le mot de passe - méthode procédurale (mysqli)


(55_modif_password.php)

<?php
session_start();
if ( !$_SESSION['valide'] ) {
    header('Location: 55_auth.php');
    exit();
}
require_once('55_connexion.inc.php');
$message = '';
$login = '';
if ( isset( $_POST['login'] )) {
	$login = $_POST['login'];
	echo "<br>login : ", $login;
	$sql    =   "SELECT pass FROM users WHERE login = '$login'";
	// $sql    =   "SELECT * FROM users WHERE login = '$id'";
    echo "<br>", $sql;
    $result =   mysqli_query($link, $sql);
	$nb_result = mysqli_num_rows($result);
    // Vérification de l'existance du compte
    echo '<br>$nb_result = ', $nb_result;
    if ($nb_result == 1) {
        $row = mysqli_fetch_array($result);
        // Vérification que l'ancien mot de passe est bon
        if ($row['pass'] == $_POST['old_pwd']) {
		    echo '<br>Ancien password correct !';
            // Vérification que les nouveaux mots de passe sont bons
            if ($_POST['new_pwd'] == $_POST['new_pwd2']) {
				echo '<br>Nouveaux passwords corrects !';
                $rqt = 'UPDATE users SET pass = \''.$_POST['new_pwd'].'\'
                        WHERE login = \''.$_POST['login'].'\'';
                mysqli_query($link,$rqt);
                if (mysqli_affected_rows($link) == 1)                 {
                    $message = '<br><span style="color: red">OK : mot de passe mis à jour.</span>';
                    unset($_POST);
                } else {
				$message = '<br><span style="color: red">Echec mise à jour, erreur inconnue !</span>';
				}
            } else {
            $message = '<br><span style="color: red">Les nouveaux mots de passe ne correspondent pas !</span>';
            }
        
        } else {
            $message = '<br><span style="color: red">Ancien mot de passe erroné !</span>';
        }
    } else {
        $message = '<br><span style="color: red">Ce login n\'existe pas !</span>';
        unset($_POST['login']); 
    }
}
?>

<html>
<head>
<title>Modification du mot de passe</title>
</head>
<body>
<form method="post" action="55_modif_password.php">
login : <input type="text" name="login" value="<?php echo $login; ?>">
<br>
ancien mot de passe : <input type="password" name="old_pwd">
<br>
nouveau mot de passe :<input type="password" name="new_pwd">
<br>
nouveau mot de passe(2) :<input type="password" name="new_pwd2">
<br>
<input type="submit" name="bouton" value="valider">
</form>
<h2><?php echo $message; ?></h2>
<br><br>
<h2><a href="55_menu.php">Retour Menu principal</a></h2>
</body>
</html>

      • 10.20.A4 la page d’administration - méthode procédurale (mysqli)


(55_menu.php)

<?php
session_start();
if ( !$_SESSION['valide'] )
{
    header('Location: http://localhost/55_auth.php');
    exit();
}
echo 'Bonjour ', $_SESSION['prenom'], ' ', $_SESSION['nom'];
echo '<h1>ADMINISTRATION</h1>';
?>

<html>
<head>
<title>Page d'administration</title>
</head>
<body><br>
<a href="http://localhost/55_aff_utilisateur.php/?msg=Aucun message">Liste des utilisateurs</a><br>
<a href="http://localhost/55_ajout_utilisateur.php">Ajouter un utilisateur</a><br>
<a href="http://localhost/55_modif_password.php">Modifier un mot de passe</a><br>
<br><br>
<a href="http://localhost/55_aff_article.php">Liste des articles</a><br>
<a href="http://localhost/55_ajout_article.php">Ajouter un article</a><br>
<a href="http://localhost/55_stat_article.php">Statistiques sur les articles</a><br>
<br>
<a href="http://localhost/55_site.php"><h2>Retour à ce site web</h2></a><br>

<a href="55_logout.php">Déconnexion</a><br>
</body>
</html>

      • 10.20.A5 la Déconnexion - méthode procédurale (mysqli)


(55_logout.php)

<?php
// Initialisation de la session.
// Si vous utilisez un autre nom
// session_name("autrenom")
session_start();

// Détruit toutes les variables de session
$_SESSION = array();

// Si vous voulez détruire complètement la session, effacez également
// le cookie de session.
// Note : cela détruira la session et pas seulement les données de session !
if (isset($_COOKIE[session_name()])) {
    setcookie(session_name(), '', time()-42000, '/');
}

// Finalement, on détruit la session.
session_destroy();

header('Location: http://localhost/55_auth.php');
exit();
?>

      • 10.20.A6 la page du site web (ultra-simplifiée) - méthode procédurale (mysqli)


(55_site.php)

<?php
session_start();

// si utilisateur pas authentifié, le rediriger vers la page d'authentification
if ( !$_SESSION['valide'] ) {
    header('Location: 55_auth.php');
    exit();
}

echo '<h1>Espace sécurisé</h1>';
echo 'Bonjour ', $_SESSION['nom'], ', tu es, comme toujours, le plus beau :-)';
?>

<html>
<head>
<title>Page du site web</title>
</head>
<body><br>
<p><a href="http://localhost/55_logout.php">Déconnexion</a></p>
</body>
</html>



PetitTraitBleu257x7

10.20.B Gérer l’utilisateur – méthode procédurale (mysqli)

      • 10.20.B1 Affichage des utilisateurs - méthode procédurale (mysqli)


(55_aff_utilisateur.php)

<?php
$nb_result = 0;
session_start();
if ( !$_SESSION['valide'] ) {
    header('Location: http://localhost/55_auth.php');
    exit();
}
require_once('55_connexion.inc.php');
$sql    =   'SELECT * FROM users';
if ($result = mysqli_query($link, $sql)) {
    /* Détermine le nombre de lignes du jeu de résultats */
    $nb_result = mysqli_num_rows($result);
    printf("Il y a %d utilisateurs référencés.\n", $nb_result);
}
if ($nb_result != 0) {
	/*Si le nombre d'enregistrements != 0 alors liste utilisateurs OK */
	echo $_GET['msg'],'<br>';
	/* Compteur pour l'affichage avec couleurs alternées */
	$i = 0;
	echo '<h2>LISTE DES UTILISATEURS</h2>';
	echo '<table>';
	echo '<tr><td>DETAIL UTILISATEUR</td><td>EFFACER</td><td>MODIFIER</td></tr>';
	while ($row = $result->fetch_assoc()) {
	/* Gestion de l'affichage avec couleurs alternées */
    if ($i % 2) 
        $bgcolor='white';
    else
        $bgcolor='#d3daed';
    $i++;
    $login = $row['login'];
    echo "<tr bgcolor='".$bgcolor."'><td><a href='http://localhost/55_detail_utilisateur.php?id=".$row['login']."'>".$row['email']."</a></td>";
    echo "<td><a href='http://localhost/55_efface_utilisateur.php?id=".$row['login']."'>effacer</a></td>";
    echo "<td><a href='http://localhost/55_modif_utilisateur.php?id=".$row['login']."'>modifier</a>";
    echo "</td></tr>";
	}
	echo '</table>';
} else {
	/* Liste utilisateurs pas OK */
    $message = '<span style="color: red">Aucun enregistrement dans la base</span>';
}
?>

<html>
<head>
<title>Affichage utilisateurs</title>
</head>
<body>
<br><br>
<h2><a href="http://localhost/55_menu.php">Retour Menu principal</a></h2>
</body>
</html>

      • 10.20.B2 Détail d’un utilisateur - méthode procédurale (mysqli)


(55_detail_utilisateur.php)

<?php
session_start();
if ( !$_SESSION['valide'] ) {
    header('Location: 55_auth.php');
    exit();
}
require_once('55_connexion.inc.php');
$id = $_GET['id'];
// echo 'login : '.$id.'<br>';
/* Si l'id n'est pas renseigné alors renvoyer l'utilisateur vers le menu */
if (!$id     =   $_GET['id']) {
    header('Location: http://localhost/55_menu.php');
    exit();
}
$sql    =   "SELECT * FROM users WHERE login = '$id'";
// echo 'Requête sql : '.$sql.'<br>';
$result =   mysqli_query($link, $sql);
while ( $row = mysqli_fetch_assoc($result) ) {
    echo '<h2>Détails sur l\'utilisateur  '.$row['prenom'].' '.$row['nom'].' :</h2>';
	echo 'login : '.$row['login'].'<br>';
    echo 'nom : '.$row['nom'].'<br>';
    echo 'prénom : '.$row['prenom'].'<br>';
    echo 'pass : '.$row['pass'].'<br>';
    echo 'email : '.$row['email'].'<br><br>';
}
?>

<html>
<head>
<title>Détail d’un utilisateur</title>
</head>
<body>
<a href="http://localhost/55_aff_utilisateur.php/?msg=Aucun message">Liste des utilisateurs</a><br>
<h2><a href="http://localhost/55_menu.php">Retour Menu principal</a></h2>
</body>
</html>

      • 10.20.B3 Ajouter un utilisateur - méthode procédurale (mysqli)


(55_ajout_utilisateur.php)

<?php
session_start();
if ( !$_SESSION['valide'] ) {
    header('Location: http://localhost/55_auth.php');
    exit();
}
function is_email($email) { // Vérifie la syntaxe d'une adresse mail
	return preg_match('/^[^@]+@[a-zA-Z0-9._-]+\.[a-zA-Z]+$/', $email);
}
/* Fin de function is_email() */
$login = '';
$nom = '';
$prenom = '';
$pass = '';
$email = '';
$msg = '';
$msg_login = '';
$msg_pass = '';
$msg_email = '';
/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
if ( isset( $_POST['email'] )) {
$login    =   $_POST['login'];
$nom    =   $_POST['nom'];
$prenom =   $_POST['prenom'];
$pass    =   $_POST['pass'];
$email  =   $_POST['email'];
/* FLAG qui permet de vérifier la validité des champs du formulaire */
$valide_form = TRUE;
// Vérification du formulaire
    if ( !$_POST['login']) { //le login n'est pas renseigné
        $msg_login        =   '<span style="color: red">Veuillez entrez votre login SVP</span><br>';
        $valide_form    = FALSE;
    }
    if ( !$_POST['pass']) { //le pasword n'est pas renseigné
        $msg_pass        =   '<span style="color: red">Veuillez entrez votre mot de passe SVP</span><br>';
        $valide_form    = FALSE;
    }
    if ( !is_email($_POST['email']) ) { //le mail n'est pas correct
        $msg_email       =   '<span style="color: red">Veuillez vérifier l\'adresse mail SVP</span><br>';
        $valide_form    = FALSE;
    }
/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
    if ( $valide_form === TRUE ) {
        require_once('55_connexion.inc.php');
        $sql    =   "INSERT INTO users (login, nom, prenom, pass, email) VALUES ('$login', '$nom', '$prenom', '$pass', '$email')";
        $result =   mysqli_query($link, $sql);
        if ( mysqli_affected_rows($link)=== 1 ) {
            $msg    =   '<span style="color: red">Utilisateur enregistré</span>';
            header("Location: http://localhost/55_aff_utilisateur.php?msg=$msg");
            exit();
        } else {
            $msg    =   '<span style="color: red">Erreur : Utilisateur non enregistré</span>';
        }
    }
}
echo $msg ;
?>

<html>
<head>
<title>Ajouter un utilisateur dans la base</title>
</head>
<body>
<h2>Ajouter un utilisateur dans la base</h2>
<form method="post" action="55_ajout_utilisateur.php">
    Login <span style="color: red">*</span> <input type="text" name="login" value="<?php echo $login;?><?php echo $msg_login;?>"><br>
    Mot de passe <span style="color: red">*</span>: <input type="password" name="pass"><?php echo $msg_pass;?><br>
    Nom : <input type="text" name="nom" value="<?php echo $nom;?>"><br>
    Prénom : <input type="text" name="prenom" value="<?php echo $prenom;?>"><br>
    Email <span style="color: red">*</span>: <input type="text" name="email" value="<?php echo $email; ?>"><?php echo $msg_email;?><br>
	<span style="color: red">* = Ces champs doivent être renseignés<br></span>
    <input name="Envoyer" type="submit" value="Envoyer">
</form>
<br><br>
<h2><a href="http://localhost/55_menu.php">Retour Menu principal</a></h2>
</body>
</html>

      • 10.20.B4 Modifier un utilisateur - méthode procédurale (mysqli)


(55_modif_utilisateur.php)

<?php
session_start();
if ( !$_SESSION['valide'] ) {
    header('Location: 55_auth.php');
    exit();
}
require_once('55_connexion.inc.php');
/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
$id     =   $_GET['id'];
$sql    =   "SELECT * FROM users WHERE login = '$id'";
	// echo '<br>', $sql;
    $result =   mysqli_query($link, $sql);
    $row    =   mysqli_fetch_assoc($result);
/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
    $login    =   $row['login'];
    $nom    =   $row['nom'];
    $prenom =   $row['prenom'];
    $pass  =   $row['pass'];
    $email  =   $row['email'];
	echo '<br>Données de cette personne :';
	echo '<br>', $login, ' ', $nom, ' ', $prenom, ' ', $pass, ' ', $email;
	echo '<br>Bonjour ', $_SESSION['prenom'], ' ', $_SESSION['nom'];
$msg_mail = '';
/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
if ( isset( $_POST['email'] )) {
	$login  =   $_POST['login'];
    $nom    =   $_POST['nom'];
    $prenom =   $_POST['prenom'];
    $pass	=   $_POST['pass'];
    $email  =   $_POST['email'];
    /* Le mail est obligatoire */
    if ( $email ) {
        $sql    =   "UPDATE users SET login='".$login."', nom='".$nom."', prenom='".$prenom."', email='".$email."' WHERE login ='".$login."'";
		echo '<br>', $sql;
        $result =   mysqli_query($link, $sql);
        if ( mysqli_affected_rows($link) === 1) {
            $msg    =   "<br><span style='color: red'>Utilisateur bien modifié, $login</span>";
			echo 'Bonjour ', $_SESSION['prenom'], ' ', $_SESSION['nom'];
            unset($_SESSION['id']);
            header("Location: http://localhost/55_aff_utilisateur.php?msg=$msg");
            exit();
        } else {
            echo "<br><span style='color: red'>Erreur : Utilisateur non modifié, $login</span>";
        }
    } else {
        $msg_mail =   '<span style="color: red">Entrer le mail ici SVP !</span>';
    }
} else {
    /* Mise en session de l'ID */
    $_SESSION['id'] =   $id;

    $sql    =   'SELECT * FROM users WHERE `login` = '."'$id'";
    $result =   mysqli_query($link, $sql);
    $row    =   mysqli_fetch_assoc($result);

    $login    =   $row['login'];
    $nom    =   $row['nom'];
    $prenom =   $row['prenom'];
	$pass  =   $row['pass'];
    $email  =   $row['email'];
}
?>

<html>
<head>
<title>Modifier un utilisateur dans la base</title>
</head>
<body>
<h1>Modification de l'utilisateur <?php echo $_GET['id'];?></h1>
<form method="post" action="55_modif_utilisateur.php?id="<?php echo $login;?>"">
    login: <input type="text" name="login" value="<?php echo $login;?>"><br>
    nom: <input type="text" name="nom" value="<?php echo $nom;?>"><br>
    prénom: <input type="text" name="prenom" value="<?php echo $prenom;?>"><br>
    pass: <input type="text" name="pass" value="<?php echo $pass;?>"><br>
    email*: <input type="text" name="email" value="<?php echo $email;?>"><?php echo $msg_mail; ?><br>
	<span style="color: red">(*) données obligatoires</span><br><br>
    <input name="Envoyer" type="submit" value="Envoyer">
</form>
<h2><a href="http://localhost/55_menu.php">Retour Menu principal</a></h2>
</body>
</html>

      • 10.20.B5 Effacer un utilisateur - méthode procédurale (mysqli)


(55_efface_utilisateur.php)

<?php
session_start();
if ( !$_SESSION['valide'] ) {
    header('Location: http://localhost/55_auth.php');
    exit();
}
require_once('55_connexion.inc.php');
$id = $_GET['id'];
//preparation de la requete
$sql = 'DELETE FROM `site_sur`.`users` WHERE `login` = '."'$id'";
//echo $sql;
$result =   mysqli_query($link, $sql);
if ( mysqli_affected_rows($link) ) {
    $msg    =   '<span style="color: red"><br>Utilisateur effacé</span>';
    header("Location: http://localhost/55_aff_utilisateur.php?msg=$msg");
    exit();
} else {
    $msg    =   '<span style="color: red"><br>Erreur : Utilisateur non effacé</span>';
    header("Location: http://localhost/55_aff_utilisateur.php?msg=$msg");
    exit();
}
?>

PetitTraitBleu257x7
10.20.C Gérer les articles du site – méthode procédurale (mysqli)

      • 10.20.C1 Affichage des articles - méthode procédurale (mysqli)


(55_aff_ article.php)

<?php
$nb_result = 0;
session_start();
if ( !$_SESSION['valide'] ) {
    header('Location: http://localhost/55_auth.php');
    exit();
}
$msg ='';
require_once('55_connexion.inc.php');
$sql    =   'SELECT * FROM articles';
if ($result = mysqli_query($link, $sql)) {
    /* Détermine le nombre de lignes du jeu de résultats */
    $nb_result = mysqli_num_rows($result);
    printf("Il y a %d articles référencés dans la base.\n", $nb_result);
}
if ( isset( $_GET['msg'] )) {
	$msg = $_GET['msg'];
	echo '<span style="color: red">'.$msg.'</span>';
}
if ($nb_result != 0) {
	/*Si le nombre d'enregistrements != 0 alors liste articles OK */
	/* Compteur pour l'affichage avec couleurs alternées */
	$i = 0;
	echo '<h2>LISTE DES ARTICLES DE LA BASE</h2>';
	echo '<table>';
	echo '<tr><td>CATEGORIE</td><td>DETAIL ARTICLE... </td><td>EFFACER</td><td>MODIFIER</td></tr>';
	while ($row = $result->fetch_assoc()) {
	/* Gestion de l'affichage avec couleurs alternées */
    if ($i % 2) 
        $bgcolor='white';
    else
        $bgcolor='#d3daed';
    $i++;
    $NomCategorie = $row['NomCategorie'];
    echo "<tr bgcolor='".$bgcolor."'>";
	echo "<td>$NomCategorie</td>";
    echo "<td><a href='http://localhost/55_detail_article.php?id=".$row['RefArticle']."'>".$row['NomArticle']."</a></td>";
    echo "<td><a href='http://localhost/55_efface_article.php?id=".$row['RefArticle']."'>effacer</a></td>";
    echo "<td><a href='http://localhost/55_modif_article.php?id=".$row['RefArticle']."'>modifier</a></td>";
    echo '<td>';
    echo "<a href='http://localhost/55_detail_article.php?id=".$row['RefArticle']."'>";
	echo '<img style="width: 59px; height: 41px;" src="../pict/'.$row['ImageArticle'].'" alt="'.$row['RefArticle'].'" title="'.$row['RefArticle'].'">';
    echo '</a>';
	'</td>';
	echo "</a></td>";
    echo "</tr>";
	}
	echo '</table>';
} else {
	/* liste utilisateurs pas OK */
    $message = '<span style="color: red">Aucun article dans la base</span>';
}
/* while ( $row = mysqli_fetch_assoc($result) ) {
    echo 'modèle: ';
    echo '<a href="55_detail_produit.php?id='.$row['id_produit'].'">'.$row['modele'].'</a>';
    echo '| |<a href="55_efface_produit.php?id='.$row['id_produit'].'">effacer</a>';
    echo '| |<a href="55_modif_produit.php?id='.$row['id_produit'].'">modif</a>';
    echo '<br><br>';
} */
?>

<html>
<head>
<title>Affichage des articles de la base</title>
</head>
<body>
<h2><a href="http://localhost/55_menu.php">Retour Menu principal</a></h2>
</body>
</html>

      • 10.20.C2 Détail d’un article - méthode procédurale (mysqli)


(55_detail_ article.php)

<?php
session_start();
if ( !$_SESSION['valide'] ) {
    header('Location: http://localhost/55_auth.php');
    exit();
}
require_once('55_connexion.inc.php');
$id = $_GET['id'];
// echo 'login : '.$id.'<br>';
/* Si l'id n'est pas renseigné alors renvoyer l'utilisateur vers le menu */
if (!$id     =   $_GET['id']) {
    header('Location: http://localhost/55_menu.php');
    exit();
}
$sql    =   "SELECT * FROM articles WHERE RefArticle = '$id'";
// echo 'Requête sql : '.$sql.'<br>';
$result =   mysqli_query($link, $sql);
while ( $row = mysqli_fetch_assoc($result) ) {
    echo '<br>'.$row['NoCategorie'].'<sup>e</sup> Catégorie';
    echo ' : '.$row['NomCategorie'].' : '.$row['DescripCategorie'].'<br>';
	echo '<h2>Détail article :</h2>';
    // $wpict = 10 * $row['Wpict'];
    // $hpict = 10 * $row['Hpict'];
	if ($row['EnStock'] != 0) {
	$message = 'Article en stock livrable rapidement<br>';
	} else {
	$message = 'Article disponible sur commande<br>';
	}	
    echo 'Article : "'.$row['NomArticle'].'" ';
	echo 'Réf. : '.$row['RefArticle'].'<br>';
    echo '<img src="../pict/'.$row['ImageArticle'].'" alt="'.$row['RefArticle'].'" title="'.$row['RefArticle'].'">';
    echo '<br><h2>Descriptif Article : </h2>'.$row['DescripArticle'].'<br>';
    echo '<br><span style="color: red"><b>Prix de Vente : '.$row['PrixVente'].' €uros</b></span><br>';
    echo $message;
    echo '<br><br>';
}
?>

<html>
<head>
<title>Détail d’un article de la base</title>
</head>
<body>
<a href="http://localhost/55_aff_article.php/?msg=Aucun message">Retour Liste des articles</a><br>
<h2><a href="http://localhost/55_menu.php">Retour Menu principal</a></h2>
</body>
</html>

      • 10.20.C3 Ajouter un article - méthode procédurale (mysqli)


(55_ajout_ article.php)

<?php
session_start();
if ( !$_SESSION['valide'] ) {
    header('Location: http://localhost/55_auth.php');
    exit();
}
$RefArticle				= '';
$NoCategorie			= '';
$NomCategorie			= '';
$DescripCategorie		= '';
$ImageArticle			= '';
$CheminImage			= '';
$Wpict					= '';
$Hpict					= '';
$NomArticle				= '';
$DescripArticle 		= '';
$PrixVenteCentimesdEuros= '';
$PrixVente				= '';
$EnStock				= '';
$SousCategorie			= '';
$MotCle					= '';
$CategorieLienTableau	= '';
$NomSousCategorie		= '';
$DescripSousCategorie	= '';
$NomFichierPageHtml		= '';
/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
$msg						= '';
$msg_RefArticle				= '';
$msg_NoCategorie			= '';
$msg_NomCategorie			= '';
$msg_DescripCategorie		= '';
$msg_ImageArticle			= '';
$msg_CheminImage			= '';
$msg_Wpict					= '';
$msg_Hpict					= '';
$msg_NomArticle				= '';
$msg_DescripArticle			= '';
$msg_PrixVenteCentimesdEuros= '';
$msg_PrixVente				= '';
$msg_EnStock				= '';
$msg_SousCategorie			= '';
$msg_MotCle					= '';
$msg_CategorieLienTableau	= '';
$msg_NomSousCategorie		= '';
$msg_DescripSousCategorie	= '';
$msg_NomFichierPageHtml		= '';
/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
if ( isset( $_POST['RefArticle'] )) {
/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
$RefArticle				= $_POST['RefArticle'];
$NoCategorie			= $_POST['NoCategorie'];
$NomCategorie			= $_POST['NomCategorie'];
$NomCategorie			= addslashes($NomCategorie);
$DescripCategorie		= $_POST['DescripCategorie'];
$DescripCategorie		= addslashes($DescripCategorie);
$ImageArticle			= $_POST['ImageArticle'];
$Wpict					= $_POST['Wpict'];
$Hpict					= $_POST['Hpict'];
$NomArticle 			= $_POST['NomArticle'];
$NomArticle				= addslashes($NomArticle);
$DescripArticle 		= $_POST['DescripArticle'];
$DescripArticle			= addslashes($DescripArticle);
$PrixVenteCentimesdEuros= $_POST['PrixVenteCentimesdEuros'];
$PrixVente				= $_POST['PrixVente'];
$EnStock				= $_POST['EnStock'];
$SousCategorie			= $_POST['SousCategorie'];
$MotCle					= $_POST['MotCle'];
$CategorieLienTableau	= $_POST['CategorieLienTableau'];
$NomSousCategorie		= $_POST['NomSousCategorie'];
$NomSousCategorie		= addslashes($NomSousCategorie);
$DescripSousCategorie	= $_POST['DescripSousCategorie'];
$DescripSousCategorie	= addslashes($DescripSousCategorie);
$NomFichierPageHtml		= $_POST['NomFichierPageHtml'];
/* FLAG qui permet de vérifier la validité des champs du formulaire */
$valide_form = TRUE;
// Vérification du formulaire
    if ( !$_POST['RefArticle']) { // la Référence de l'Article n'est pas renseignée
        $msg_RefArticle        =   '<span style="color: red">Entrez ici la Référence de l\'Article SVP</span><br>';
        $valide_form    = FALSE;
    }
    if ( !$_POST['NoCategorie']) { // le N° de Catégorie n'est pas renseigné
        $msg_NoCategorie        =   '<span style="color: red">Entrez ici le N° de Catégorie SVP</span><br>';
        $valide_form    = FALSE;
    }
    if ( !$_POST['NomCategorie']) { // le Nom de Catégorie n'est pas renseigné
        $msg_NomCategorie        =   '<span style="color: red">Entrez ici le Nom de Catégorie SVP</span><br>';
        $valide_form    = FALSE;
    }
    if ( !$_POST['DescripCategorie']) { // le Descriptif de Catégorie n'est pas renseigné
        $msg_DescripCategorie    =   '<span style="color: red">Entrez ici le Descriptif de Catégorie SVP</span><br>';
        $valide_form    = FALSE;
    }
    if ( !$_POST['ImageArticle']) { // l'image correspondant à l'article n'est pas précisée
        $msg_ImageArticle        =   '<span style="color: red">Entrez ici le nom d\'image correspondant à l\'article SVP</span><br>';
        $valide_form    = FALSE;
    }
    if ( !$_POST['Wpict']) { // la Largeur de l'image petit format n'est pas renseignée
        $msg_Wpict        =   '<span style="color: red">Entrez ici la Largeur de l\'image petit format SVP</span><br>';
        $valide_form    = FALSE;
    }
    if ( !$_POST['Hpict']) { // la Hauteur de l'image petit format n'est pas renseignée
        $msg_Hpict        =   '<span style="color: red">Entrez ici la Hauteur de l\'image petit format SVP</span><br>';
        $valide_form    = FALSE;
    }
    if ( !$_POST['NomArticle']) { // le Nom de l'Article n'est pas renseigné
        $msg_NomArticle        =   '<span style="color: red">Entrez ici le Nom de l\'Article SVP</span><br>';
        $valide_form    = FALSE;
    }
    if ( !$_POST['DescripArticle']) { // le Descriptif de l'Article n'est pas renseigné
        $msg_DescripArticle        =   '<span style="color: red">Entrez ici le Descriptif de l\'Article SVP</span><br>';
        $valide_form    = FALSE;
    }
    if ( !$_POST['PrixVenteCentimesdEuros']) { // le Prix de Vente en Centimes d'Euros n'est pas renseigné
        $msg_PrixVenteCentimesdEuros        =   '<span style="color: red">Entrez ici le Prix de Vente en Centimes d\'Euros SVP</span><br>';
        $valide_form    = FALSE;
    }
    if ( !$_POST['PrixVente']) { // le Prix de Vente en Euros n'est pas renseigné
        $msg_PrixVente        =   '<span style="color: red">Entrez ici le Prix de Vente en Euros SVP</span><br>';
        $valide_form    = FALSE;
    }
    if ( !$_POST['EnStock']) { // le Nombre d'articles en Stock n'est pas renseigné
        $msg_EnStock        =   '<span style="color: red">Entrez ici un Nombre d\'articles en Stock (non nul) SVP</span><br>';
        $valide_form    = FALSE;
    }
    if ( !$_POST['SousCategorie']) { // le N° de la Sous Catégorie n'est pas renseigné
        $msg_SousCategorie        =   '<span style="color: red">Entrez ici le N° de la Sous Catégorie SVP</span><br>';
        $valide_form    = FALSE;
    }
    if ( !$_POST['MotCle']) { // le Mot Clé n'est pas renseigné
        $msg_MotCle        =   '<span style="color: red">Entrez ici le Mot Clé caractérisant au mieux l\'Article SVP</span><br>';
        $valide_form    = FALSE;
    }
    if ( !$_POST['CategorieLienTableau']) { // la Catégorie du Lien dans son Tableau n'est pas renseigné
        $msg_CategorieLienTableau        =   '<span style="color: red">Entrez ici la Catégorie du Lien dans son Tableau SVP</span><br>';
        $valide_form    = FALSE;
    }
    if ( !$_POST['NomSousCategorie']) { // le Nom de la sous Catégorie n'est pas renseigné
        $msg_NomSousCategorie        =   '<span style="color: red">Entrez ici le Nom de la sous Catégorie SVP</span><br>';
        $valide_form    = FALSE;
    }
    if ( !$_POST['DescripSousCategorie']) { // le Descriptif de la sous Catégorie n'est pas renseigné
        $msg_DescripSousCategorie        =   '<span style="color: red">Entrez ici le Descriptif de la sous Catégorie SVP</span><br>';
        $valide_form    = FALSE;
    }
    if ( !$_POST['NomFichierPageHtml']) { // le Nom du Fichier de la Page Html n'est pas renseigné
        $msg_NomFichierPageHtml        =   '<span style="color: red">Entrez ici le Nom du Fichier de la Page Html SVP</span><br>';
        $valide_form    = FALSE;
    }
/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
    if ( $valide_form === TRUE ) {
    require_once('55_connexion.inc.php');
$sql = "INSERT INTO articles (	
	RefArticle, 
	NoCategorie, 
	NomCategorie, 
	DescripCategorie,
	ImageArticle,
	Wpict,
	Hpict,
	NomArticle,
	DescripArticle,
	PrixVenteCentimesdEuros,
	PrixVente,
	EnStock,
	SousCategorie,
	MotCle,
	CategorieLienTableau,
	NomSousCategorie,
	DescripSousCategorie,
	NomFichierPageHtml
) VALUES (
	'$RefArticle', 
	'$NoCategorie', 
	'$NomCategorie', 
	'$DescripCategorie', 
	'$ImageArticle',
	'$Wpict',
	'$Hpict',
	'$NomArticle',
	'$DescripArticle',
	'$PrixVenteCentimesdEuros',
	'$PrixVente',
	'$EnStock',
	'$SousCategorie',
	'$MotCle',
	'$CategorieLienTableau',
	'$NomSousCategorie',
	'$DescripSousCategorie',
	'$NomFichierPageHtml'
)";
/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
    /* Endroit où sont stockées les images */
    $NomImage = $_FILES['CheminImage']['name'];
	echo '$_FILES[\'CheminImage\'][\'name\'] = ', $NomImage, '<br>';
    $repertoire_image = 'C:/wamp/www/pict/';
/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
    $result =   mysqli_query($link, $sql);
/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
    if ( mysqli_affected_rows($link) === 1 ) {
        $fichier_tmp    =   $_FILES['CheminImage']['tmp_name']; 
		echo '$fichier_tmp=', $fichier_tmp, '<br>';
        $fichier_def    =   $repertoire_image.$NomImage;
		echo '$fichier_def=', $fichier_def, '<br>';
        if (move_uploaded_file( $fichier_tmp  , $fichier_def )) {
            $msg = '<span style="color: red">Article enregistré</span>';
            header("Location: http://localhost/55_aff_article.php?msg=$msg");
            exit();
		}else{
			/* Le fichier n'est pas téléchargé*/
			$msg    =   'Erreur de chargement de l\'image';
		}
    }else{
        $msg = '<span style="color: red">Erreur : Article non enregistré</span>';
    }
/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
    }
}
echo $msg ;
?>

<html>
<head>
<title>Ajouter un article dans la base</title>
</head>
<body>
<h2>Ajouter un article dans la base</h2>
<form method="post" action="55_ajout_article.php" enctype="multipart/form-data">
    Réf Article <span style="color: red">*</span>: 
	<input type="text" name="RefArticle" value="<?php echo $RefArticle;?>"><?php echo $msg_RefArticle;?><br>
    N° Catégorie <span style="color: red">*</span>: 
	<input type="text" name="NoCategorie" value="<?php echo $NoCategorie;?>"><?php echo $msg_NoCategorie;?><br>
    Nom Catégorie <span style="color: red">*</span>: 
	<input type="text" name="NomCategorie" value="<?php echo $NomCategorie;?>"><?php echo $msg_NomCategorie;?><br>
    Descriptif Catégorie <span style="color: red">*</span>: 
	<input type="text" name="DescripCategorie" value="<?php echo $DescripCategorie;?>"><?php echo $msg_DescripCategorie;?><br>
    Nom Image Article <span style="color: red">*</span>: 
	<input type="text" name="ImageArticle" value="<?php echo $ImageArticle;?>"><?php echo $msg_ImageArticle;?><br>
    Chemin d'accès Image Article <span style="color: red">*</span>: 
	<input type="file" name="CheminImage" value="<?php echo $CheminImage;?>"><?php echo $msg_CheminImage;?><br>
    Largeur image petit format <span style="color: red">*</span>: 
	<input type="text" name="Wpict" value="<?php echo $Wpict;?>"><?php echo $msg_Wpict;?><br>
    Hauteur image petit format <span style="color: red">*</span>: 
	<input type="text" name="Hpict" value="<?php echo $Hpict;?>"><?php echo $msg_Hpict;?><br>
    Nom Article <span style="color: red">*</span>: 
	<input type="text" name="NomArticle" value="<?php echo $NomArticle;?>"><?php echo $msg_NomArticle;?><br>
    Descriptif Article : <span style="color: red">* </span>
	<br><textarea name="DescripArticle" rows="10" cols="50"><?php echo $DescripArticle;?></textarea>
	<?php echo $msg_DescripArticle;?><br>
    Prix de Vente en Centimes d'Euros <span style="color: red">*</span>: 
	<input type="text" name="PrixVenteCentimesdEuros" value="<?php echo $PrixVenteCentimesdEuros;?>">
	<?php echo $msg_PrixVenteCentimesdEuros;?><br>
    Prix de Vente en Euros <span style="color: red">*</span>: 
	<input type="text" name="PrixVente" value="<?php echo $PrixVente;?>"><?php echo $msg_PrixVente;?><br>
    Nombre d'articles en Stock <span style="color: red">*</span>: 
	<input type="text" name="EnStock" value="<?php echo $EnStock;?>"><span style="color: red"> Non nul SVP</span>
	<?php echo $msg_EnStock;?><br>
    N° Sous Catégorie <span style="color: red">*</span>: 
	<input type="text" name="SousCategorie" value="<?php echo $SousCategorie;?>"><?php echo $msg_SousCategorie;?><br>
    Mot Clé <span style="color: red">*</span>: 
	<input type="text" name="MotCle" value="<?php echo $MotCle;?>"><?php echo $msg_MotCle;?><br>
    Catégorie du Lien dans son Tableau <span style="color: red">*</span>: <input type="text" name="CategorieLienTableau" 
	value="<?php echo $CategorieLienTableau;?>"><?php echo $msg_CategorieLienTableau;?><br>
    Nom sous Catégorie <span style="color: red">*</span>: 
	<input type="text" name="NomSousCategorie" value="<?php echo $NomSousCategorie;?>">
	<?php echo $msg_NomSousCategorie;?><br>
    Descriptif sous Catégorie <span style="color: red">*</span>
	<input type="text" name="DescripSousCategorie" value="<?php echo $DescripSousCategorie;?>">
	<?php echo $msg_DescripSousCategorie;?><br>
    Nom du Fichier de la Page Html <span style="color: red">*</span>: 
	<input type="text" name="NomFichierPageHtml" value="<?php echo $NomFichierPageHtml;?>">
	<?php echo $msg_NomFichierPageHtml;?><br>
	<span style="color: red">* = Tous les champs doivent être renseignés<br></span>
    <input name="Envoyer" type="submit" value="Envoyer">
</form>
<br><br>
<h2><a href="http://localhost/55_menu.php">Retour Menu principal</a></h2>
</body>
</html>

      • 10.20.C4 Modifier un article - méthode procédurale (mysqli)


(55_modif_ article.php)

<?php
session_start();
if ( !$_SESSION['valide'] ) {
    header('Location: http://localhost/55_auth.php');
    exit();
}
require_once('55_connexion.inc.php');
/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
$RefArticle				= '';
$NoCategorie			= '';
$NomCategorie			= '';
$DescripCategorie		= '';
$ImageArticle			= '';
$CheminImage			= '';
$Wpict					= '';
$Hpict					= '';
$NomArticle				= '';
$DescripArticle 		= '';
$PrixVenteCentimesdEuros= '';
$PrixVente				= '';
$EnStock				= '';
$SousCategorie			= '';
$MotCle					= '';
$CategorieLienTableau	= '';
$NomSousCategorie		= '';
$DescripSousCategorie	= '';
$NomFichierPageHtml		= '';
/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
$msg						= '';
$msg_RefArticle				= '';
$msg_NoCategorie			= '';
$msg_NomCategorie			= '';
$msg_DescripCategorie		= '';
$msg_ImageArticle			= '';
$msg_CheminImage			= '';
$msg_Wpict					= '';
$msg_Hpict					= '';
$msg_NomArticle				= '';
$msg_DescripArticle			= '';
$msg_PrixVenteCentimesdEuros= '';
$msg_PrixVente				= '';
$msg_EnStock				= '';
$msg_SousCategorie			= '';
$msg_MotCle					= '';
$msg_CategorieLienTableau	= '';
$msg_NomSousCategorie		= '';
$msg_DescripSousCategorie	= '';
$msg_NomFichierPageHtml		= '';
/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
if ( isset( $_GET['id'] )) {
	$RefArticle = $_GET['id'];
	$OldRefArticle = $RefArticle;
	echo '<span style="color: red">1) ligne 53 RefArticle = ', $RefArticle, '<br>1) ligne 53 OldRefArticle = ', $OldRefArticle, '</span>';
if ( !isset( $_POST['RefArticle'] )) { /* Lorsque le formulaire n'a pas été modifié */
    $sql = "SELECT * FROM articles WHERE `RefArticle` = '$OldRefArticle'";
	echo '<br>ligne56 sql formulaire vide : ', $sql;
    $result =   mysqli_query($link, $sql);
    $row    =   mysqli_fetch_assoc($result);
/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
    $RefArticle = $row['RefArticle'];
    $NoCategorie = $row['NoCategorie'];
    $NomCategorie = $row['NomCategorie'];
    $DescripCategorie = $row['DescripCategorie'];
    $ImageArticle = $row['ImageArticle'];
    $Wpict = $row['Wpict'];
    $Hpict = $row['Hpict'];
    $NomArticle = $row['NomArticle'];
    $DescripArticle = $row['DescripArticle'];
    $PrixVenteCentimesdEuros = $row['PrixVenteCentimesdEuros'];
    $PrixVente = $row['PrixVente'];
    $EnStock = $row['EnStock'];
    $SousCategorie = $row['SousCategorie'];
    $MotCle = $row['MotCle'];
    $CategorieLienTableau = $row['CategorieLienTableau'];
    $NomSousCategorie = $row['NomSousCategorie'];
    $DescripSousCategorie = $row['DescripSousCategorie'];
    $NomFichierPageHtml = $row['NomFichierPageHtml'];
/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
	echo '<br>ligne 79 - Données de cet article :';
	echo '<br>', $RefArticle, ' - ', $NomArticle, ' - Illustration : ', $ImageArticle, ' - Prix de Vente : ', $PrixVente, ' € ';
}
/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
    /* Mise en session de l'ID */
    $_SESSION['id'] = $OldRefArticle;
	$RefArticle = '';
/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
    $repertoire_image = 'C:/wamp/www/pict/';
/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
if ( isset( $_POST['RefArticle'] )) {
/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
$RefArticle				= $_POST['RefArticle'];
$NoCategorie			= $_POST['NoCategorie'];
$NomCategorie			= $_POST['NomCategorie'];
$NomCategorie			= addslashes($NomCategorie);
$DescripCategorie		= $_POST['DescripCategorie'];
$DescripCategorie		= addslashes($DescripCategorie);
$ImageArticle			= $_POST['ImageArticle'];
$Wpict					= $_POST['Wpict'];
$Hpict					= $_POST['Hpict'];
$NomArticle 			= $_POST['NomArticle'];
$NomArticle				= addslashes($NomArticle);
$DescripArticle 		= $_POST['DescripArticle'];
$DescripArticle			= addslashes($DescripArticle);
$PrixVenteCentimesdEuros= $_POST['PrixVenteCentimesdEuros'];
$PrixVente				= $_POST['PrixVente'];
$EnStock				= $_POST['EnStock'];
$SousCategorie			= $_POST['SousCategorie'];
$MotCle					= $_POST['MotCle'];
$CategorieLienTableau	= $_POST['CategorieLienTableau'];
$NomSousCategorie		= $_POST['NomSousCategorie'];
$NomSousCategorie		= addslashes($NomSousCategorie);
$DescripSousCategorie	= $_POST['DescripSousCategorie'];
$DescripSousCategorie	= addslashes($DescripSousCategorie);
$NomFichierPageHtml		= $_POST['NomFichierPageHtml'];
/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
    /* La référence article est obligatoire */
    if ($RefArticle) {
$sql = "UPDATE articles SET 
	RefArticle='".$RefArticle."', 
	NoCategorie='".$NoCategorie."', 
	NomCategorie='".$NomCategorie."', 
	DescripCategorie='".$DescripCategorie."', 
	ImageArticle='".$ImageArticle."', 
	Wpict='".$Wpict."', 
	Hpict='".$Hpict."', 
	NomArticle='".$NomArticle."', 
	DescripArticle='".$DescripArticle."', 
	PrixVenteCentimesdEuros='".$PrixVenteCentimesdEuros."', 
	PrixVente='".$PrixVente."', 
	EnStock='".$EnStock."', 
	SousCategorie='".$SousCategorie."', 
	MotCle='".$MotCle."', 
	CategorieLienTableau='".$CategorieLienTableau."', 
	NomSousCategorie='".$NomSousCategorie."', 
	DescripSousCategorie='".$DescripSousCategorie."', 
	NomFichierPageHtml='".$NomFichierPageHtml."' 
WHERE RefArticle = $OldRefArticle";
	echo '<br>ligne138 sql : ', $sql;
    $result =   mysqli_query($link, $sql);
    $row    =   mysqli_fetch_assoc($result);
    $RefArticle = $row['RefArticle'];
    $NomArticle = $row['NomArticle'];
	echo '<br>ligne143 RefArticle : ', $RefArticle;
	echo '<br>ligne144 NomArticle : ', $NomArticle;
	echo '<br>ligne145 mysqli_affected_rows($link) = ', mysqli_affected_rows($link);
/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
		if ( mysqli_affected_rows($link) === 1 ) {
			$fichier_tmp    =   $_FILES['CheminImage']['tmp_name']; 
			echo '$fichier_tmp=', $fichier_tmp, '<br>';
			$fichier_def    =   $repertoire_image.$ImageArticle;
			echo '$fichier_def=', $fichier_def, '<br>';
			if (move_uploaded_file( $fichier_tmp  , $fichier_def )) {
				$msg = '<span style="color: red"><br>Article correctement modifié</span>';
				unset($_SESSION['id']);
				header("Location: http://localhost/55_aff_article.php?msg=$msg");
				exit();
			} else {
				/* Le fichier n'est pas téléchargé */
				$msg    =   'Erreur de chargement de l\'image';
			}
		} else {
			$msg = '<span style="color: red"><br>Erreur : Article non modifié</span>';
		}
    } else {
        $msg_RefArticle =   'Entrez la référence article SVP !';
    }
/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
} else {
    /* récupération de l'ID */
    $RefArticle = $_SESSION['id'];
/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
    $sql2 = "SELECT * FROM articles WHERE `RefArticle` = '$RefArticle'";
	echo '<br>ligne173 sql2 : ', $sql2;
    $result = mysqli_query($link, $sql2);
    $row    = mysqli_fetch_assoc($result);
    /* Renseignement des champs avant modification */
    $RefArticle = $row['RefArticle'];
    $NoCategorie = $row['NoCategorie'];
    $NomCategorie = $row['NomCategorie'];
    $DescripCategorie = $row['DescripCategorie'];
    $ImageArticle = $row['ImageArticle'];
    $CheminImage = $repertoire_image.$ImageArticle;
	echo '<br>ligne 183 $CheminImage =  ', $CheminImage;
    $Wpict = $row['Wpict'];
    $Hpict = $row['Hpict'];
    $NomArticle = $row['NomArticle'];
    $DescripArticle = $row['DescripArticle'];
    $PrixVenteCentimesdEuros = $row['PrixVenteCentimesdEuros'];
    $PrixVente = $row['PrixVente'];
    $EnStock = $row['EnStock'];
    $SousCategorie = $row['SousCategorie'];
    $MotCle = $row['MotCle'];
    $CategorieLienTableau = $row['CategorieLienTableau'];
    $NomSousCategorie = $row['NomSousCategorie'];
    $DescripSousCategorie = $row['DescripSousCategorie'];
    $NomFichierPageHtml = $row['NomFichierPageHtml'];
}
/* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */
} else {
	$msg = '<span style="color: red"><br>Erreur : ligne 200 RefArticle non transmis par la méthode GET</span>';
}
echo $msg ;
echo '<span style="color: red"><br>2) ligne 204 new RefArticle = ', $RefArticle, '</span>';
?>

<html>
<head>
<title>Modification un article dans la base</title>
</head>
<body>
<h2>Modification de l'article  <?php echo $RefArticle;?> dans la base</h2>
Voici les anciennes valeurs à modifier ou à conserver :<br><br>
<form method="post" action="55_modif_article.php?id='<?php echo $OldRefArticle;?>'" enctype="multipart/form-data">
    Réf Article <span style="color: red">*</span>: <input type="text" name="RefArticle" 
	value="<?php echo $RefArticle;?>"><?php echo $msg_RefArticle;?><br>
    N° Catégorie <span style="color: red">*</span>: <input type="text" name="NoCategorie" 
	value="<?php echo $NoCategorie;?>"><?php echo $msg_NoCategorie;?><br>
    Nom Catégorie <span style="color: red">*</span>: <input type="text" name="NomCategorie" 
	value="<?php echo $NomCategorie;?>"><?php echo $msg_NomCategorie;?><br>
    Descriptif Catégorie <span style="color: red">*</span>: <input type="text" name="DescripCategorie" 
	value="<?php echo $DescripCategorie;?>"><?php echo $msg_DescripCategorie;?><br>
    Nom Image Article <span style="color: red">*</span>: <input type="text" name="ImageArticle" 
	value="<?php echo $ImageArticle;?>"><?php echo $msg_ImageArticle;?><br>
    Largeur image petit format <span style="color: red">*</span>: <input type="text" name="Wpict" 
	value="<?php echo $Wpict;?>"><?php echo $msg_Wpict;?><br>
    Hauteur image petit format <span style="color: red">*</span>: <input type="text" name="Hpict" 
	value="<?php echo $Hpict;?>"><?php echo $msg_Hpict;?><br>
    Nom Article <span style="color: red">*</span>: <input type="text" name="NomArticle" 
	value="<?php echo $NomArticle;?>"><?php echo $msg_NomArticle;?><br>
    Descriptif Article : <span style="color: red">* </span><br><textarea name="DescripArticle" rows="10" cols="50">
	<?php echo $DescripArticle;?></textarea><?php echo $msg_DescripArticle;?><br>
    Prix de Vente en Centimes d'Euros <span style="color: red">*</span>: <input type="text" name="PrixVenteCentimesdEuros" 
	value="<?php echo $PrixVenteCentimesdEuros;?>"><?php echo $msg_PrixVenteCentimesdEuros;?><br>
    Prix de Vente en Euros <span style="color: red">*</span>: <input type="text" name="PrixVente" 
	value="<?php echo $PrixVente;?>"><?php echo $msg_PrixVente;?><br>
    Nombre d'articles en Stock <span style="color: red">*</span>: <input type="text" name="EnStock" 
	value="<?php echo $EnStock;?>"><?php echo $msg_EnStock;?><br>
    N° Sous Catégorie <span style="color: red">*</span>: <input type="text" name="SousCategorie" 
	value="<?php echo $SousCategorie;?>"><?php echo $msg_SousCategorie;?><br>
    Mot Clé <span style="color: red">*</span>: <input type="text" name="MotCle" 
	value="<?php echo $MotCle;?>"><?php echo $msg_MotCle;?><br>
    Catégorie du Lien dans son Tableau <span style="color: red">*</span>: <input type="text" name="CategorieLienTableau" 
	value="<?php echo $CategorieLienTableau;?>"><?php echo $msg_CategorieLienTableau;?><br>
    Nom sous Catégorie <span style="color: red">*</span>: <input type="text" name="NomSousCategorie" 
	value="<?php echo $NomSousCategorie;?>"><?php echo $msg_NomSousCategorie;?><br>
    Descriptif sous Catégorie <span style="color: red">*</span>: <input type="text" name="DescripSousCategorie" 
	value="<?php echo $DescripSousCategorie;?>"><?php echo $msg_DescripSousCategorie;?><br>
    Nom du Fichier de la Page Html <span style="color: red">*</span>: <input type="text" name="NomFichierPageHtml" 
	value="<?php echo $NomFichierPageHtml;?>"><?php echo $msg_NomFichierPageHtml;?><br>
    <b>Chemin d'accès Image Article</b> <span style="color: red">*</span>: <input type="file" name="CheminImage">
	<?php echo $msg_CheminImage;?><br>
	<span style="color: red">Recherchez peut-être dans <?php echo $CheminImage;?> ou ailleurs sur votre machine.</span><br>
	<span style="color: red">* = Tous les champs doivent être renseignés<br></span>
    <input name="Envoyer" type="submit" value="Envoyer les modifications">
</form>
<h2><a href="http://localhost/55_menu.php">Retour Menu principal</a></h2>
</body>
</html>

      • 10.20.C5 Supprimer un article - méthode procédurale (mysqli)


(55_efface_ article.php)

<?php
session_start();
if ( !$_SESSION['valide'] ) {
    header('Location: 55_auth.php');
    exit();
}
require_once('55_connexion.inc.php');
$id = $_GET['id'];
$sql = 'DELETE FROM `site_sur`.`articles` WHERE `RefArticle` = '."'$id'";
echo $sql;
$result = mysqli_query($link, $sql);
if ( mysqli_affected_rows($link) === 1) {
    /* Creation du message confirmation effacement d'un Article */
    $msg = '1 Article effacé !<br>Pensez aussi à retirer l\'image '.$id.'.jpg du répertoire pict';
    header("Location: http://localhost/55_aff_article.php?msg=$msg");
    exit();
} else {
    echo "Erreur d'effacement";
}
?>

      • 10.20.C6a Statistiques sur les articles - méthode procédurale (mysqli)


(55_stat_ article.php)

<?php
session_start();
if ( !$_SESSION['valide'] ) {
    header('Location: 55_auth.php');
    exit();
}
echo '<h3>Statistique des ventes</h3>';
echo '<a href="55_stat_article_graph.php"><img src="pict/Graphiques.gif" alt="Graphiques" title="Statistiques et Graphiques"></a>';
?>
<html>
<head>
<title>Statistiques sur les articles (accueil)</title>
</head>
<body>
<h2><a href="http://localhost/55_menu.php">Retour Menu principal</a></h2>
</body>
</html>

      • 10.20.C6b Statistiques sur les articles avec la bibliothèque Artichow (mysqli)


Il faut pour cela télécharger la bibliothèque Artichow et l’installer dans un répertoire que vous nommerez Artichow-php5 et que vous copierez dans votre répertoire racine www
(55_stat_article_graph)

<?php
/*
 * This work is hereby released into the Public Domain.
 * To view a copy of the public domain dedication,
 * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to
 * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
 *
 */
require_once "C:/wamp/www/Artichow-php5/LinePlot.class.php";
$graph = new Graph(600, 400);
$graph->setAntiAliasing(TRUE);
$group = new PlotGroup;
$group->grid->setType(Line::DASHED);
$group->setPadding(40, NULL, 20, NULL);
$group->axis->left->setLabelNumber(8);
$group->axis->left->setLabelPrecision(1);
$group->axis->left->setTickStyle(Tick::OUT);
// $x = array(2, 4, 8, 16, 32, 48, 56, 60, 62);
/* ******************** */
/* Génération des données */
for ($cpt=1; $cpt < 13; $cpt++) {
    $stat_mois_passe[]      =   rand(0,50);
    $stat_mois_courant[]    =   rand(0,50);
}
$x = $stat_mois_passe;
/* ************************ */
$plot = new LinePlot($x);
$plot->setColor(new Orange());
$plot->setFillColor(new LightOrange(80));
$plot->mark->setType(Mark::CIRCLE);
$plot->mark->setFill(new MidRed);
$plot->mark->setSize(5);
/* ******************************************** */
date_default_timezone_set('UTC');
$this_month =   date('F');
$past_month =   date('F',time()-(31 * 24 * 60 * 60));
/* ******************************************** */
$group->legend->add($plot, "$this_month ", Legend::MARK);
$group->add($plot);
// $x = array(NULL, NULL, NULL, 10, 12, 14, 18, 26, 42);
$x = $stat_mois_courant;
$plot = new LinePlot($x);
$plot->setColor(new Color(120, 120, 30, 10));
$plot->setFillColor(new Color(120, 120, 60, 90));
$plot->mark->setType(Mark::SQUARE);
$plot->mark->setFill(new DarkGreen);
$plot->mark->setSize(7);
$group->add($plot);
/*
function setYear($value) {
	return $value + 2000;
}
$group->axis->bottom->label->setCallbackFunction('setYear');
*/
function setMonth($value) {
	return $value +1;
}
$group->axis->bottom->label->setCallbackFunction('setMonth');
/*
function setK($value) {
	return round($value).'K';
}
$group->axis->left->label->setCallbackFunction('setK');
function set€($value) {
	return round($value).chr(128);
}
$group->axis->left->label->setCallbackFunction('set€');
*/
$group->legend->add($plot, "$past_month", Legend::MARK);
$group->legend->setPosition(0.45, 0.25);
$group->legend->shadow->smooth(TRUE);
$graph->add($group);
$graph->draw();
?>
GrandTraitBleu1180x12.gif
BoutonHautDePage

10.21 Conclusion


Nous ne pouvons que reprendre ce qui avait été signalé en introduction. Ce tutoriel a délibérément été conçu comme une présentation élémentaire des fonctionnalités des scripts PHP et de sa possibilité de connexion avec une base de données. La mise en œuvre d'un site dynamique nécessitera bien évidemment des éléments supplémentaires que vous trouverez en librairie ou sur le Web.


Bonne continuation dans votre étude de PHP...



Sources principales :
Le site pour apprendre PHP à partir de zéro : http://www.siteduzero.com/
Site PHP officiel : http://www.phpfrance.com/
Tutoriels PHP France : http://www.phpfrance.com/tutorials/
Manuel PHP officiel : http://php.net/manual/fr/index.php
Manuel de référence MySql : http://dev.mysql.com/doc/refman/5.0/fr/index.html
Un bref tutoriel PHP3 (en français) : http://www.linux-france.org/article/devl/php3/tut/php3_tut.html
PHP Facile : http://www.toutestfacile.com/
PHP Débutant : http://www.phpdebutant.com/
Le tutoriel d'ASP-PHP.net : http://www.asp-php.net/tutorial/
Comment ça marche - Introduction à PHP : http://www.commentcamarche.net/php/phpintro.php3/
Tutoriel PHP : http://www.freewebmasterhelp.com/tutorials/php/
An Introduction to PHP : http://www.rci.rutgers.edu/~jfulton/php1/
Manuel PHP - Tutoriel : http://www.webestilo.com/php/


InTheDarkBlue
BoutonPrecedent BoutonSommaire BoutonSuite Cette page s'affiche mal ? - cliquez ici
Architecture Web : Gilbert Pernot