Formations privées

Rue Albert 1er, 7

6810 Pin - Chiny

(/fax: 061/32.00.15

Formation PHP - MySql en ligne

Votre site Internet
Site de présentation à partir de 250 € hTBVA.

FORMATIONS

Le MAGASIN YBET

PRODUITS et SERVICES

Formations informatiques privées

Activités et présentation

Logiciels de gestion

Access - Excel

Rayon d'action  

Logiciel compta CIEL
YBET informatique Forum Création de site Vente informatique en ligne
Lire aussi ...sur le matériel informatique
Les chapitres de la formation en ligne PHP - MySQL
1. Introduction au Php
2. Installer et utiliser easyphp
3. Première commande PHP
4. Fonctions en PHP
5. Les tableaux
6. Fonctions sur les variables
7. Formulaires Mail
8. Base de donnée MySQL avec easyphp
9. Première application de Mysql
10. Gestion des tables par PHP
10.a Exercice: formulaire de contact
11. Mise en page PHP - HTM: include() - require()
12. Création automatique de la table utilisateur
13. Formulaire et vérification des données
14. Insertion des nouveaux membres
15. Gestion des catégories
16. Liste de choix déroulante
17. Modification des tables MySQL
18. Enregistrer un fichier via un formulaire
19. Formulaire d'insertion
20. Affichage des petites annonces
21. Filtrage des annonces (1)
23. Exercice: gérer des news
24. Utilisation des Cookies
25. Gestion fichiers et Dossiers (source et FTP)
26. Cryptage et décryptage de mots de passe
27. Base relationnelle, méthodes Left et Join.
Divers
Formation référencement en ligne, positionnez votre site sur Google, MSN, Yahoo, ...
Les feuilles de styles, utilisation du CSS.
FrontPage et l'HTML, cours en ligne
Le fichier Apache .htaccess, configuration serveur, URL Rewriting, accès répertoires.
Liste des commandes PhP - MySQL

15. Les catégories d'annonces

1 Introduction - 2. Table utilisateur - 2. Création de la table - 3. Insertion d'une catégorie - 4. Affichage des catégories - 5. Insertion des sous-catégories - 6. Suppression des catégories

Avant de leur permettre aux utilisateurs de rentrer leurs annonces, nous allons créer les catégories. Par facilité, nous allons créer 3 niveaux de catégories. Un seul serait suffisant, mais cette méthode va nous permettre dans le futur d'utiliser cette programmation pour d'autres types de sites, pensez à un annuaire par exemple.

Une solution serait de permettre une liste de choix directement dans le formulaire. Cette méthode a déjà été utilisée pour entrer les utilisateurs (Monsieur, Madame, Mademoiselle). Malheureusement, l'ajout, la modification ou la suppression d'une catégorie nécessiterait de modifier ... la programmation, pas très intéressant pour un développeur de site standard. Nous allons donc créer une table dans notre base de donnée que nous appellerons CATEGORIE.

Cette formation est donc le premier niveau de l'administration de notre site d'annonces en ligne.

Remarque: cette partie a été complètement modifiée dans le développement actuel.

2. Création de la table.

La table peut-être crée avec la console PHPMyadmin d'EasyPhp, mais nous allons la créer à l'aide d'une requête MySQL. Pour un rappel sur les commandes sur les tables MySQL.

<?php

require('includes/start.php');

// cette partie ouvre la base de donnée

/*

Création de la requête

*/

require('includes/stop.php');

echo'Base de donnée fermée';

?>

Les champs à créer dans la table MySql:

nom type description
uid int(10), clé primaire numéro de la catégorie
Nom varchar(25) Nom de la catégorie
Description Varchar(80) Description de la catégorie
Attachement smallint(5) default '0' Sous catégorie de la catégorie supérieure numéro, 0 si c'est une catégorie
Image varchar(40) adresse de l'image associée
Actif char(1) actif (oui ou non), O par défaut
  • uid va nous permettre de numéroter nos catégories

  • Attachement permet de créer les sous catégories. Cette manière de procéder va nous permettre de créer autant de niveau de catégories que nous souhaitons.

  • image permet d'associer une image à la catégorie

  • Actif (O / N) permet éventuellement de désactiver une catégorie d'annonces.

<?php
require('includes/start.php');
$requete="CREATE TABLE if not exists categorie (uid int primary key NOT NULL auto_increment,nom varchar(25) not null,description varchar(80) not null,attachement smallint(5) default '0',image tinytext NOT NULL, actif char(1))";
$erreur=mysql_query($requete);
$erreur1=mysql_error();
print($erreur."<br>");
print($erreur1);
require('includes/stop.php');
?>

Enregistrez ce fichier dans votre dossier principal sous le nom creation-cat.php et exécutez-le, la table est directement créée.

3. Insertion d'une catégorie

Pour permettre d'insérer les catégories, nous allons de nouveau un formulaire. Cette fois, nous n'allons pas utiliser la méthode fichier html -> fichier php mais directement utiliser un seul fichier PHP. Cette méthode est plus élégante puisqu'elle n'oblige pas l'utilisateur à faire un retour en arrière avec le navigateur pour corriger des données.

<?php

// test d'exécution du sommaire
if (isset($_POST['go'])){

$nom = $_POST['nom'];

$erreur_nom = "";

$description = $_POST['description'];

$erreur_description = "";

$attachement = $_POST['attachement'];

$erreur_attachement = "";

$image = $_POST['image'];

$erreur_image = "";

$actif = $_POST['actif'];

$erreur_actif = "";

if ($_POST['nom'] == ''){

   $erreur_nom = "Le nom de la catégorie doit être renseigné<br>";

} elseif ($_POST['description'] == ''){

   $erreur_description = "Entrez une description<br>";

} elseif ($_POST['image'] == ''){

   $erreur_image = "Entrez une adresse image valide<br>";

} else {
             $ajout = "";
            echo"Connexion réussie";
            // entrée des données dans la table

}

} else {

$nom = "Nom de la catégorie";

$erreur_nom = "";

$description = "Description de la catégorie";

$erreur_description = "";

$attachement = "Numéro de la catégorie supérieure";

$erreur_attachement = "";

$image = "adresse de l'image";

$erreur_image = "";

$actif ="O";

$erreur_actif = "";
}
$form = "<table>
<form METHOD=\"POST\">
<tr><td>Nom de la catégorie</td><td><input type=text name=nom value=\"$nom\" size=\"25\"><br>$erreur_nom</td></tr>
<tr><td>Description</td><td><input type=text name=description value=\"$description\" size=\"40\"><br>$erreur_description</td></tr>
<tr><td>Numéro de la catégorie supérieure</td><td><input type=text name=attachement value=\"$attachement\"><br>$erreur_attachement</td></tr>
<tr><td>Adresse image</td><td><input type=text name=image value=\"$image\" size=\"100\"><br>$erreur_image</td></tr>
<tr><td>Actif (O/N)</td><td><input type=text name=actif value=\"$actif\" size=\"1\"><br>$erreur_actif</td></tr>
<tr><td><input type=submit name=go value=sauve></td><td><input type=reset name=reset value=\"recommencer\"></td></tr>
</form>
</table>";
print($form);
?>

Vous pouvez vérifier le fonctionnement de cette partie ici. Examinons cette partie de code.

La partie finale reprend le formulaire. Il est quasiment identique à un formulaire en HTML, sauf qu'il est enregistré sous forme d'une variable PHP ($form). Il est affiché juste après  la fonction conditionnelle If de départ.

Si la condition if (isset($_POST['go'])){ n'est pas correcte (donc si le bouton go n'est pas cliqué), il n'y a aucun tests. Par contre, si le bouton go est utilisé, le test de condition est effectivement vérifié. Par le "else" de la première condition (go), donc au démarrage, les variables sont initialisées. Si le bouton OK est utilisé mais les valeurs fournies sont non valides, seul les messages d'erreur équivalents sont mises à jour. En schématique, ceci devient:

Condition go
  • Oui
  • récupération des données du formulaire

  • Mise à zéro des erreurs

  • tests variables

  • OK

  • Données correctes, la catégorie peut-être enregistrée

  • Données non correctes

  • On récupère l'erreur par $erreur_variable

  • Non
  • On initialise les variables.

Fin condition: affichage du formulaire

Remarquez que nous n'avons pas (encore) vérifier le numéro de l'attachement en cas de sous-catégorie. Pour vérifier si une catégorie existe, nous devons ouvrir la table. De plus, il est préférable d'afficher les catégories existantes, ce sera la prochaine partie. Nous développerons cette fonctionnalité en fin de chapitre.

Maintenant que nous avons vérifié la validité de la catégorie, il nous reste à insérer la catégorie dans la table. La requête MySQL prend la forme:

$requete="INSERT categorie SET nom='$nom',description='$description',attachement='$attachement',image='$image',actif='$actif'";

Un conseil, à ce stade, évitez le caractère ' dans vos descriptions et messages d'erreurs.

4. Affichage des catégories

Récupérer les catégories dans la table ne va pas être trop compliqué, c'est une simple requête SQL de type $requete='SELECT * FROM "valeur"'. Par contre, l'affichage est plus délicat. Nous devons afficher les catégories les unes en-dessous des autres (par ordre alphabétique ...) mais en plus insérer chaque fois les sous-catégories.

La méthode va d'abord rechercher tous les fichier dont le numéro d'attachement est 0. Chaque fois qu'on en rencontre 1, on va récupérer toutes les catégories dont le numéro d'attachement est justement ce numéro de catégorie. Un test sur le nombre total de catégorie va réduire le temps d'accès à la base de donnée, ceci pour éviter de rechercher des catégories inexistantes. Nous allons effectuer le tests via la commande While

Pour arriver à notre tests, nous allons devoir imbriquer plusieurs boucles entre elles. 

  • La première boucle va vérifier le nombre de catégories dans la table MySQL.

  • La deuxième boucle va vérifier les catégories

  • La troisième boucle va vérifier les sous-catégories

  • La quatrième boucle va vérifier les sous-catégories niveau 2.

L'affichage complet ne pose pas de réelle difficulté. Il prend la forme:

<?php
require('includes/start.php');
$requete='SELECT * FROM categorie';
$valeur=mysql_query($requete);
while ($tableau=mysql_fetch_array($valeur)){
   print("<b>".$tableau["uid"]." ".$tableau["nom"]." ".$tableau["description"]." ".$tableau["attachement"]." ".$tableau["image"]." ".$tableau["actif"]."<br>\n");
}
require('includes/stop.php');

Cette méthode affiche tous les enregistrements de la table ligne par ligne. Ce qui nous intéresse est de faire un tri. La présentation n'est pas non plus très esthétique utilise un tableau. Les catégories sont affichées les unes à la suite de l'autre suivant le numéro de uid, mais les catégories ne sont pas dissociées des sous-catégories

<?php
?>
<table border="1">
<?php
require('includes/start.php');
$requete='SELECT * FROM categorie';
$valeur=mysql_query($requete);
while ($tableau=mysql_fetch_array($valeur)){
?>
<tr>
<td><?php print($tableau["uid"]);?></td>
<td><?php print($tableau["nom"]);?></td>
<td><?php print($tableau["description"]);?></td>
<td><?php print($tableau["attachement"]);?></td>
<td><?php print($tableau["image"]);?></td>
<td><?php print($tableau["actif"]);?></td>
</tr>
<?php
}

?>
</table>
<?php
print('<br>');
require('includes/stop.php');
?>

La première partie de notre affichage est de vérifier le nombre d'enregistrement de notre table, ceci nous évitera de vérifier des lignes qui n'existent pas. Si le nombre de catégories (et sous catégories) est de 10 par exemple, la recherche n'est plus nécessaire dès que nous avons trouvé 10 catégories.. Nous allons lui attribuer la variable $ligne. Le fichier suivant affiche le nombre de lignes (et donc de catégories) dans la table "categorie".

<?php
require('includes/start.php');
$requete='SELECT * FROM categorie';
$valeur=mysql_query($requete);
$ligne=mysql_affected_rows();
print($ligne);
require('includes/stop.php');
?>

La variable $ligne va nous servir pour le premier tests.

$i=0
  while ($i<=$ligne){
  // boucles internes
}

Chaque fois que nous trouvons une nouvelle catégorie, nous incrémentons la variable $i. Le tests suivant va également utiliser une variable à incrémenter. Nous utiliserons $j. Cette variable va prendre toutes les valeurs possibles de 1 à 99.999.999.999 (la taille maximum de notre champ uid). La variable $i ne sert finalement qu'à réduire la recherche au nombre de catégories effectives dans la table.

Commençons par afficher les différentes catégories de la table Mysql à l'aide de ce script PHP:

<?php
require('includes/start.php');
$requete='SELECT * FROM categorie';
$valeur=mysql_query($requete);
$ligne=mysql_affected_rows();
print($ligne." catégories <br>");

$result= mysql_query("SELECT MAX(uid) AS LAST_ID FROM categorie");
$result = mysql_fetch_array($result);
$uidlast=$result['LAST_ID'];
print("uid maximum :".$uidlast);
$i=0 ;
$j=1;


while ($j<=lastuid){
  $requete="SELECT * FROM categorie where uid='$j'";
  $valeur=mysql_query($requete);
  if (mysql_affected_rows()<>0){
    $i=$i+1;
    // on vient de trouver une catégorie ou une sous-catégorie
   $tableau=mysql_fetch_array($valeur)
  ?>


    <table border="1">
       <tr>
            <td><?php print($tableau["uid"]);?></td>
            <td><?php print($tableau["nom"]);?></td>
            <td><?php print($tableau["description"]);?></td>
             <td><?php print($tableau["attachement"]);?></td>
             <td><?php print($tableau["image"]);?></td>
             <td><?php print($tableau["actif"]);?></td>
      </tr>
    </table>
<?php


}

$j=$j+1;
if($i>=$ligne){
$j=100000000000;
}
print($j." ".$i."<br>");
}
require('includes/stop.php');
?>

  • La première partie sert à récupérer le nombre de lignes dans la table et initialise les variables $i (nombre de catégorie trouvée) et $j (numéro uid). Elle est suivie par la récupération du numéro uid maximum avec la requête "SELECT MAX(uid) AS LAST_ID FROM categorie". Cette valeur est transmise à la variable $uidlast.

  • La deuxième partie débute la boucle. Tant que $j est inférieur ou égal à 99.999.999.999.999, la boucle tourne et recherche la ligne correspondant à uid =$j. Si une valeur est trouvée, on incrémente le nombre de catégories trouvées ($i), sinon (partie 4), on incrémente $j .

  • L'affichage se fait dans la partie 3, nous l'avons déjà vu plus haut.

  • La partie 4 va vérifier si le nombre de catégories trouvées est supérieures au nombre de lignes dans la table. Si c'est le cas, on donne la valeur 100.000.000.000 à $j, ce qui fait quitter directement la boucle principale. print($j." ".$i."<br>"); n'est inséré à ce stade que comme vérification et peut-être supprimé.

Au niveau affichage, il est identique à celui ci-dessus (mais en plus compliqué au niveau programmation). Ce qui nous manque, c'est de dissocier les catégories des sous catégories. Remplaçons la partie 1 par ceci:

while ($j<=$uidlast){
$requete="SELECT * FROM categorie where uid='$j'";
$valeur=mysql_query($requete);
$tableau=mysql_fetch_array($valeur);
$i=$i+1;
if ((mysql_affected_rows()<>0)&&($tableau["attachement"]=="0")){
// on vient de trouver une catégorie et négliger les sous catégories
?>

Nous avons juste déplacé l'incrémentation de la variable $i qui ne tient plus compte que des catégories principales, mais surtout mis 2 conditions (tests logique && - ET). De cette manière, nous n'affichons plus que les catégories. La dernière étape va être pour chaque catégorie de récupérer les sous-catégories.

Une fois une catégorie trouvée, nous allons vérifier dans les enregistrements de la table si le champ attachement est identique à cette catégorie. Si nous insérons les lignes suivantes à la fin de la partie ci-dessous, les sous-catégorie sont également affichées avec un décalage. Nous récupérons les différentes valeurs dans un tableau et les imprimons simplement.

// on recherche les sous-catégorie de la catégorie trouvée.

$requete="SELECT * FROM categorie where attachement='$j'";
$valeur=mysql_query($requete);
$tableau=mysql_fetch_array($valeur);
// on vient de trouver une sous catégories de la catégorie $uid
?>
<table border="1">
<tr>
<td width="20"> </td>
<td><?php print($tableau["uid"]);?></td>
<td><?php print($tableau["nom"]);?></td>
<td><?php print($tableau["description"]);?></td>
<td><?php print($tableau["attachement"]);?></td>
<td><?php print($tableau["image"]);?></td>
<td><?php print($tableau["actif"]);?></td>
</tr>
</table>
<?php

Malheureusement, cette méthode ne marche qu'avec 2 niveaux de catégories et nous en utilisons 3 ... Nous allons créer une boucle pour les sous-catégories 1 et utiliser cette partie pour les catégories de niveau 3. Finalement, l'affichage complet donne:

<?php
require('includes/start.php');
$requete='SELECT * FROM categorie';
$valeur=mysql_query($requete);
$ligne=mysql_affected_rows();
print($ligne." catégories <br>");
$result= mysql_query("SELECT MAX(uid) AS LAST_ID FROM categorie");
$result = mysql_fetch_array($result);
$uidlast=$result['LAST_ID'];
print("uid maximum :".$uidlast);
$i=0 ;
$j=1;
while ($j<=$uidlast){
$requete="SELECT * FROM categorie where uid='$j'";
$valeur=mysql_query($requete);
$tableau=mysql_fetch_array($valeur);
$i=$i+1;
if ((mysql_affected_rows()<>0)&&($tableau["attachement"]=="0")){
// on vient de trouver une catégorie et négliger les sous catégories
?>
<table border="1">
<tr>
<td><?php print($tableau["uid"]);?></td>
<td><?php print($tableau["nom"]);?></td>
<td><?php print($tableau["description"]);?></td>
<td><?php print($tableau["attachement"]);?></td>
<td><?php print($tableau["image"]);?></td>
<td><?php print($tableau["actif"]);?></td>
</tr>
</table>
<?php
// on recherche les sous-catégorie de la catégorie trouvée.
$k=1;
while ($k<$uidlast){
$requete="SELECT * FROM categorie where attachement='$j' && uid='$k'";
$valeur=mysql_query($requete);
$tableau=mysql_fetch_array($valeur);
// début du tests si une sous-catégorie existe
if (mysql_affected_rows()<>0){
// on affiche les sous-catégories 1
?>
<table border="1">
<tr>
<td width="20"> </td>
<td><?php print($tableau["uid"]);?></td>
<td><?php print($tableau["nom"]);?></td>
<td><?php print($tableau["description"]);?></td>
<td><?php print($tableau["attachement"]);?></td>
<td><?php print($tableau["image"]);?></td>
<td><?php print($tableau["actif"]);?></td>
</tr>
</table>

<?php
//début des catégories 2
$requete="SELECT * FROM categorie where attachement='$k'";
$valeur=mysql_query($requete);
if (mysql_affected_rows()<>0){
while ($tableau=mysql_fetch_array($valeur)){
// on vient de trouver une sous catégories 2
?>
<table border="1">
<tr>
<td width="40"> </td>
<td><?php print($tableau["uid"]);?></td>
<td><?php print($tableau["nom"]);?></td>
<td><?php print($tableau["description"]);?></td>
<td><?php print($tableau["attachement"]);?></td>
<td><?php print($tableau["image"]);?></td>
<td><?php print($tableau["actif"]);?></td>
</tr>
</table>

<?php
}
}
//fin catégories niveau 2
}
// fin tests sous-catégories 1
$k=$k+1;
}
}
$j=$j+1;
if($i>=$ligne){
$j=199999999999;
}
}
require('includes/stop.php');
?>

L'affichage est nettement perfectible, nous l'affinerons avec la mise en page de nos différents scripts php.

5. Insertion des sous-catégories

La dernière partie va être de permettre d'insérer des sous catégories avec une vérification des catégories existantes. Nous reprenons:

  • affichage des catégories (partie 4).

  • afficher le formulaire d'entrée

  • Si un attachement est inséré (différent de 0), vérifier si la catégorie supérieure existe.

Pour l'affichage, nous allons utiliser une fonction par facilité. Nous allons également utiliser une autre fonction (redirect) pour rediriger l'utilisateur vers cette même page lors de l'insertion ou la suppression d'une catégorie qui rappelle le formulaire. Ceci fera la mise à jour de notre page dans ce cas mais d'autres URL sont possibles.

function redirect($url, $redir = false) {
global $headmess;

$headmess['redirjs'] = '<script type="text/javascript">function redirect() {window.location="' . $url . '";} setTimeout("redirect()", 1000);</script>';
if($redir) {
return $headmess['redirjs'];
}
}

Pour vérifier si la catégorie au-dessus existe, nous allons utiliser une fonction appelée dans la partie vérification.

} elseif (souscategorie($attachement)<0){
// vérification des sous catégories
echo'categorie supérieure inconnue, pas inséré';
// fin de vérification des catégories

et la fonction:

function souscategorie($categorie){
global $requete,$valeur,$faux;
require('includes/start.php');
$requete="SELECT * FROM categorie where uid='$categorie'";
$valeur=mysql_query($requete);
if (mysql_affected_rows()<>0){
require('includes/stop.php');
// categorie existe, insertion dans la base de donnée
echo'catégorie existe';
return 1;
}else{
// catégorie inconnue, pas insérée.
echo'catégorie inconnue, pas insérée';
require('includes/stop.php');
return -1;
}
}

Si la catégorie existe, la fonction renvoie 1. Si la catégorie n'existe pas, on renvoie -1. Cette fonction ne gère pas le niveau de catégories. A ce niveau de développement, nous n'en tenons pas compte.

Créer son site Internet

Quelques remarques préliminaires concernant l'hébergement, le langage de programmation

Référencer son site

Comment référencer un site Internet, meta, balises, ... formations en ligne

Formation frontpage

Créer un site Internet en HTML avec FrontPage

Besoin de gérer vos stocks?

Ciel gescom Premium ou évolution, la solution PME

>16. Récupérer les données d'une table MySQL dans une liste déroulante

<14 . Table utilisateurs

YBET Informatique: formation débutant ou avancé

dans notre salle de formation ou en entreprise

Renseignements, tarifs et inscriptions sur notre page formations informatiques

Magasin Informatique YBET à Chiny

Autre formations en ligne:

Access - Excel - PowerPoint - Word - Internet - Quelques notes de la formation Ciel Comptabilité

Modification: 04/04/2008