8796 sujets

Développement web côté serveur, CMS

Bonjour,

Après un petit moment d'absence, je reviens vous embeter avec mes formulaires ...

Je voudrais améliorer mon formulaire d'envoi de fichier unique et pouvoir envoyer 3 fichier simultanément (mais pas à chaque fois) + un commentaire + une URL.

Jusqu'à présent mon formulaire d'envoi de fichier unique + commentaire fonctionne bien.

Voici le code de la page rediger_article.php:


<?php
<form method="POST" action="../reception.php" enctype="multipart/form-data">

<fieldset>
       <legend>LOGIN</legend> <!-- Titre du fieldset -->		
	<p> <label for="inscr_pseudo">Votre pseudo :</label><br />
	<input type="text" name="inscr_pseudo" value="<?php echo $_SESSION['inscr_pseudo'];?>" id="inscr_pseudo"/> </p>
</fieldset>
<p>
<fieldset>
       <legend>POSTEZ VOTRE ARTICLE</legend> <!-- Titre du fieldset -->
	<p> <label for="up_titre_article">Le titre de votre article :</label><br />
	<input type="text" name="up_titre_article" id="up_titre_article"/> </p>
	
	<p> <label for="up_rubrique">Dans quelle rubrique se situe votre article :</label><br />
       <select name="up_rubrique" id="up_rubrique">
           <option value="aluminium">Aluminium</option>
		   <option value="appel_temoin">Appel à témoins</option>
		   <option value="armes_bio">Les armes biologiques</option>
		   <option value="statut">Statut de l'Assocciation</option>
           <option value="temoignages">Témoignages</option>
           <option value="vaccinations">Les vaccinations</option>
       </select>
   </p>
	<label for="up_description">Commentaire relatif à l'article :</label> <br />
	<textarea name="up_description" rows="8" cols="45" id="up_description">ICI</textarea>

<p>
		<!-- On limite le fichier primaire à 10 000Ko -->
		<input type="hidden" name="MAX_FILE_SIZE" value="10000000">
		<label for="up_fichier">Sélectionnez votre fichier PRIMAIRE:</label><br />
		<input type="file" name="up_fichier" id="up_fichier"><br />
		
		<!-- On limite le fichier secondaire à 10 000Ko -->
		<input type="hidden" name="MAX_FILE_SIZE" value="10000000">
		<label for="up_fichier_2">Sélectionnez votre fichier SECONDAIRE:</label><br />
		<input type="file" name="up_fichier_2" id="up_fichier_2"><br />
		
		<!-- On limite le fichier tertiaire à 10 000Ko -->
		<input type="hidden" name="MAX_FILE_SIZE" value="10000000">
		<label for="up_fichier_3">Sélectionnez votre fichier TERTIAIRE:</label><br />
		<input type="file" name="up_fichier_3" id="up_fichier_3">
		
		<!-- URL de la news ou de l'article si dispo en ligne sur un autre site -->
	<p> <label for="up_url_article">Le lien web de votre article :</label><br />
	<input type="text" name="up_url_article" id="up_url_article"/> </p>
	
	<p><input type="submit" name="envoyer" value="Poster l'article / fichier"></p>
	<p><input type="reset" value="Effacer les champs" /></p>
	
	</form>
?>


Et voici le code de la page reception.php:


<link rel="stylesheet" media="screen" type="text/css" title="Envoi" href="envoi.css" />
<meta http-equiv="Refresh" content="1;URL=../Pages/Propos_Article.php"> 
<?php include("../Fonctions/Connexion_bdd.php"); ?>

<?php
// Définition du dossier de stockage pour les documents images ou autres ...
$dossier = 'fichiers_upload/';
// $dossier = '/home/monsite/photos/'; (Dossier sur le serveur par exemple)	
$taille_maxi = 10000000;

// On protège les caractères spéciaux d'une commande SQL
$up_id = mysql_real_escape_string($_POST['up_id']);
$inscr_pseudo = mysql_real_escape_string($_POST['inscr_pseudo']);
$up_filename = mysql_real_escape_string($_FILES['up_fichier']['name']);
$up_filesize = mysql_real_escape_string($_FILES['up_fichier']['size']);
$up_titre_article = mysql_real_escape_string($_POST['up_titre_article']);
$up_rubrique = mysql_real_escape_string($_POST['up_rubrique']);
$up_rubrique = mysql_real_escape_string($_POST['up_rubrique']);
$up_description = mysql_real_escape_string($_POST['up_description']);
$up_finalname = mysql_real_escape_string($_POST['up_finalname']);
$up_filedate = time();

// On sépare le nom du fichier et le nom du dossier
$up_filename = basename($_FILES['up_fichier']['name']);

// Enregistrement de la date et heure
$date  = date("mdy");
$heure = date("His");

// Ajout de la date et l'heure au nom de fichier
$up_finalname= $up_filename."-".$date."-".$heure;      
echo "Voici le fichier que vous venez d'envoyer: -->";

// La liste des extentions autorisées
$extensions = array('.png', '.bmp', '.gif', '.jpg', '.jpeg', '.pdf', '.doc', '.xls', '.txt');

// Trouve la dernière occurrence d'un caractère dans une chaîne
$extension = strrchr($_FILES['up_fichier']['name'], '.');

// Déclare le chemin d'accès au fichier
$up_lien = '../Gestion/fichiers_upload/'.$up_finalname;

//Début des vérifications de sécurité...
if(!in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau
{
$erreur = 'Vous devez envoyer un fichier de type png, bmp, gif, jpg, jpeg, pdf, doc xls ou txt...</br>';
}
if($up_filesize>$taille_maxi)
{
$erreur = 'Le fichier est trop gros ...</br>';
}
if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload
{

//On formate le nom du fichier ici...
$up_filename1 = strtr($up_filename,
'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
$up_filename = preg_replace('/([^.a-z0-9]+)/i', '-', $up_filename);

echo $up_filename1."<br></br>";

if(move_uploaded_file($_FILES['up_fichier']['tmp_name'], $dossier . $up_filename)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
{
echo 'Transfert effectué avec succès !</br></br>';
echo 'Merci de votre contribution !';
}
else //Sinon (la fonction renvoie FALSE).
{
echo 'Echec du transfert !</br>';
}
}
else
{
echo $erreur;
}

// on écrit la requête sql

$sql = "INSERT INTO upload_fichier(
up_id,
inscr_pseudo,
up_filename,
up_filesize,
up_titre_article,
up_rubrique,
up_description,
up_finalname,
up_filedate,
up_lien) 

		VALUES(	'$up_id',
		'$inscr_pseudo',
		'$up_filename',
		'$up_filesize',
		'$up_titre_article',
		'$up_rubrique',
		'$up_description',
		'$up_finalname',
		'$up_filedate',
		'$up_lien')"; 

// on insère les informations du formulaire dans la table 
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
?>


J'ai déjà rajouter dans mon formulaire les champs pour les 2 autres fichiers ainsi que pour l'URL (d'un article pour le voir dans son contexte original).

J'aimerais savoir ce que je dois modifier au formulaire de reception pour qu'il me vérifie les memes choses que le premier fichier et ensuite qu'il m'envoie les fichiers dans mon dossier fichiers_upload.

Question supplémentaire:

Dois-je créer dans ma BDD les champs:


up_filename,
up_filesize,
up_finalname,
up_filedate,
up_lien)


Mais pour chacun des fichiers ??? ex up_filename_2 et up_filename_3 ???

---> Je pense que la réponse est oui mais comme il y a toujours des astuces.... je risquerais de passer à côté ...

D'avance merci
Salut,

Jackisback a écrit :
Dois-je créer dans ma BDD les champs:


up_filename,
up_filesize,
up_finalname,
up_filedate,
up_lien)


Mais pour chacun des fichiers ??? ex up_filename_2 et up_filename_3 ???
Pour bien faire il faudrait créer une nouvelle table (genre up_files) qui contiendrait toutes ces infos + un id par fichier + un champ pour faire le lien avec up_id : en clair pour un article tu aurais de 1 à 3 fichiers lié(s).

Pour ce qui est du traitement tu pourrais t'inspirer de ce post pour boucler sur chaque fichier uploadé.

A+
Euh oui mais sans vouloir le travail tout fait, pourrais-tu m'expliquer plus précisément comment tu procéderais ??

Un ex de structure de table peut etre ???

Merci
C'est exactement ce que Heyoan t'a donné hein Smiley cligne

table: uploads
+ upload_id
- upload_filename
- upload_finalname
- upload_description
- upload_filesize
- upload_date
- upload_link
~ article_id

table: articles
+ article_id
- article_author
- ...
Eh bien déjà je renommerais upload_fichier en articles :
id_article (auto-increment)
inscr_pseudo
up_titre_article
up_rubrique
up_description
up_lien

et le fichier upload_files :
id_file (auto-increment)
id_art (lien avec le fichier articles)
up_filename
up_filesize
up_finalname
up_filedate (valeur = NOW() dans la requête)
Eh bien déjà je renommerais upload_fichier en articles :
id_article (auto-increment)
inscr_pseudo
up_titre_article
up_rubrique
up_description
up_lien

et le fichier upload_files :
id_file (auto-increment)
id_art (lien avec le fichier articles)
up_filename
up_filesize
up_finalname
up_filedate (valeur = NOW() dans la requête)

Je dois pas etre bien reveillé car je comprends pas grand chose là ????

Désolé ....
Tiens... j'avais pas vu que Calak m'avait grillé ! Smiley langue

Eh bien l'idée c'est qu'au lieu de faire 1 INSERT tu en fait 1 dans la table articles et 1 par fichier uploadé.
Modifié par Heyoan (07 Nov 2008 - 20:43)
Je préciserai que, dans la réponse de Heyoan, dans ta table "fichiers" tu renseigne l'id de l'aricle auquel il est lié.

Pourquoi 3 tables Jack???
Alors Pouf ! Pouf ! Je reprends du début... Smiley cligne

* insertion d'un article :

INSERT INTO articles...

* ligne suivante pour récupérer id_article :
$dernier_increment = mysql_insert_id(); // Par exemple 33

* boucle sur les fichiers uploadés et pour chacun :
INSERT INTO upload_files (id_file, id_art, ...) VALUES ('', 33, ...)
Modifié par Heyoan (07 Nov 2008 - 20:51)
J'optimiserais ta solution en ne bouclant pas sur la requête elle même:


if (Fichier uploadé) {
  $insert_values = array();
  while (Fichier uploadé) {
    // ... <= Traitements sur le fichier uploadé et son nom

    $insert_values[] = sprintf("('', '%s', '%s', '%s', '%s', '%s', %d)", $upload_filename, $upload_finalname,  $upload_description, 
$upload_filesize, $upload_date, $article_id);
  }
  
  $query = 'INSERT INTO uploads (upload_id, upload_filename, upload_finalname,  upload_description, 
upload_filesize, upload_date, article_id) VALUES' . implode(', ', $insert_values);

  mysql_query($query);

}


Comme ça, tu ne fais qu'un seul include pour tout les fichiers (plus un pour l'article évidement)
Euh ?????

Bon je crois que je vais aller me coucher ...

Je verrai tout ça demain et j'espère que j'y verrai plus clair parceque là je ne comprends plus rien ...;

Bonne nuit ...
Peut-être qu'avec un exemple ce sera plus clair :

après insertion tu auras dans

article :
id_article -> 33
+ les autres champs liés à l'article.

upload_files :
id_file -> 123
id_art -> 33
+ les autres champs liés au premier fichier uploadé.

id_file -> 124
id_art -> 33
+ les autres champs liés au second fichier uploadé.

id_file -> 125
id_art -> 33
+ les autres champs liés au troisième fichier uploadé.


Donc pour retrouver tous les fichiers liés à l'article ayant pour identifiant 33 il suffira de faire un SELECT de tous les fichiers uploadés ayant id_art = 33.
Modifié par Heyoan (08 Nov 2008 - 00:58)
Bon la je comprends déjà un peu mieux .....

Ca va pas être facile à mettre en place je sens .....

Mais c'est déjà une bonne explication ...

Merci
Modifié par Jackisback (08 Nov 2008 - 09:43)
Bonjour à tous,

J'essaie aussi de faire en sorte de joindre deux fichiers à mon formulaire.

Mais je n'ai pas du tout compris votre méthode en passant par une bdd. Faut dire que je suis un néophyte.

En doublant la balise php ce n'est pas possible ?