|
|
| Les
chapitres de la formation en ligne PHP - MySQL |
| 1. Programmer
en Php, mise en route |
| 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 .htaccess, configuration serveur Apache, URL
Rewriting, accès répertoires. |
| Exemples de programmation qui utilisent de ces notes de cours
Le
Luxembourg belge, intégration des annonces, agenda,
annuaire, découverte de la région, administration, ...
La ville de Durbuy
Darut.be,
portail du Luxembourg belge, intégration d'un annuaire, petites annonces
et activités sur la région |
|
21. Corrections des entrées d'annonces
1 Introduction - 2. Caractères réservés
- 3. Administration des mots interdits - 4. Tests
et enregistrements des annonces avec mots interdits - 5. Conclusion
Au chapitre 19, nous avons créé le formulaire pour
insérer nos petites annonces. Si vous l'avez un peu testé, il a (normalement)
fonctionné sans problèmes. Pourtant, nous ne pouvons pas le mettre sur un site
"en
production" tel quel. Aucune sécurité n'est associée aux
données rentrées. Un utilisateur standard ne posera pas de problèmes,
quelques spécimens, oui.
En premier, l'utilisation des 2 caractères réservés ' et "
dans les annonces va envoyer un messages d'erreur au niveau des requêtes
MySQL. Cette solution va utiliser
la fonction ADDSLASHES($variable) dans
l'insertion des annonces et STRIPSLASHES($variable)
dans l'affichage. Ces 2 fonctions vont être utilisés dans TOUS les champs
utilisateurs.
En deuxième, une
spécialité de quelques webmasters est de spamsmer les sites de ce type
(forum, livres d'or et ... sites de petites annonces). Les annonces risquent
vite de reprendre des publicités pour des médicaments, casinos ou
autres, liens sauvages sans rapport. D'autres termes peuvent également
apparaître comme des termes injurieux. Certaines annonces peuvent également
être vue comme de la calomnie vis à vis d'un site, d'une personne ou d'une
marque. Au niveau juridique, le webmasters responsable du contenu de votre site.
-
Dans le premier cas, nous allons créer une
table reprenant les mots interdits. Cette solution n'est pas parfaite
puisque les spamsmeurs vont utiliser toutes les possibilités pour essayer
d'insérer leurs mots clés, y compris avec des caractères de séparation
entre les lettres des mots. A l'insertion des annonces, nous allons juste
tester si ces mots sont repris. Si le mot apparaît, l'annonce est
automatiquement supprimée.
-
Le deuxième cas est difficile à repérer en
automatique. Selon certains termes, nous enverrons un mail à l'administrateur
reprenant l'annonce pour vérification manuelle. Un texte de type :
"Vend ordinateur de marque ZZZZ, la poubelle des PC" est un terme
injurieux pour la firme ZZZZ. Par
contre, "Poubelles contenance 1000 litres à vendre" est
une annonce standard.
En troisième, les spamsmers vont insérer des liens
dans 1 ou plusieurs case à remplir (y compris le prix ...). Un lien Internet en
HTML est codé sous forme:
-
<a href="http://www.ybet.be">YBET
informatique</a> pour un lien texte texte
-
<a href="http://www.ybet.be"><img
border="0" src="http://www.ybet.be/logo.gif" width="326"
height="48" alt="Magasin informatique"></a>
pour un lien image (avec la balise ALT optionnelle ici)
Nous allons systématiquement supprimer ces liens en
gardant le contenu. Ceci peut-être nécessaire pour certaines annonces. De
toute façon, les liens sauvages reprennent dans la majorité des cas des termes
... de la liste interdite et les annonces seront automatiquement supprimées
En dernier, on va retrouver dans le corps du message
des adresses mail, même si elle est reprise dans la fiche de l'utilisateur. Ces adresses "sauvages" sont généralement
insérées par celui qui poste l'annonce par facilité. Par contre, ces adresses
sont utilisées par d'autres robots pour envoyer des courriers indésirables.
Deux solutions sont possibles, soit supprimer automatiquement l'adresse, soit
remplacer le caractère @ par un autre mot.
Pour chaque cas, un mail va être envoyé à
l'administrateur du site reprenant les coordonnées de celui qui poste. Ceci
pour permettre par exemple de lui interdire manuellement de poster de nouvelles
annonces.
L'ensemble de ces fonctions vont être reprises dans
l'insertion d'annonces vues au chapitre 19. Par facilité, nous découperons
cette partie.
Dans entree-annonce, nous allons modifier
|
$titre = $_POST['titre'];
$erreur_titre = "";
$description = $_POST['description'];
$erreur_description = "";
$ville = $_POST['ville'];
$erreur_ville = "";
$pays = $_POST['pays'];
$erreur_pays = "";
$prix = $_POST['prix'];
$erreur_prix = "";
$ville = $_POST['telephone'];
$erreur_telephone = "";
$erreur_file = "";
$uid_cat=$_POST['uid_cat']; $dateinsertion=date('Ymd'); |
par
$titre = ADDSLASHES($_POST['titre']);
$erreur_titre = "";
$description =ADDSLASHES($_POST['description']);
$erreur_description = "";
$ville = ADDSLASHES($_POST['ville']);
$erreur_ville = "";
$pays = ADDSLASHES($_POST['pays']);
$erreur_pays = "";
$prix = ADDSLASHES($_POST['prix']);
$erreur_prix = "";
$telephone = ADDSLASHES($_POST['telephone']);
$erreur_telephone = "";
$erreur_file = "";
$uid_cat=$_POST['uid'];
$dateinsertion=date('Ymd'); |
Nous avons simplement inséré la fonction ADDSLASHES
pour chaque variable.
Dans la partie affichage liste, nous utiliserons la
fonction inverse: STRIPSLASHES($variable)
<?php
require('includes/start.php');
$requete="select * from annonce order by 'dateinsertion' DESC";
$valeur=mysql_query($requete);
$tableau=array();
while ($tableau=mysql_fetch_array($valeur)){
echoSTRIPSLASHES($tableau['code'])."-".STRIPSLASHES($tableau['titre'])."-<br>";
print($tableau['uid-cat']);
?>
<p><img border="0" src="images\<?php
print(STRIPSLASHES($tableau["photo"]));?>"></p>
<?php
$description= STRIPSLASHES($tableau['description']);
print("<br>".nl2br($description)."<br>");
print("- ".$tableau['dateinsertion']."<br>");
Print(STRIPSLASHES($tableau['ville'])."
(".STRIPSLASHES($tableau['pays'])." )");
Print("Prix :".STRIPSLASHES($tableau['Prix']));
if ($description= $tableau['tel']=="O"){
Print("<br>Téléphone: ".STRIPSLASHES($tableau['telephone']));
}
print("<hr>");
}
require('includes/stop.php');
?>
|
Cette partie du développement ne pose normalement
pas de problèmes particuliers, nous avons simplement ajouter les fonctions sur
les variables.
La première chose est de créer la partie
administration pour cette liste de mots. Nous appellerons cette table
"interdit". Nous allons utiliser simplement les notions vues au chapitre
14. Cette table ne reprend qu'un seul champ: interdit de type varchar(30).
3.1 Création de la table Interdit
La requête de création de table MYSQL reprend la
commande CREATE TABLE [IF NOT EXIST] nom_table (definition-colonne, Index).
Le champ interdit est une clé primaire, la valeur nulle est interdite.
<?php
require('../includes/start.php');
$requete="CREATE TABLE if not exists interdit (interdit varchar(30)
primary key NOT NULL)";
$erreur=mysql_query($requete);
$erreur1=mysql_error();
print($erreur."<br>");
print($erreur1);
mysql_close();
?> |
Nous aurions pu également utiliser les fichiers
stop.php et start.php
3.2. Insertion des mots interdits.
Nous allons simplement créer un petit formulaire
d'entrée comme exercice. Une version plus complète sera vue juste en-dessous
<form METHOD=\"POST\">
<p>Mot ou suite de mots interdits <input type="text"
name="interdit" size="20"></p>
<p><input type="submit"
value="Envoyer" name="go"></p>
</form> |
Comme d'habitude, ce formulaire est auto-invocant. Le
codage PHP complet de l'insertion devient:
<?php
$interdit =$_POST['interdit'];
$erreur_interdit = "";
//
if ($interdit == '')
{
$erreur_interdit = "La suite de mots interdits doit être renseignée<br>";
} else {
$interdit = ADDSLASHES($interdit);
require('../includes/start.php');
$requete="insert into interdit Set interdit='$interdit'";
$erreur=mysql_query($requete);
require('../includes/stop.php');
}
$form = "<table>
<form METHOD=\"POST\">
<p>Mot ou suite de mots interdits <input type=\"text\" name=\"interdit\" size=\"30\"><font color=\"#FF0000\">$erreur_interdit</font></p>
<p><input type=\"submit\" value=\"Insérer\" name=\"go\"></p>
</table>
</form>";
print($form);
?> |
Comme cette partie fait partie de l'administration,
elle sera insérée dans un sous-dossier (typiquement admin) protégé. Ceci
nous conduit à faire quelques simplification. La première, il n'y a pas de
tests pour vérifier si l'utilisateur utilise le bouton "Insérer". Le
deuxième est lié au dossier includes qui devient require('../includes/stop.php');
Comme le champ interdit est une clé primaire, il n'est pas non plus nécessaire
de tester si le mot existe déjà, il sera automatiquement supprimé de la liste
par MySQL.
3.3. Afficher les mots interdits
Pour pouvoir vérifier les mots insérés, nous
allons simplement afficher en liste les mots que nous avons insérés.
<?php
require('../includes/start.php');
$requete="select * from interdit";
$valeur=mysql_query($requete);
$tableau=array();
while ($tableau=mysql_fetch_array($valeur))
{
$interdit=STRIPSLASHES($tableau['interdit']);
print($interdit."<br>");
}
require('../includes/stop.php');
?> |
Ce script ne fait qu'afficher les mots dans une
liste, les uns après les autres. La partie suivante va les afficher dans un
formulaire en liste déroulante.
3.4. Ajouter, modifier, supprimer les mots interdits.
Dans les 2 parties ci-dessus, nous avons découpé
les fonctionnalités. Pourtant, le plus facile serait de rassembler toutes les
fonctions. La modification ou la suppression d'un mot dans la
liste utilise un formulaire pour rentrer le mot (ou la liste de mots) dans une
liste déroulante qui va nous servir également à afficher les mots interdits.
Une deuxième liste de choix permet de supprimer,
modifier ou insérer.
Une troisième zone de texte permet de modifier le
choix sélectionner en 1 (cas modifier) ou d'insérer (cas Insérer).
Le plus facile reste d'afficher les valeurs déjà
rentrer dans une liste déroulante. Ceci facilite la sélection. Commençons par
créer la liste déroulante. Un formulaire standard est de type:
| <form method=POST>
<p>Mots <select size=1 name=mot>
<option>liste déroulante</option>
<option>liste déroulante 2</option>
<option>...</option>
</select>
<select name=action>
<option>Insérer</option><option>Modifier</option><option>Effacer</option>
</select>
nouvelle valeur: <input type=text name=nouveau size=30>
<input type=submit value=Envoyer name=go></p></form>"; |
Ceci affiche:
Ce type de développement a déjà été
effectué pour les catégories. Dans le cadre de cette formation, nous allons le
refaire. Décomposons le travail:
<?php
$mots_interdits=array();
$tableau=array();
// début du tests auto-invocant
if (isset($_POST['go']))
{
// variable reprenant les 3 paramètres du formulaire
$choix =$_POST['mot'];
$action=$_POST['action'];
$nouveau=ADDSLASHES($_POST['nouveau']);
// vérification du deuxième bouton
if ($action=="Effacer"){
// cas effacer, on efface le choix sélectionné dans la liste
déroulante
require ('../includes/start.php');
$requete = "delete from interdit where interdit='$choix'";
$valeur = mysql_query($requete);
}elseif ($action=="Modifier"){
// Cas modifier: on remplace la valeur dans la liste déroulante
par celle de la zone texte Nouvelle valeur
if ($_POST['nouveau']=="")
{
// on teste si la valeur de remplacement est nulle.
Dans ce cas aucune action
Echo"Aucune valeur de remplacement sélectionnée, recommencez";
}else{
// sinon on effectue le remplacement
require('../includes/start.php');
$requete="UPDATE interdit SET interdit='$nouveau' WHERE interdit='$choix'";
$valeur=mysql_query($requete);
}
// fin de modifier
}elseif (($action=="Insérer")and($nouveau<>'')){
// insertion d'une nouvelle valeur si elle n'est pas nulle
require('../includes/start.php');
$requete="insert into interdit Set interdit='$nouveau'";
$erreur=mysql_query($requete);
}
}
// fin de la boucle, début de récupération des mots
require('../includes/start.php');
$requete="SELECT * FROM interdit";
$valeur=mysql_query($requete);
$i=1;
$ligne=0;
while ($tableau=mysql_fetch_array($valeur)){
// on récupère les données de la table
// print($ligne);
$mots_interdits[$i]=STRIPSLASHES($tableau['interdit']);
$i=$i+1;
}
require('../includes/stop.php');
// Affichage du formulaire
$ligne=$i;
$i=1;
$formulaire="<form method=\"POST\"><p>Mots <select size=\"1\" name=\"mot\">";
while ($i<$ligne){
$formulaire=$formulaire."<option>".$mots_interdits[$i]."</option>";
$i=$i+1;
}
$formulaire=$formulaire."</select> <select name=\"action\"><option>Insérer</option><option>Modifier</option><option>Effacer</option></select> nouvelle valeur: <input type=\"text\" name=\"nouveau\" size=\"30\"><input type=\"submit\" value=\"Envoyer\" name=\"go\"></p></form>";
print($formulaire);
?>
|
Quelques remarques, nous reprenons la liste des
valeurs en fin de programme. Ceci permet à la liste d'être remise à jour à
chaque fois. L'utilisation du bouton Envoyer est obligatoire
Nous pourrions simplement supprimer les annonces
reprenant les mots interdits, mais nous allons les conserver. Nous avons 2
solutions:
-
utiliser une autre
table identique à la
table annonce mais qui n'enregistre les annonces valides.
-
mettre un paramètres dans la table annonce qui
signale que ce message est invalide. A l'affichage, un test permet
d'afficher uniquement les annonces valides.
La deuxième méthode est plus facile à mettre en
oeuvre mais nécessite de revoir toute la programmation. De plus, elle permet
d'afficher à quelques utilisateurs privilégiés également les tables non
valides. Par contre, avec la première méthode. L'affichage, la suppression
définitive, ... ne peut se faire que via le panneau d'administration.
Dans ce développement, nous allons créer une table
équivalente que nous nommerons invalide. Voici le programme de création de la
table. Il est parfaitement identique à celle de la table annonce (y compris
avec les commandes ALTER pour rajouter les champs.
| // création table contenu des annonces
invalides
<?php
$requete="CREATE TABLE if not exists invalide (code int primary key NOT NULL auto_increment,titre varchar(120) not null,description blob not null,photo varchar(255), ville varchar(40),pays enum('Belgique','France','Luxembourg'),prix decimal(8,2) not null,dateinsertion date,telephone
varchar(15),mail varchar(30),index(ville(10)))";
$erreur=mysql_query($requete);
$erreur1=mysql_error();
$requete="alter table invalide add uid_cat smallint(6) NOT NULL, add uid_util int(10) NOT NULL, add tel char(1)";
$erreur=mysql_query($requete);
?> |
Cette solution permettra de reprendre les mêmes
requêtes MySQL, en changeant uniquement le nom de la table.
4.1. Vérification de la présence des mots interdits dans un texte
Pour vérifier si un mot (ou une suite de mots) est
présent dans un texte, nous utilisons:
| EREG($variable1,$variable2)
recherche si la chaîne $variable1 est contenue dans $variable2, renvoie
une valeur logique. |
Cette fonction
PHP a été utilisée comme exercice pour détecter un numéro de TVA belge.
Dans notre cas, nous allons utiliser comme variable1 un ensemble de variables
reprises dans une table. Ceci nécessite une boucle pour vérifier l'ensemble
des valeurs interdites.
Dans la partie insertion des données du chapitre 19,
aucune vérification n'est faite sur aucun champ (excepté pour la manipulation
des photos). Nous allons simplement tester tous les champs avec les mots
interdits. Dans la cas où un des mots de la liste est détecté, on va donner
au paramètre (variable) $accepté la valeur"O". Si le mot est
détecté dans un des champs, la valeur du paramètre devient "N". Au
niveau de l'enregistrement, si le paramètre est OUI, il est enregistré dans la
table "annonce". Dans le cas contraire, il est enregistré dans la
table "invalide" préalablement créé. Charge à l'administrateur de
supprimer cette annonce.
A la suite de cette partie du programme, nous allons
insérer les différents tests
$titre = ADDSLASHES($_POST['titre']);
$erreur_titre = "";
$description =ADDSLASHES($_POST['description']);
...
$dateinsertion=date('Ymd'); |
Nous allons créer une fonction
personnelle PHP comme vu au chapitre 4. Cette fonction demande en entrée un
texte, en sortie, elle renvoie "O" si un des mot n'est pas inclus et
"N" dans le cas contraire. Commençons par créer cette fonction
personnelle. Un petit rappel, les fonctions personnelles sont de la forme:
- function nom-fonction($argument1, $argument2) {
- // code php
- return $variable;
- }
|
Les paramètres à envoyer à la fonction sont le
textes de l'annonce tout simplement. Le paramètre de retour est simplement vrai
ou faut. Nous allons décomposer le fonctionnement du programme par facilité.
Commençons par un développement simple, sans nous occuper des mots interdits reprenant
la table.
<?php
$texte="Cette phrase va être analysée pour détecter des mots interdits";
$correct=motinterdit($texte);
print($correct);
function motinterdit($texte){
$interdit="mots";
$correct="1";
if (EREG($interdit,$texte))
{
$correct="0";
}
return $correct;
}
?> |
Dans ce petit programme, nous définissons le texte
à tester au préalable via la variable $texte. La valeur $correct est
déterminée par la fonction motinterdit. Celle-ci renvoie "1" si le
mot est inclus dans $texte, "0" sinon. C'est justement ce que nous
souhaitons. La seule difficulté va être de récupérer les mots à tester dans
la table invalide et de faire le texte en boucle tant que tous les mots
interdits ne sont pas testés.
Nous allons décomposer cette fonctions en 2: une
partie pour reprendre la liste des mots sous forme de variable tableau (déjà
faite) et une partie pour la détection. Cette méthode est logique puisque le
tests va être fait sur plusieurs champs. Autant que la récupération se fasse
une seule fois et les tests à chaque fois.
La partie récupération a déjà été développée.
require('../includes/start.php');
$requete="SELECT * FROM interdit";
$valeur=mysql_query($requete);
$i=1;
$ligne=0;
while ($tableau=mysql_fetch_array($valeur)){
// on récupère les données de la table
// print($ligne);
$mots_interdits[$i]=STRIPSLASHES($tableau['interdit']);
$i=$i+1;
}
require('../includes/stop.php'); |
Toute la difficulté va être d'envoyer et et de
récupérer plusieurs variables via une fonction. Hors, si une fonction accepte
plusieurs paramètres en entrée (avec un nombre fixé en plus), elle n'accepte
pas de renvoyé plusieurs paramètres via la commande return. La solution passe
par une matrice (une variable de type tableau). Essayons le petit programme
ci-dessus.
<?php
$tableau1=array();
$tableau1[1]="rien";
$tableau1[2]="rien";
tests($tableau1);
// envoit tableau
$rien1=array();
$rien1=renvoit();
print("<br>".count($rien1)." valeurs récupérées de la fonction renvoit()");
function renvoit()
{
// cette fonction renvoie un tableau
$rien=array();
$rien[1]="1";
$rien[2]="2";
return $rien;
}
function tests($tableau)
// cette fonction reçoit une variable tableau et affiche le nombre de cellules.
{
print(count($tableau)." valeurs transférées à la fonction tests");
}
?> |
Nous commençons par créer le tableau $tableau1 et
nous l'envoyons dans la fonction tests. Celle ne fait que compter le nombre de
cellule dans la variable transférée et afficher le nombre (count($tableau)).
La ligne suivante définit la matrice $rien1 et récupère les données de la
fonction renvoit(). Cette fonction ne fait finalement que de créer un tableau
$rien à 2 entrées et le renvoi comme résultat de la fonction. C'est justement
ce que nous voulons.
Dans le premier cas, nous souhaitons récupérer le
nombre de mots interdits et les insérer dans une variable tableau (la fonction
renvoit() dans l'exemple ci-dessus. Une fois les mots déterminés, nous devons
renvoyer ces mots dans une fonction pour les tester (c'est la fonction tests()
ci-dessus).
Le petit script en PHP ci-dessus récupère les
variables de notre table MySQL via la fonction motsinterdits() et les affichent.
Cette fonction doit être insérée dans le dossier include, ce qui explique que
require('start.php'); ne tient pas compte du répertoire
<?php
$mots_interdits=array();
$mots_interdits=motsinterdits();
$ligne=count($mots_interdits);
print($ligne." lignes <br>");
$i=1;
while($i<=$ligne)
{
print($mots_interdits[$i]."<br>");
$i=$i+1;
}
function motsinterdits()
{
require('start.php');
$requete="SELECT * FROM interdit";
$valeur=mysql_query($requete);
$i=1;
while ($tableau=mysql_fetch_array($valeur)){
// on récupère les données de la table
$mots_interdits[$i]=STRIPSLASHES($tableau['interdit']);
$i=$i+1;
}
require('stop.php');
print("<br>termine <hr>");
return $mots_interdits;
} |
La deuxième fonction va être de tester si un des
mots existe dans une variable $texte via la fonction EREG() de l'exemple
ci-dessus. Le petits programme ci dessus récupère les mots interdits via la
fonction ci-dessus, assigne à $texte le texte à tester. Dans notre cas, nous
lui avons défini la valeur "tests sur les mots interdits". Si la
chaîne contient un des mots refusé, la fonction renvoie "N", sinon,
"O" (valeurs correctes). Remarque si la liste contient une suite de
mots, elle ne vérifie pas dans le désordre. Il faut donc mieux insérer dans
la table des mots que des suites de mots.
<?php
$mots_interdits=array();
$mots_interdits=motsinterdits();
$ligne=count($mots_interdits);
print($ligne." lignes <br>");
$i=1;
while($i<=$ligne)
{
print($mots_interdits[$i]."<br>");
$i=$i+1;
}
$texte="tests sur les mots interdits";
$correct=inclusinterdits($texte,$mots_interdits);
print($correct);
function inclusinterdits($texte,$mots_interdits)
{
$i=1;
$ligne=count($mots_interdits);
$correct="O";
while ($i<=$ligne)
{
if (EREG($mots_interdits[$i],$texte))
{
$correct="N";
}
$i=$i+1;
}
return $correct;
}
function motsinterdits()
{
require('start.php');
$requete="SELECT * FROM interdit";
$valeur=mysql_query($requete);
$i=1;
while ($tableau=mysql_fetch_array($valeur)){
// on récupère les données de la table
$mots_interdits[$i]=STRIPSLASHES($tableau['interdit']);
$i=$i+1;
}
require('stop.php');
print("<br>termine <hr>");
return $mots_interdits;
} |
Il ne nous reste plus qu'à insérer ces 2
fonctions dans le fichiers fonctions.php inclus dans le dossier includes,
appelée avec le début des procédures.
4.2. Correction de notre programme d'insertion de
petites annonces.
Pour éviter que les spamsmeurs ne détectent trop la
méthode, rien ne préviendra que le message est mis de coté. Tous les tests
standards sont donc effectuer. Nous allons simplement effectuer les tests
ci-dessus à la récupérations des données via la formulaire et modifier la
requête d'insertion si la variable $correct="N" pour l'insérer dans
l'autre table. Nous pourrons alors comme administrateur vérifier ces annonces,
les supprimer, les modifier ou même les renvoyer vers la table standard après
vérification.
Reprenons notre programme d'entrée des annonces et
insérons les lignes suivantes (en rouge).
<?php
require('includes/header.php');
require('includes/fonctions.php');
?>
<body vlink="#0000FF" bgcolor="#D8EAFA" topmargin="0"
leftmargin="0">
<div align="center">
<table border="1" width="90%">
<tr>
<td width="20%" align="center">
<?php
include('includes/colon-left.php');
?>
</td>
<td width="60%">
<?php
// début affichage du formulaire
$uid_util="120";
require('includes/start.php');
$categorie_tab=array();
$requete="SELECT * FROM categorie";
$valeur=mysql_query($requete);
$i=0;
$ligne=0;
while($tableau=mysql_fetch_array($valeur)){
if($tableau['actif']<>"N"){
$categorie_tab[$i]['uid']=$tableau['uid'];
$categorie_tab[$i]['nom']=$tableau['nom'];
$categorie_tab[$i]['description']=$tableau['description'];
$categorie_tab[$i]['attachement']=$tableau['attachement'];
$i=$i+1;
}else{
// categorie non active
}
}
require('includes/stop.php');
// début du traitement des catégories - sous catégories dans le tableau
$ligne=$i;
$i=0;
while ($i<$ligne){
if ($categorie_tab[$i]['attachement']<>0){
// vérification des sous catégories 1: ce n'est pas une catégorie
$k=$categorie_tab[$i]['attachement'];
$nom=$categorie_tab[$i]['nom'];
// on récupère attachement et vérifie si uid est effectivement avec attachement à 0
$j=0;
$l=0;
//
while ($j<$ligne){
if(($categorie_tab[$j]['uid']==$k)&&($categorie_tab[$j]['attachement']=="0")){
$l=1;
$categorie_tab[$i]['complet']= $categorie_tab[$j]['complet'];
}
$j=$j+1;
}
// si $l = 1, il s'agit bien d'une sous-catégorie de niveau 1
if ($l==1){
$categorie_tab[$i]['cat1']=$k;
$categorie_tab[$i]['cat2']=$categorie_tab[$i]['uid'];
$categorie_tab[$i]['cat3']="0";
$categorie_tab[$i]['complet']= $categorie_tab[$i]['complet']."->".$categorie_tab[$i]['nom'];
}else{
// c'est une catégorie de niveau 2, il faut retrouver les 2 catégories supérieures
$j=0;
$l=0;
while ($j<$ligne){
if(($categorie_tab[$j]['uid']==$k)&&($categorie_tab[$j]['attachement']<>"0")){
$l=$j;
$j=$ligne;
}
$j=$j+1;
}
$categorie_tab[$i]['cat1']=$categorie_tab[$l]['attachement'];
$categorie_tab[$i]['cat2']=$categorie_tab[$l]['uid'];
$categorie_tab[$i]['cat3']=$categorie_tab[$i]['uid'];
// on recherche ensuite la catégorie
$m=0;
while ($m<$ligne){
if (($categorie_tab[$m]['uid']==$categorie_tab[$i]['cat1'])&&($categorie_tab[$m]['attachement']==0)){
$categorie_tab[$i]['complet']=$categorie_tab[$m]['nom']."->".$categorie_tab[$l]['nom']."->".$categorie_tab[$i]['nom'];
$m=$ligne;
}
$m=$m+1;
}
}
// fin de vérification des catégories 1
}else{
// c'est une catégorie }else{
$categorie_tab[$i]['cat1']=$categorie_tab[$i]['uid'];
$categorie_tab[$i]['cat2']=0;
$categorie_tab[$i]['cat3']=0;
$categorie_tab[$i]['complet']=$categorie_tab[$i]['nom'];
}
$i=$i+1;
}
// test d'exécution du sommaire
if (isset($_POST['go'])){
$titre = ADDSLASHES($_POST['titre']);
$erreur_titre = "";
$description =ADDSLASHES($_POST['description']);
$erreur_description = "";
$ville = ADDSLASHES($_POST['ville']);
$erreur_ville = "";
$pays = ADDSLASHES($_POST['pays']);
$erreur_pays = "";
$prix = ADDSLASHES($_POST['prix']);
$erreur_prix = "";
$telephone = ADDSLASHES($_POST['telephone']);
$erreur_telephone = "";
$erreur_file = "";
$tel=$_POST['tel'];
// pour tests
$mail="ybet-skynet";
// pour tests :$uid_cat=$_POST['uid'];
$uid_cat="1";
$dateinsertion=date('Ymd');
// tests des mots interdits
$correct="O";
$mots_interdits=array();
$mots_interdits=motsinterdits();
$correct=inclusinterdits($titre,$mots_interdits,$correct);
$correct=inclusinterdits($description,$mots_interdits,$correct);
$correct=inclusinterdits($ville,$mots_interdits,$correct);
$correct=inclusinterdits($pays,$mots_interdits,$correct);
$correct=inclusinterdits($prix,$mots_interdits,$correct);
$correct=inclusinterdits($telephone,$mots_interdits,$correct);
if ($_FILES['photo']['name']==""){
// nécessaire si l'utilisateur ne met pas de photo, alors photo par défaut
$_FILES['photo']['name']="logo-min.gif";
}
// echo$_FILES['photo']['name']."-";
// echo"<br>".$_FILES['photo']['tmp_name']."<br>";
// vérification fichier
$taille=getimagesize($_FILES['photo']['tmp_name']);
// echo "<br>".$taille[0].'-'.$taille[1]."pixels";
if ($_POST['titre'] == ''){
$erreur_titre = "Entrez un nom<br>";
} elseif ($_POST['description'] == ''){
$erreur_description = "Entrez une description<br>";
} elseif ($_POST['ville'] == ''){
$erreur_ville = "Entrez une ville<br>";
} elseif (!imageok($_FILES['photo']['name'])){
echo'Image incorrecte';
$erreur_file = "<br>Seuls sont acceptés les formats GIF, JPG et
PNG";
}elseif($taille[0]>300){
$erreur_file ="<font color=\"#FF0000\">Image trop large, maximum 300 pixels</font>";
}elseif (($_FILES['photo']['tmp_name']=="")&&($_FILES['photo']['name']<>"logo-min.gif")){
$erreur_file ="<font color=\"#FF0000\">Photo non reconnue, essayez une autre photo, en GIF par exemple</font><br>";
}elseif($taille[1]>400){
$erreur_file ="<font color=\"#FF0000\">Image trop haute, supérieure à 400 pixels</font>";
} else {
// on entre les données
require('includes/start.php');
if($_FILES['photo']['name']<>"logo-min.gif"){
$photo=$valeur.$_FILES['photo']['name'];
}else{
$photo="logo-min.gif";
}
// insertion dans la base de donnée en fonction de $correct
if ($correct=="O")
{
$requete="INSERT contenu SET titre='$titre',description='$description',photo='$photo',ville='$ville',pays='$pays',prix='$prix',dateinsertion='$dateinsertion',
telephone='$telephone',mail='$mail',uid_cat='$uid_cat',uid_util='$uid_util',tel='$tel'";
}else{
$requete="INSERT invalide SET titre='$titre',description='$description',photo='$photo',ville='$ville',pays='$pays',prix='$prix',
dateinsertion='$dateinsertion',telephone='$telephone',mail='$mail',uid_cat='$uid_cat',uid_util='$uid_util',tel='$tel'";
}
$valeur=mysql_query($requete);
// -- on code la photo et on crée la miniature si ce n'est pas celle par défaut
if ($_FILES['photo']['name']<>"logo-min.gif"){
$requete="select * from contenu where titre ='$titre' and dateinsertion='$dateinsertion'";
$valeur=mysql_query($requete);
while ($tableau=mysql_fetch_array($valeur)){
$photo=$tableau["code"]."-".$_FILES['photo']['name'];
$code= $tableau["code"];
}
// insertion dans la base de donnée en fonction de $correct
if ($correct=="O")
{
$requete="update contenu set photo='$photo' where code='$code'";
}else{
$requete="update invalide set photo='$photo' where code='$code'";
}
$valeur=mysql_query($requete);
// transfert du fichier avec le code de l'annonce en début du nom.
move_uploaded_file($_FILES['photo']['tmp_name'],"images/".$code."-".$_FILES['photo']['name']);
// fin de transfert du fichier
// création de la miniature.
$taille=getimagesize("images/".$code."-".$_FILES['photo']['name']);
If ($taille[2]==1){
// ceci est une image GIF
$image1=imagecreatefromgif('images/'.$photo);
$image2=imagecreate(60,60);
imagecopyresized($image2,$image1,0,0,0,0,60,60,$taille[0],$taille[1]);
imagegif($image2,"images/".$code."-mini-".$_FILES['photo']['name']);
}elseif ($taille[2]==2){
// ceci est une image JPG
$image1=imagecreatefromjpeg('images/'.$photo);
$image2=imagecreate(60,60);
imagecopyresized($image2,$image1,0,0,0,0,60,60,$taille[0],$taille[1]);
imagejpeg($image2,"images/".$code."-mini-".$_FILES['photo']['name']);
}elseif ($taille[2]==3){
// ceci est une image png
$image1=imagecreatefrompng('images/'.$photo);
$image2=imagecreate(60,60);
imagecopyresized($image2,$image1,0,0,0,0,60,60,$taille[0],$taille[1]);
imagepng($image2,"images/".$code."-mini-".$_FILES['photo']['name']);
}else{
echo'Format non accepté pour miniaturiser';
}
}
// fin de la création de la miniature
print('<br>Votre annonce a bien été enregistrée<BR> Merci');
// fin du programme de création d'une nouvelle annonce.
}
} else {
$erreur_file = "";
$erreur_titre = "";
$description = "Description de la catégorie";
$erreur_description = "";
$erreur_file = "";
$erreur_ville="";
}
$form = "<form method=\"POST\" ENCTYPE=\"multipart/form-data\">
<p>Titre annonce <input type=\"text\" name=\"titre\" size=\"120\"><br><font
color=\"#FF0000\">$erreur_titre</font></p>
<p><select size=\"1\" name='uid'>";
$i=0;
while ($i<$ligne){
$uid= $categorie_tab[$i]['uid'];
$complet= $categorie_tab[$i]['complet'];
$form=$form."<option value=".$uid.">".$complet."</option>";
$i=$i+1;
}
$form=$form."</select>
<p>Description de votre annonce</p>
<P><TEXTAREA NAME=\"description\" ROWS=\"8\" COLS=\"50\"
WRAP=virtual></TEXTAREA></p><p><font color=\"#FF0000\">
$erreur_description</font></P>
<p>Ville: <input type=\"text\" name=\"ville\" size=\"40\"><font
color=\"#FF0000\">$erreur_ville</font> Pays: <select
name=\"pays\">
<option selected>Belgique</option>
<option>France</option>
<option>Luxembourg</option>
</select>
<P>Téléchargez une Photo : <input TYPE=\"file\" NAME=\"photo\"><font
color=\"#FF0000\">$erreur_file;</font>
Prix : <input type=\"text\" name=\"prix\" size=\"13\"><P>
Téléphone : <input type=\"text\" name=\"telephone\" size=\"15\"> Tel. affiché: <input
type=\"checkbox\" name=\"tel\" value=\"ON\" checked><P>
<input type=\"submit\" value=\"Envoyer\" name=\"go\">
</form>";
print($form);
function imageok($image_ok){
// on teste d'abord l'extension du fichier
$subject =$image_ok ;
$pattern = '/(gif|jpg|png)$/i';
$matches=preg_match($pattern,$subject);
return $matches;
}
//Fin affichage entrée des données>
?>
</td>
<td width="20%" align="center">
<?php
include('includes/colon-right.php');
?>
</td>
</tr>
</table>
</div>
<?php
// require('includes/stop.php');
//echo'Base de donnée fermée';
include('includes/footer.php');
?> |
Nous devons également modifier la fonction
inclusinterdits (dans fonctions.php). La valeur $correct précédente lui est
directement envoyée.
function inclusinterdits($texte,$mots_interdits,$correct)
{
$i=1;
$ligne=count($mots_interdits);
while ($i<=$ligne)
{
if (EREG($mots_interdits[$i],$texte))
{
$correct="N";
}
PRINT($correct.$mots_interdits[$i]);
$i=$i+1;
}
return $correct;
}
?> |
La modification ne fait qu'insérer les 2 fonctions
à la fin de la récupération par post des variables pour chaque valeur entrée
par l'utilisateur. La valeur $correct est mise à "O" en début de
déclaration et l'envoie également vers la fonction. A chaque appel de la
fonction, elle renvoie la valeur $correct, égale à celle rentrée s'il n'y a
pas de problème, N si un mot interdit est détecté.
Nous venons déjà de bloquer certaines rentrées. Le
chapitre suivant va tester les annonces au niveau des liens inclus (une autre
spécialité des webmasters indélicats).
Une remarque des participants au cours: "De
toute façon, l'utilisateur doit rentrer son adresse mail avant de poster une
annonce". Effectivement, lorsque tout le développement sera fini, ce sera
une des conditions pour poster une petite annonce. Malheureusement, ce n'est pas
une sécurité. Si cette méthode permet de bloquer les logiciels automatiques,
elle ne bloque pas le spams manuel (créer une adresse mail est relativement
facile et par principe, je ne bloque pas les adresses mail gratuites). Et puis,
un habitué peut toujours décidé de vendre un produit spécial sans but de
spams.
A ce stade, je sépare en 2 parties. Le site
dahut.be reprend la suite du développement sur cette page: Aide
sur le développement petites annonces. YBET.be reprenant la suite de la
formation PHP - MySQL
|