Création Internet, référencement: dahut.be

Prestations sur Internet

 
B-6810 IZEL
Tél. /fax: 00 (0) 61/32.00.15.

Création de site

Référencement Références Contact
 
Quelques aides en programmation PHP
Cette partie reprend quelques trucs spécifiques en langage PHP.

Aide PHP - MySQL

Téléchargements

 

11. Suppression des liens dans les annonces, modification des adresses mail

1 Introduction - 2. Les liens - 3. Suppressions des images, photos - 4. Modification des adresses mail - 5. Administration des mots remplacés - 6. Remplacement dans le formulaire

1. Introduction.

Dans un précédant développement, nous avons déjà envoyé les annonces concernant des mots interdits dans une table MySQL de transit, charge à l'administrateur de les supprimer ou de les accepter. Cette partie administration fera l'objet d'un prochain chapitre.

Il nous reste à corriger deux problèmes:

  • l'insertion de lien dans les annonces

  • l'insertion de photos directement dans le texte des annonces

  • la modification des adresses mails pour éviter les robots de spams.

2. Les liens

Plusieurs solutions sont possibles, soit nous envoyons les annonces contenant des liens vers la base de donnée contenant les annonces "refusées", soit nous modifions directement des caractères dans le lien. Dans notre cas, nous allons utiliser la deuxième solution.

Nous pourrions exécuter une deuxième fonction pour ces tests mais modifions plutôt la fonction inclusinterdits() pour tenir compte des liens et les modifier. Si un mot interdit est détecté, l'annonce sera de toute façon supprimée.

En HTML, les liens sont sous la forme:

  • <a href="http://www.dahut.be">dahut</a> pour les liens textes

  • <a href="http://www.dahut.be"><img border="0" src="../annonce.jpg"></a>

Dans les 2 cas, on retrouve <a href en début et </a> en fin. Nous allons simplement détecter la première chaîne de caractère, supprimer le contenu jusqu'au </a> suivant (inclus). Dans l'exemple texte ci-dessus, ça donnera uniquement dahut.

Plusieurs fonctions vont être utilisée pour cette partie

  • EREG($variable1,$variable2) qui recherche si la chaîne $variable1 est contenue dans $variable2, renvoie une valeur logique.

  • STR_replace("caractère à remplacer","caractère de remplacement",$variable) remplace dans la chaîne $variable les caractères à replacer par le caractère de remplacement. Cette fonction PHP tient compte de la casse. Exemple: STR_REPLACE("i","y'","ibet") donne ybet.

  • Explode($caractere,$chaine[,int limit]) coupe la variable texte $chaine en deux en supprimant le caractère de séparation $caractere. Le résultat est renvoyé sous forme de tableau. L'option limit (à partir de la version 4.0.1, une valeur entière) permet de définir le nombre maximum de lignes du tableau renvoyée par la fonction. La dernière ligne contient alors le reste de la chaîne.

Et oui, il n'y a pas de fonction dédiée en PHP. Nous devons dès lors la faire. La première partie va être de détecter si la chaîne <a href existe. Si elle n'existe pas, nous quittons la fonction. Par contre, si elle existe, nous débutons le traitement de la chaîne. 

Nous allons créer une fonction pour supprimer les termes indésirables. Nous allons d'abord inclure une fonction conditionnelle si pour tester si le début d'un lien existe. 

function modif_texte($texte)
{
if (EREG("<a href",$texte))
{
echo "Lien détecté, nous devons traiter la chaîne";
}
return $texte;
}
?>

Cette partie ne fait qu'afficher le texte Lien détecté, nous devons traiter la chaîne. Il nous reste juste à créer la fonction qui va supprimer la chaîne. La commande va utiliser la fonction Explode($caractere,$chaine[,int limit]) dans une boucle. Le principal problème de cette fonction est qu'elle utilise une variable tableau.

Comme d'habitude, nous allons décomposer le développement de la fonction pour la rendre plus compréhensible. Commençons par ce petit tests

<?php
$texte="avant <a href=\"http://www.dahut.be\">Loupanthère</a> après";
echo $texte.": texte <br>";
$texte1=explode("<a href",$texte);
echo "<br>".$texte1 [0];
echo "<br>".$texte1 [1];
?>

Nous assignons à la variable texte la valeur avant <a href=\"http://www.ybet.be\">ybet</a> après et nous la coupons en deux. Ceci nous affiche:

avant Dahut après: texte

avant
="http:/www.dahut.be/">Dahut après

La première partie du texte est conservée dans $texte1 [0], la deuxième partie affiche =\"http://www.dahut.be\">Dahut</a> après.

Nous avons déjà supprimé le début de la référence. Il nous reste à supprimer la partie de $texte1 [1] avant la partie </a>. Nous allons refaire la même fonction en utilisant cette fois comme chaîne texte $texte1[1].

<?php
$texte="avant <a href=\"http://www.dahut.be\">dahut</a> après";
echo $texte."<br>";

// suppression de la chaîne <a href
$texte1=explode("<a href",$texte,2);

// suppression de > à la fin de l'adresse
$texte2=explode(">",$texte1 [1],2);
$texte=$texte1 [0].$texte2 [1];

// suppression de la chaîne </a>
$texte2=explode("</a>",$texte,2);
$texte=$texte2 [0].$texte2 [1];
echo "<br> texte sans le lien: ".$texte;
?>

Remarquez que nous avons fixé à 2 la limite de la fonction explode (soit une seule fois la chaîne détectée). Ceci évite de supprimer les parties suivantes. Il nous reste maintenant à faire tourner cette fonction en boucle tant que l'on détecte la chaîne de caractère. Nous allons simplement utiliser la fonction while avec comme condition EREG("<a href",$texte)

<?php
$texte="avant <a href=\"http://www.dahut.be\">dahut</a> après";
echo $texte."<br>";

while (EREG("<a href",$texte))

{

// suppression de la chaîne <a href
$texte1=explode("<a href",$texte,2);

// suppression de > à la fin de l'adresse
$texte2=explode(">",$texte1 [1],2);
$texte=$texte1 [0].$texte2 [1];

// suppression de la chaîne </a>
$texte2=explode("</a>",$texte,2);
$texte=$texte2 [0].$texte2 [1];

}
echo "<br> texte sans le lien: ".$texte;
?>

Cette fonction supprime également les liens contenus dans les images mais ne supprime pas les images.

3. Suppression des images, photos, ...

<a href=\"http://www.ybet.be\"><img border=\"0\" src=\"http://www.ybet.be/logo.gif\" width=\"326\" height=\"48\" alt=\"Magasin\"></a> devient <img border=\"0\" src=\"http://www.ybet.be/logo.gif\" width=\"326\" height=\"48\" alt=\"Magasin informatique\"> Ceci va être beaucoup plus rapide puisque nous allons supprimer tout le contenu entre <img et >. Cette partie se met à la fin de la procédure ci-dessus

while (EREG("<img",$texte))
{
// suppression de la chaîne <a href
$texte1=explode("<img",$texte,2);
// suppression de > à la fin de l'adresse
$texte2=explode(">",$texte1 [1],2);
$texte=$texte1 [0].$texte2 [1];// suppression de la chaîne </a>
}
echo "<br> texte sans image: ".$texte;

4. Modification des adresses mail

Un utilisateur peut également insérer son adresse mail. Ceci n'a rien d'interdit, finalement mais pour éviter les robots de spams, nous allons simplement remplacer le caractère @ par un autre caractère, par exemple le -. ybet@skynet1.be devient ybet-skynet1.be.

Finalement, cette fonction pourrait être intéressante pour d'autres fonctionnalités. Détecter des caractères ou des mots et les remplacer par d'autres. Ceci permettra également à un administrateur d'accepter le cas échéant les adresses mails en claire. Comme au chapitre précédant, nous allons débuter en créant la partie administration. Ceci nécessite une table que nous appellerons remplace reprenant le mot à remplacer (champ refuse) et le mots de substitution (champ remplace).

<?php
require('includes\start.php');
Mysql_select_db('ybet');

// cette partie ouvre la base de donnée
$requete="CREATE TABLE if not exists remplace (refuse varchar(30) primary key NOT NULL,remplace varchar(30))";
$erreur=mysql_query($requete);
$erreur1=mysql_error();
mysql_close();
?>

5. Administration mots remplacés.

La première partie va être l'administration des mots (caractères) à remplacer. Nous ne pouvons pas utiliser le développement du chapitre précédant puisque dans ce cas, nous devons afficher les 2 paramètres liés. Nous allons de nouveau utiliser une liste déroulante dans le formulaire. Pour rappel, la structure des liste déroulante dans les formulaires est:

<p><select size="1" name="D1">

<option value="valeur envoyée">valeur affichée</option>

</select></p>

Dans notre cas, "valeur affichée va reprendre les 2 valeurs (refuse et remplace), la valeur envoyée va être uniquement la valeur refusée.

La première partie va être de récupérée les données de la table remplace

<?php
$mots_remplace=array();
require('../includes/start.php');
$requete="SELECT * FROM remplace";
$valeur=mysql_query($requete);
echo $valeur."<br>";
$ligne=0;
$i=1;
while ($tableau=mysql_fetch_array($valeur)){
$mots_remplace[$i]["refuse"]=STRIPSLASHES($tableau['refuse']);
$mots_remplace[$i]["remplace"]=STRIPSLASHES($tableau['remplace']);
print($mots_remplace[$i]["refuse"]." ".$mots_remplace[$i]["remplace"]."<br>");
$i=$i+1;
}

$ligne=$i;

Cette fonction ne fait que récupérer les données présentes dans la table dans un tableau ($mots_remplace) et les afficher. Il va nous falloir créer le formulaire en utilisant ces données.

$ligne=$i;
$formulaire="<form method=\"POST\"><p>Mots <select size=\"1\" name=\"mot\">";
$i=1;
while ($i<$ligne){
$formulaire=$formulaire.'<option value="$mots_remplace[$i]["refuse"]'."\">".$mots_remplace[$i]["refuse"]." : ".$mots_remplace[$i]["remplace"]."</option>";
$i=$i+1;
}
$formulaire=$formulaire."</select> <select name=\"action\"><option>Insérer</option><option>Effacer</option></select> <input type=\"submit\" value=\"Envoyer\" name=\"go\"></p></form>";
print($formulaire);

Le formulaire complet est similaire à celui des mots interdits. La partie reprenant la partie suppression, modification et suppression devient:

<?php
if (isset($HTTP_POST_VARS['go']))
{
// variable reprenant les 3 paramètres du formulaire
$choix =$HTTP_POST_VARS['mot'];
$action=$HTTP_POST_VARS['action'];
$refuse=$HTTP_POST_VARS['refuse'];
$remplace=$HTTP_POST_VARS['remplace'];
// 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 remplace where refuse='$choix'";
$valeur=mysql_query($requete);
$erreur=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 ($HTTP_POST_VARS['refuse']=="")
{
// on teste si la valeur de remplacement est nulle. Dans ce cas aucune action
Echo"Aucune valeur de départ n'est sélectionnée, recommencez";
}else{
// sinon on effectue le remplacement
require('../includes/start.php');
$requete="UPDATE remplace SET refuse='$refuse',remplace='$remplace' WHERE refuse='$choix'";
$valeur=mysql_query($requete);
}
// fin de modifier
}elseif (($action=="Insérer")and($refuse<>'')){
// insertion d'une nouvelle valeur si elle n'est pas nulle
require('../includes/start.php');
$requete="insert into remplace Set refuse='$refuse', remplace='$remplace'";
$erreur=mysql_query($requete);
}
}
$mots_remplace=array();
require('../includes/start.php');
$requete="SELECT * FROM remplace";
$valeur=mysql_query($requete);
$ligne=1;
$i=1;
while ($tableau=mysql_fetch_array($valeur)){
// on récupère les données de la table
// print($ligne);
// on récupère les données de la table
// print($ligne);
$mots_remplace[$i]["refuse"]=STRIPSLASHES($tableau['refuse']);
$mots_remplace[$i]["remplace"]=STRIPSLASHES($tableau['remplace']);
$i=$i+1;
}
$ligne=$i;
$formulaire="<form method=\"POST\"><p><b>Gestion de la table de remplacement</b> </p><p>Mots <select size=\"1\" name=\"mot\">";
$i=1;
while ($i<$ligne){
$formulaire=$formulaire."<option value=\"".$mots_remplace[$i]["refuse"]."\">".$mots_remplace[$i]["refuse"]." : ".$mots_remplace[$i]["remplace"]."</option>";
$i=$i+1;
}
$formulaire=$formulaire."</select> <select name=\"action\"><option>Insérer</option><option>Effacer</option><option>Modifier</option></select> <p>nouveau refuse: <input type=\"text\" name=\"refuse\" size=\"30\"> Remplacé par: <input type=\"text\" name=\"remplace\" size=\"30\"><input type=\"submit\" value=\"OK\" name=\"go\"></p></form>";
print($formulaire);
?>

Remarquez que nous testons systématiquement si le mot refusé n'est pas vide dans notre test. Nous aurions pu insérer d'autres contraintes

6. Remplacement dans les formulaires

Il ne nous reste plus qu'à tester les rentrées dans le formulaire pour remplacer les mots (y compris un mot ou un caractère par rien). Nous avons déjà récupéré les données sous forme de matrice $mots_remplace[$i]["refuse"] et $mots_remplace[$i]["remplace"]. Par la variable $ligne, nous avons également le nombre d'entrées même si nous aurions pu utiliser la fonction count().

Nous allons utiliser la commande si un des caractère à remplacer est détecté: STR_replace("caractère à remplacer","caractère de remplacement",$variable) remplace dans la chaîne $variable les caractères à replacer par le caractère de remplacement. Cette fonction PHP tient compte de la casse. Exemple: STR_REPLACE("@","-'","ybet@slynet.be") donne ybet-slynet.be.

<?php
$texte="ybet@slynet.be -@-";
$mots_remplace=array();
require('includes/start.php');
$requete="SELECT * FROM remplace";
$valeur=mysql_query($requete);
$ligne=0;
$i=1;
while ($tableau=mysql_fetch_array($valeur)){
$mots_remplace[$i]["refuse"]=STRIPSLASHES($tableau['refuse']);
$mots_remplace[$i]["remplace"]=STRIPSLASHES($tableau['remplace']);
print($mots_remplace[$i]["refuse"]." ".$mots_remplace[$i]["remplace"]."<br>");
$i=$i+1;
$ligne=$ligne+1;
}
$i=1;
while ($i<=$ligne)
{
if (ereg($mots_remplace[$i]["refuse"],$texte))
{
echo"refusé";
$texte=STR_replace($mots_remplace[$i]["refuse"],$mots_remplace[$i]["remplace"],$texte);
$mots_remplace[$i]["refuse"]=STRTOUPPER($mots_remplace[$i]["refuse"]);
$texte=STR_replace($mots_remplace[$i]["refuse"],$mots_remplace[$i]["remplace"],$texte);
}
$i=$i+1;
print($i."<br>");
}
echo $texte;
?>

Remarquez que nous faisons 2 tests, la fonction str_replace fait la distinction entre les minuscules et les majuscules, d'où la commande STRTOUPPER() qui met le caractère (mot) à remplacer en majuscule.

Il nous reste juste à insérer cette fonction dans le fichier includes/fonction.php. Pourtant, nous allons découper la fonction en deux. Une partie va récupérer la matrice, l'autre va tester si elle existent et les remplacer. Ceci va augmenter la vitesse de traitement.

function modif_texte($texte,$mots_remplacement)
{
// suppression des liens
while (EREG("<a href",$texte))
{
// suppression de la chaîne <a href
$texte1=explode("<a href",$texte,2);
// suppression de > à la fin de l'adresse
$texte2=explode(">",$texte1 [1],2);
$texte=$texte1 [0].$texte2 [1];
// suppression de la chaîne </a>
$texte2=explode("</a>",$texte,2);
$texte=$texte2 [0].$texte2 [1];
}
// suppression des images
while (EREG("<img",$texte))
{
// suppression de la chaîne <a href
$texte1=explode("<img",$texte,2);
// suppression de > à la fin de l'adresse
$texte2=explode(">",$texte1 [1],2);
$texte=$texte1 [0].$texte2 [1];// suppression de la chaîne </a>
}
// remplacement des mots
$i=1;
$ligne=count($mots_remplacement);
while ($i<=$ligne)
{
if (ereg($mots_remplacement[$i]["refuse"],$texte))
{
$texte=STR_replace($mots_remplacement[$i]["refuse"],$mots_remplacement[$i]["remplace"],$texte);
$mots_remplacement[$i]["refuse"]=STRTOUPPER($mots_remplacement[$i]["refuse"]);
$texte=STR_replace($mots_remplacement[$i]["refuse"],$mots_remplacement[$i]["remplace"],$texte);
}
$i=$i+1;
}
return $texte;
}

La partie insertion des annonces doit également être modifiée pour tenir compte de ces 2 fonctions. Juste après l'entrée du formulaire, les lignes suivantes sont insérées:

$correct="O";
$mots_interdits=array();
$mots_interdits=motsinterdits();
// vérification mots interdits, suppression liens, images, remplacement caractères
$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);
$mots_remplacement=array();
$mots_remplacement=liste_remplacement();

$titre=modif_texte($titre,$mots_remplacement);
$description=modif_texte($description,$mots_remplacement);
$ville=modif_texte($ville,$mots_remplacement);
$pays=modif_texte($pays,$mots_remplacement);
$prix=modif_texte($prix,$mots_remplacement);
$telephone=modif_texte($telephone,$mots_remplacement);

7. Sécurisation

Ceci termine presque le formulaire d'entrée des annonces. Il nous reste encore quelques parties pour la présentation à mettre en route, mais la majorité des corrections sont faites ici. Ce n'est pas encore une sécurisation parfaite mais çà bloque déjà une large partie des spams. Une fois l'inscription des utilisateurs finie, la majeure partie pourra être mise en ligne.

Cette partie de la formation nous a finalement permis d'utiliser quelques fonctions PHP sur les champs textes, de faire tourner en boucle nos conditions. Rien de bien neuf, mais un bon exercice.

Le site dédié à ce développement progresse encore un peu Dahut: petites annonces


 

 

Quelques uns de nos sites que vous connaissez peut-être ...

ybet.be

materiel-informatique.be

Numéro TVA (Arlon -Belgique): BE 0718.409.912.

Conception Internet et référencement 061/32.00.15.

1. Introduction - 5. Résumé des requêtes MySQL - 6. Inscription des utilisateurs - 7. Vérifier une adresse mail entrée dans un formulaire - 8. Quelques petites fonctions utiles - 11. Suppression des adresses Internet et mail dans les annonces - 12. Gestion d'activités


Hors développements:

Un petit calendrier en Php à utiliser sur un site Internet - Gérer un champ.