upload de fichier par un formulaire

Petit nouveau ! | 3 Messages

20 mai 2007, 17:33

Bonjour à tous,

J'ai créé un formulaire, qui fonctionne plutôt bien.
Il prend les informations que lui communique l'internaute me les transférent par mail et les stockent dans une base de données.
Depuis quelques jours je tente d'y ajouter un upload de fichier, j'ai lu votre tutoriel, tenté d'adapter le code à ma page de traitement et je n'arrive pas à le faire fonctionner.
En fait je débute en php et là ça devient un peu compliqué pour moi.
l'un d'entre vous pourrait-il m'expliquer ce qui ne va pas dans ce que j'ai fait, svp.
Je m'excuse d'avance pour la longeur du code, en effet mes deux pages étaient presque terminées.

Code de ma page formulaire :

Code : Tout sélectionner

echo "<html> <head><title>Formulaire destiné aux candidatures spontanées</title></head> <body>"; $labels = array ( "prenom" => "Prénom: ", /*tableau des valeurs*/ "nom" => "Nom: ", "mail" => "Mail: ", "secteur" => "Secteur d'activité: ", "ville" => "Ville: ", "fichier_joint" => "Fichiers joints: ", "questions" => "Questions: ", "MAX_FILE_SIZE" => ""); /*fichier caché*/ echo "<h3>Remplissez le formulaire de demande de renseignement</h3>"; echo "<form action='traitement1.php' method='POST' enctype='multipart/form-data'> <table>\n"; /* Boucle d'affichage */ foreach($labels as $field => $label) { echo "<tr> <td style='text-align: right; font-weight: bold'> $label</td> <td>"; /*Afficher le champ questions*/ if ($field == "questions") echo "<textarea name='$field' rows='5' cols='49' maxlength='255'></textarea>"; /*Afficher le champ fichier_joint*/ elseif ($field == "fichier_joint") echo "<input type='file' name='$field' for='$field' size='35'>Insérer votre fichier_joint</input>"; /*Afficher le champ caché*/ elseif ($field == "MAX_FILE_SIZE") echo "<input type='hidden' name='$field' value='1048576'></input>"; /*Afficher les autres champs*/ else echo "<input type='text' name='$field' size='65' maxlength='25' >"; echo "</td> </tr>"; } echo "<tr> <td colspan='2' style='text-align: center'> <input type='submit' value='Envoyer le formulaire'>"; echo "</td></tr></table> </form>";
Code de ma page de traitement :

Code : Tout sélectionner

/* tableau de légende des champs */ $labels = array ( "prenom" => "Prénom: ", "nom" => "Nom: ", "mail" => "Mail: ", "secteur" => "Secteur d'activité: ", "ville" => "Ville: ", "fichier_joint" => "Fichiers joints: ", "questions" => "Vos questions: ", "MAX_FILE_SIZE" => ""); /* regarde les champs reçus */ foreach($_POST as $field => $value) { /* Charche les champs vides */ if( $value == "" ) { $blank_array[] = $field; } /* Teste le format des champs */ elseif( ereg("(nom)",$field) ) { if(!ereg("^[A-Za-z' -]{1,50}$",$value) ) { $bad_format[] = $field; } } elseif($field == "mail") { if(!ereg("^.+@.+\.fr$",$value) ) { $bad_format[] = $field; } } elseif ($field == "fichier_joint") { if(isset($_FILES['$field'])) { // params unset($erreur); $extensions_ok = array('txt', 'doc', 'pdf'); $taille_max = '1048576'; $dest_dossier = 'c:/home/coursphp/test/temp/'; // vérifications if( !in_array( substr(strrchr($_FILES['$field']['name'], '.'), 1), $extensions_ok ) ) { $erreur = 'Veuillez sélectionner un fichier de type txt, doc ou pdf !'; } elseif( file_exists($_FILES['$field']['tmp_name'])and filesize($_FILES['$field']['tmp_name']) > $taille_max) { $erreur = 'Votre fichier doit faire moins de 500Ko !'; // copie du fichier if(!isset($erreur)) } } } // Fin de foreach sur $_POST /* Si problème, afficher un message et revenir au formulaire */ if(@sizeof($blank_array) > 0 or @sizeof($bad_format) > 0) { if(@sizeof($blank_array) > 0) { /* Information manquante */ echo "<b>Un champ au moins est vide. Vous devez le remplir :</b><br>"; /* Liste des données manquantes*/ foreach($blank_array as $value) { echo "&nbsp;&nbsp;&nbsp;{$labels[$value]}<br>"; } } if(@sizeof($bad_format) > 0) { /* Informations incorrectes */ echo "<b>Un champ au moins contient une information incorrecte. Veuillez la corrigez:</b><br>"; /* Liste des champs incorrects */ foreach($bad_format as $value) { echo "&nbsp;&nbsp;&nbsp;{$labels[$value]}<br>"; } } /* réaffichage du formulaire */ echo "<p><hr />"; echo "<h3>Remplissez le formulaire de demande de renseignement</h3>"; echo "<form action='traitement1.php' method='POST' enctype='multipart/form-data'> <table>\n"; foreach($labels as $field => $label) { echo "<tr> <td style='text-align: right; font-weight: bold'> $label</td> <td>"; /*Afficher le champ questions*/ if ($field == "questions") echo "<textarea name='$field' rows='5' cols='49' maxlength='255'></textarea>"; /*Afficher le champ fichier_joint*/ elseif ($field == "fichier_joint") echo "<input type='file' name='$field' for='$field' size='35'>Insérer votre fichier_joint</input>"; /*Afficher le champ fichier_joint*/ elseif ($field == "MAX_FILE_SIZE") echo "<input type='hidden' name='$field' value='1048576'></input>"; /*Afficher les autres champs*/ else echo "<input type='text' name='$field' size='65' maxlength='25' >"; echo "</td> </tr>"; } echo "<tr> <td colspan='2' style='text-align: center'> <input type='submit' value='Envoyer le formulaire'>"; echo "</td></tr></table> </form>"; exit(); } else //Si les données sont OK. Envoyer le formulaire et se connecter à la base { $user="mon_user"; $host=""; $password="mon_password"; $database="ma_base"; $cxn = mysqli_connect($host,$user,$password,$database) or die ("connexion au serveur impossible"); //Vérifier le format du champ "mail" $fields_all = array_keys($labels); foreach($fields_all as $field) { $good_data[$field] = strip_tags(trim($_POST[$field])); } //Inserer les données du formulaire dans la table $query = "INSERT INTO ma_table (prenom,nom,mail,secteur,ville,fichier_joint,questions) VALUES ('$good_data[prenom]','$good_data[nom]','$good_data[mail]', '$good_data[secteur]','$good_data[ville]','$good_data[fichier_joint]', '$good_data[questions]')"; //message d'erreur, si l'envoi du formulaire se passe mal $result = mysqli_query($cxn,$query) or die ("L'envoi du formulaire a échoué"); $destinataire = 'mon_email'; // Pour les champs $expediteur / $copie / $destinataire, séparer par une virgule s'il y a plusieurs adresses $expediteur = "'$good_data[mail]'"; $prenom = "$good_data[prenom]"; $nom = "$good_data[nom]"; $questions = "$good_data[questions]"; $secteur = "$good_data[secteur]"; $ville = "$good_data[ville]"; $fichier_joint = "$good_data[fichier_joint]"; $objet = "Demande de renseignements : "; // Objet du message $headers = 'MIME-Version: 1.0' . "\n"; // Version MIME $headers .= 'Reply-To: '.$expediteur."\n"; // Mail de reponse $headers .= 'From: "Vous avez reçu un mail de: "<'.$expediteur.'>'."\n"; // Expediteur $headers .= 'Delivered-to: '.$destinataire."\n"; // Destinataire //Après avoir vérifié que le fichier existait (l'id est bien dans la BDD) et //après avoir sélectionné les informations sur le fichier dans la BDD (dans $bdd_infos) //Création des headers, pour indiquer au navigateur qu'il s'agit d'un fichier à télécharger header('Content-Transfer-Encoding: binary'); //Transfert en binaire (fichier) header('Content-Disposition: attachment; filename="'.$bdd_infos['$fichier_joint'].'"'); //Nom du fichier header('Content-Length: '.$bdd_infos['$taille_max']); //Taille du fichier //Envoi du fichier readfile($bdd_infos['$fichier_joint']); $message = "$prenom,$nom,$secteur,$ville,$fichier_joint,$questions"; if (mail($destinataire, $objet, $message, $headers)) // Envoi du message //Message si l'envoi du formulaire se passe bien echo "<h4>Votre demande a bien été envoyé. Nous vous remercions.</h4>"; } ?>
Merci à tous

Eléphant du PHP | 120 Messages

21 mai 2007, 18:03

tiens voici un lien qui pourrait t'aider http://www.vulgarisation-informatique.c ... ad-php.php

Petit nouveau ! | 3 Messages

21 mai 2007, 18:42

Ok, merci.
Je vais essayer de m'en sortir.

Petit nouveau ! | 3 Messages

21 mai 2007, 21:40

Bonsoir,

Je progresse, le tutoriel est plus clair que les autres.
Alors, il rentre dans la boucle, mais s'arrête aprés la connexion à la base.
Ma page de traitement me renvoie le message " Ok fichier envoyé correctement" et derrière l'erreur "l'envoi du formulaire a echoue".
Cette erreur se trouve juste aprés la recupération de mes variables pour les copier dans la base de donnée.
Le fichier est correctement copié dans le répertoire.
Est-ce que la récupération d'un fichier dans une base de donnée ce fait de la même manière que celle d'une donnée, dans des variables ? Où il y a des paramètres différents à entrer ?
Dans tous les cas merci pour le tutoriel, il m'a bien débloqué.

Merci