Le magasin YBET

Rue Albert 1er, 7

6810 Pin - Chiny

Route Arlon - Florenville

(/fax: 061/32.00.15

Formation: créer son site Internet avec PHP et MySQL

YBET informatique Forum webmaster Contact

20. Programmation: Formulaire d'insertion d'annonces.

1. Le formulaire d'entrée - 2. Tests du fichier et requêtes d'entrées

Pas un chapitre agréable puisque finalement nous avons déjà quasiment tout vu, juste (presque) des lignes de code en PHP et des requêtes MySQL. Nous reprenons finalement l'ensemble des développements des 3 précédents chapitres: affichage de la liste des catégories sous forme de liste déroulante, la liste des champs à remplir dans la table et le téléchargement d'une image via un formulaire.

Attention que les tests d'image et le redimentionnement ne fonctionne pas sous EasyPhp (même en cochant l'option php_gd2). Il faudra probablement le tester directement sur un site en ligne avec une base de donnée.

1. Première partie, le formulaire d'entrée

Nous allons d'abord commencer par créer notre formulaire auto-vérifié. Attention, ce programme utilise la base de donnée MySQL, vous devez le testez en local avec easyphp.

<?php
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)){
// on récupère les données de la table
// print($ligne);
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 = $_POST['titre'];
$erreur_titre = "";
$description = $_POST['description'];
$erreur_description = "";
$ville = $_POST['ville'];
$erreur_ville = "";
$pays = $_POST['pays'];
$erreur_pays = "";
$prix = $_POST['prix'];
$erreur_prix = "";
$telephone = $_POST['telephone'];
$erreur_telephone = "";

$dateinsertion=date('Ymd');
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>";
} else {
$ajout = "";
echo"Connexion réussie";
// entrée des données dans la table
}
} else {
$nom = "Nom de la catégorie";
$erreur_titre = "";
$description = "Description de la catégorie";
$erreur_description = "";
$attachement = "Numéro de la catégorie supérieure";
$erreur_attachement = "";
$actif ="O";
$erreur_actif = "";
}
$form = "<form method=\"POST\" form action=\"$PHP_SELF\" 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;
}


// Formulaire

$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_titre</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\">
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>
<HR>";
print($form);
?>

La première partie récupère nos catégories sous forme d'un tableau comme vu précédemment. La deuxième partie est finalement la vérification de quelques données. Pour l'instant, nous ne vérifions pas grand chose (juste si le titre, la description et la ville sont correct, nous ajouterons les vérifications à fait. De plus, nous ne remplissons pas encore les données provenant de l'utilisateur

La dernière partie affiche le formulaire. C'est simplement une adaptation de nos différentes parties de formulaires (liste déroulante et transfert d'image).

2. Tests du fichier et requêtes SQL

Insérons le test de chargement du fichier du chapitre précédant avec les modifications du formulaire. Pour cela, nous allons créer une fonction vérifiant l'extension de l'image (imageok()). D'autres vérifications sont faites sur la taille uniquement si le fichier est reconnu: quelques images JPG sont refusées.

De même si l'utilisateur ne rentre pas de photo, l'image par défaut logo-min.gif est chargé et aucun test n'est effectué.

L'entrée des données se fait en 2 parties: la partie 1 est standard

require('includes/start.php');
if($_FILES['photo']['name']<>"logo-min.gif"){
$photo=$_FILES['photo']['name'];
}else{
$photo="logo-min.gif";
}
$requete="INSERT annonce 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);

Par contre, une fois l'annonce rentrée et si l'image n'est pas l'image par défaut, on récupère le numéro de l'annonce via la commande MySQL mysql_insert_id() qui récupère la dernière valeur entrée dans un champ auto_increment.

Une fois le code récupéré, on update le nom de la photo en code-nom_photo. Par exemple, si l'image téléchargée est maison.gif pour l'annonce 271, elle est enregistrée dans le dossier images sous le nom: 271-moison.gif. Il n'y a donc pas de risque de retrouver 2 fois la même photo et ça permet éventuellement de supprimer les vieilles photos plus facilement. De même, la miniature est codée sous la forme code-mini-nom_image: ("images/".$code."-mini-".$_FILES['photo']['name'])

$code=mysql_insert_id();
// on vient de récupérer le code de l'annonce et on uddate la photo par code-nom photo
if ($_FILES['photo']['name']<>"logo-min.gif"){
 // on modifie le nom du fichier image uniquement si l'image n'est pas celle par défaut

  $requete="update annonce 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']);

chmod ("images/".$code."-".$_FILES['photo']['name'],0644);

// 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';
}
}

Voici notre fichier définitif, il suffit juste de recoller la partie création de la catégorie. Remarque, ceci le véritable fichier utilisé en production qui récupère également l'adresse IP du visiteur.

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<meta http-equiv="Content-Language" content="fr">
<meta name="description" content="Entrez votre petite annonce, tests de développement">
<title>Entrer sa petite annonce</title>

</head>
<?php
require('includes/header.php');
require('includes/fonctions.php');
?>
<div align="center">
<table border="1" width="1000">
<tr>
<td width="20%" valign="top" bgcolor="#cccccc">
<?php
include('includes/colon-left.php');
?>
</td>
<td width="60%" valign="top">
<?php
// début affichage du formulaire
require('includes/start.php');
$categorie_tab=array();
$requete="SELECT * FROM categorie order by nom_complet";
$valeur=mysql_query($requete);
$i=0;
$ligne=0;
while($tableau=mysql_fetch_array($valeur)){
if($tableau['actif']<>"N"){
if($tableau['uid']<>$tableau['attachement'])
{
$categorie_tab[$i]['uid']=$tableau['uid'];
$categorie_tab[$i]['nom']=$tableau['nom'];
$categorie_tab[$i]['description']=$tableau['description'];
$categorie_tab[$i]['attachement']=$tableau['attachement'];
$categorie_tab[$i]['nom_complet']=$tableau['nom_complet'];
$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;

// test d'execuction du sommaire
if (isset($_POST['go'])and $login<>""){
$ip=$_SERVER["REMOTE_ADDR"];
echo "Votre adresse IP est enregistrée: ".$ip."<br>";
$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'];
$mois=$_POST['mois']*2678400;
$uid_cat=$_POST['uid'];
$dateinsertion=date('Ymd');
$dateexpiration= date('Ymd',mktime(date('m,d,Y'))+$mois);
// tests des mots interdits
$correct="O";
$mots_interdits=array();
$mots_interdits=motsinterdits();
$mots_remplacement=array();
$mots_remplacement=liste_remplacement();

// 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);
$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);

if ($_FILES['photo']['name']==""){
// nécessaire si l'utilisateur ne met pas de photo, alors photo par défaut
$_FILES['photo']['name']="pas-photo.jpg";
}
$taille=getimagesize($_FILES['photo']['tmp_name']);

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'])){
// image incorrecte
echo'Image incorrecte';
$erreur_file = "<br>Seuls sont acceptés les formats GIF, JPG et PNG";
}elseif($taille[0]>350){
$erreur_file ="<font color=\"#FF0000\">Image trop large, maximum 350 pixels</font>";
}elseif (($_FILES['photo']['tmp_name']=="")&&($_FILES['photo']['name']<>"pas-photo.jpg")){
$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
$rapport=round($taille[1]/$taille[0]*120,0);
require('includes/start.php');
if($_FILES['photo']['name']<>"pas-photo.jpg"){

}else{
$photo= "pas-photo.jpg";
}
// 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',dateexpiration='$dateexpiration',telephone='$telephone',mail='$mail',
uid_cat='$uid_cat',uid_util='$uid_util',tel='$tel',ip='$ip'";
}else{
$requete="INSERT invalide SET titre='$titre',description='$description',photo='$photo', ville='$ville',pays='$pays',prix='$prix',dateinsertion='$dateinsertion',
dateexpiration='$dateexpiration',
telephone='$telephone',mail='$mail',uid_cat='$uid_cat',uid_util='$uid_util',tel='$tel',ip='$ip'";
}

$valeur=mysql_query($requete);
// Mise à jour du nombre d'annonce
if ($correct=="O")
{
$requete= "UPDATE categorie SET nb_annonce=nb_annonce+1 where uid='$uid_cat'";
$valeur=mysql_query($requete);
}
// -- on code la photo et on crée la miniature si ce n'est pas celle par défaut
if ($photo<>"pas-photo.jpg"){
// nécessaire si le nom du fichier contient un tiret
$photo=STR_replace("-","",$_FILES['photo']['name']);
$photo=STR_replace(" ","",$_FILES['photo']['name']);
$photo=STR_replace("é","e",$_FILES['photo']['name']);
$photo=STR_replace("è","e",$_FILES['photo']['name']);
$photo=STR_replace("à","a",$_FILES['photo']['name']);
$photo=STR_replace("ç","c",$_FILES['photo']['name']);
$requete="select * from contenu where titre ='$titre' and dateinsertion='$dateinsertion'";
$valeur=mysql_query($requete);
while ($tableau=mysql_fetch_array($valeur)){
// $photo=$tableau["code"]."-".$photo;
$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'],"image-annonce/".$code."-".$photo);
chmod ("image-annonce/".$code."-".$photo,0644);
// fin de transfert du fichier
// création de la miniature.
$taille=getimagesize("image-annonce/".$code."-".$photo);
If ($taille[2]==1){
// ceci est une image GIF
$image1=imagecreatefromgif('image-annonce/'.$code."-".$photo);
$image2=imagecreatetruecolor(120,$rapport);
imagecopyresized($image2,$image1,0,0,0,0,120,$rapport,$taille[0],$taille[1]);
/*
$image2=imagecreate(100,100);
imagecopyresized($image2,$image1,0,0,0,0,100,100,$taille[0],$taille[1]);
*/
imagegif($image2,"image-annonce/".$code."-mini-".$photo);
}elseif ($taille[2]==2){
// ceci est une image JPG
$image1=imagecreatefromjpeg('image-annonce/'.$code."-".$photo);
/*$image2=imagecreate(100,100);
imagecopyresized($image2,$image1,0,0,0,0,100,100,$taille[0],$taille[1]);
*/
$image2=imagecreatetruecolor(120,$rapport);
imagecopyresized($image2,$image1,0,0,0,0,120,$rapport,$taille[0],$taille[1]);
imagejpeg($image2,"image-annonce/".$code."-mini-".$photo);
}elseif ($taille[2]==3){
// ceci est une image png
$image1=imagecreatefrompng('image-annonce/'.$code."-".$photo);
/*
$image2=imagecreate(100,100);
imagecopyresized($image2,$image1,0,0,0,0,100,100,$taille[0],$taille[1]);
*/
$image2=imagecreatetruecolor(120,$rapport);
imagecopyresized($image2,$image1,0,0,0,0,120,$rapport,$taille[0],$taille[1]);
imagepng($image2,"image-annonce/".$code."-mini-".$photo);
}else{
echo 'Format non accepté pour miniaturiser';
}
}
// fin de la création de la miniature
print('<br><b>Votre annonce a bien été enregistrée<BR> Merci</b>');
die('<meta http-equiv="refresh" content="3; URL=index.php">');
// 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="";
}
if ($login=="")
{
echo"<h1>Vous ne pouvez pas insérer une activité, merci de vous <a href=\"connexion.php\"> connecter</a>
ou de vous <a href=\"inscription.php\">inscrire</a></h1>";
}else{
echo"<b>Bonjour ".$login."</b>: Vous pouvez entrer votre annonce.";
}
require('includes/start.php');
$categorie_tab=array();
$requete="SELECT * FROM cat3 where actif3='O' && level<>'1' order by nom_complet3";
$valeur=mysql_query($requete);
$i=0;
$ligne=0;
while($tableau=mysql_fetch_array($valeur)){
$categorie_tab[$i]['uid']=$tableau['uid_cat3'];
$categorie_tab[$i]['nom']=$tableau['nom_cat3'];
$categorie_tab[$i]['description']=$tableau['description'];
$categorie_tab[$i]['attachement']=$tableau['attachement3'];
$categorie_tab[$i]['nom_complet']=$tableau['nom_complet3'];
$i=$i+1;

}
require('includes/stop.php');
// début du traitement des catégories - sous catégories dans le tableau
$ligne=$i;
$i=0;
$form = "<form method=\"POST\" ENCTYPE=\"multipart/form-data\">
<p>Remarque: Les liens et adresses mail sont automatiquement désactivés, cases en gras obligatoires.<p>
<p><b>Titre annonce</b> <input type=\"text\" name=\"titre\" size=\"50\"><br><font color=\"#FF0000\">$erreur_titre</font></p>
<p><b>Catégorie</b> <select size=\"1\" name='uid'>";
$i=0;
while ($i<$ligne){
$uid= $categorie_tab[$i]['uid'];
$complet= $categorie_tab[$i]['nom_complet'];
$form=$form."<option>".$complet."</option>";

$i=$i+1;
}
$form=$form."</select>
<p><b>Description de votre annonce</b><br>

<TEXTAREA NAME=\"description\" ROWS=\"8\" COLS=\"50\" WRAP=virtual></TEXTAREA></p><p><font color=\"#FF0000\">$erreur_description</font></P>
<p><b>Ville</b>: <input type=\"text\" name=\"ville\" size=\"30\"><font color=\"#FF0000\">$erreur_ville</font> Pays: <select name=\"pays\">
<option selected>Belgique</option>
<option>France</option>
<option>Luxembourg</option>
</select>
<input type=\"hidden\" name=\"max_file_size\" value=\"400000\">Téléchargez une Photo (formats JPG, GIF, PNG: taille 100 KB. max , 350 l. et 400 H. max.): <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> 
Mois affichés: <select size=\"1\" name=\"mois\">
<option selected>3</option>
<option>2</option>
<option>1</option>
</select></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%" valign="top" bgcolor="#CEEFD1">
<?php
include('includes/colon-right-annonce.php');
?>
</td>
</tr>
</table>
</div>
<?php
// require('includes/stop.php');
//echo'Base de donnée fermée';
include('includes/footer1.php');
?>
</BODY>
</HTML>

Je vous avait prévenu en début de chapitre, cette partie est assez difficile et reprend de nombreuses lignes de programmation mais elle est nécessaire. Elle sera remodifiée lorsque nous utiliserons les codes utilisateurs pour rentrer les annonces. La partie suivante va nous permettre d'afficher l'annonce créée.

Mise en ligne: 05/06/2006 - Mise à jour 15/12/2008

> 21. Affichage des annonces
<<19 . Insérer une image