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.
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.
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.
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.
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.
|