Bonsoir à tous,

je débute avec php, en essayant de comprendre les bouts de code trouvé par-ci par-là et en les adaptant à ma sauce, j'ai réussi "avec un peu d'aide" à monter mon site entièrement en php.
je lui est ajouté une base de donnée sql, total bonheur, sauf que...
il fallait bien un mais... je tente depuis plusieurs jours d'ajouter un upload de fichier par l'intermédiaire de mon formulaire.
Hors j'ai deux souci :
1 - il fonctionne une fois sur deux, pas cool.
2 - lorsqu'il fonctionne, il rempli ma base de données, sauf le champ de la pièce jointe et il me retourne le mail, sans la pièce jointe, pas cool du toutl.
je n'insère pas mon code tout desuite, c'est une usine à gaz, et j'ai peur de vous décourager, si cela interresse quelqu'un ...
J'ai pratiquement terminé et je pense que c'est juste une ou peut-être deux petites erreurs qui se sont glissées avec un rien de fourberie au milieux de mes lignes Smiley cligne

Merci à tous
Modifié par kesaro (22 May 2007 - 10:23)
Salut,

J'aurais envie de te dire, et ??

Si tu veux qu'on t'aide, il va à mon avis falloir que tu assume de nous montrer ton usine à gaz, après tout tu l'as faite, de bonnes âmes t'expliqueront comment la dégazer, et tu apprendra beaucoup au passage.
Enfin c'est mon avis. De toute manière pour résoudre tes problèmes je pense que ce sera inévitable, autant gagner du temps. Smiley cligne
Administrateur
Bonjour,

merci de supprimer les points d'exclamation superflus dans ton titre.

Felipe
Bonjour à tous,

Bon, ben va falloir assumer... Smiley confus
Je ne voulais simplement pas casser le moral aux éventuelles bonnes âmes Smiley cligne

Voici donc le code de ma page formulaire :



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 "<h3>Attention, vous devez remplir tous les champs</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 cv</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>";
?>


et celui de ma page de traitement, (le pire) :


 /* 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;
      }
    }
	/*traite le champ upload*/
	//elseif ($field == "fichier_joint")
//	{
			// vérifications  
				if(!empty($_FILES['fichier_joint']['tmp_name']) AND is_uploaded_file($_FILES['fichier_joint']['tmp_name']))
						{
						
						//On va vérifier la taille du fichier en ne passant pas par $_FILES['fichier_source']['size'] pour éviter les failles de sécurité
						if(filesize($_FILES['fichier_joint']['tmp_name'])<1048576)
						{
						
						//On vérifie maintenant le type de l'image à l'aide de la fonction getimagesize()
						list($largeur, $hauteur, $type, $attr)=getimagesize($_FILES['fichier_joint']['tmp_name']);
						
						//Si le Type est JPEG (correspond au chiffre 2) on copie l'image
						if($type===2)
						{
						
						//Copie le fichier dans le répertoire de destination
						if(move_uploaded_file($_FILES['fichier_joint']['tmp_name'], 'repertoire/image.jpg'))
							{
							//Le fichier a été uploadé correctement
							echo 'Ok, fichier envoyé correctement';
							}
						else
							{
							//Erreur
							echo 'Erreur lors de la copie du fichier';
							}
						
						}
						
						}
						
						}


//	}	
	
} // 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 cv</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>";
    exit();
  }
  else   //Si les données sont OK. Envoyer le formulaire et se connecter à la base
  {
    $user="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,questions,fichier_joint) 
              VALUES ('$good_data[prenom]','$good_data[nom]','$good_data[mail]',
			  		  '$good_data[secteur]','$good_data[ville]','$good_data[questions]','$good_data[fichier_joint]')";

    //message d'erreur, si l'envoi du formulaire se passe mal
	$result = mysqli_query($cxn,$query)
              or die ("L'envoi du formulaire a échoué");

			//déclaration de variable
			$destinataire = 'mon_mail';
			$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
			$message_texte='Bonjour,'."\n\n".'Voici un message au format texte'; 
		    $message_html='<html> 
		    <head> 
		    <title>Titre</title> 
		    </head> 
		    <body>Test de message</body> 
		    </html>'; 
		   //----------------------------------------------- 
		  //GENERE LA FRONTIERE DU MAIL ENTRE TEXTE ET HTML 
		 //----------------------------------------------- 
		
			 $frontiere = '-----=' . md5(uniqid(mt_rand())); 
		
		   //----------------------------------------------- 
		  //HEADERS DU MAIL 
		 //----------------------------------------------- 

			$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
			$headers .= 'Content-Type: multipart/mixed; boundary="'.$frontiere.'"'; 
		  
		   //----------------------------------------------- 
     	  //MESSAGE TEXTE 
     	 //----------------------------------------------- 
    
			 $message = 'This is a multi-part message in MIME format.'."\n\n"; 
			 $message .= '--'.$frontiere."\n"; 
			 $message .= 'Content-Type: text/plain; charset="iso-8859-1"'."\n"; 
			 $message .= 'Content-Transfer-Encoding: 8bit'."\n\n"; 
			 $message .= $message_texte."\n\n"; 
		  
		  //----------------------------------------------- 
         //MESSAGE HTML 
        //----------------------------------------------- 
     
			 $message .= '--'.$frontiere."\n"; 
			 $message .= 'Content-Type: text/html; charset="iso-8859-1"'."\n"; 
			 $message .= 'Content-Transfer-Encoding: 8bit'."\n\n"; 
			 $message .= $message_html."\n\n"; 
			 $message .= '--'.$frontiere.'--'."\n"; 
  
		  
		  //Génération des pièces jointes pour la recupération du fichier dans la boite mail
			
			$message .= 'Content-Type: image/jpg; name="image.jpg"'."\n"; 
			$message .= 'Content-Transfer-Encoding: base64'."\n"; 
			$message .= 'Content-Disposition:attachement; filename="image.jpg"'."\n\n"; 
		
			$message .= chunk_split(base64_encode(file_get_contents('image.jpg')))."\n"; 

	
	

			$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>";
  }


Une fois sur deux, j'ai ces messages "Ok, fichier envoyé correctement" et "Votre demande a bien été envoyé. Nous vous remercions." la BDD est incrémentée, sauf de mon fichier et je reçois le mail avec les infos, sans la pièce jointe. Le fichier, lui est bien dans le répertoire temporaire.
Et une fois sur deux il me renvoi "L'envoi du formulaire a échoué".

La connexion à la base se fait.
J'ai le sentiment que mon problème est dans les headders, pour ce qui est de la pièce jointe.
Et je ne sais pas exactement de quelle manière on prépare un champ pour recevoir un fichier sous sql, pour le moment il est en "varchar" avec une taille de 50 000.

Je fais mes premières armes et certaines choses m'échappent Smiley biggrin

Merci à tous
Je viens de constater un petit problème sur mon post :
- les x rouges avec un mot dans la case sont le contenu des variables.
Je ne sais pas si cela se produit uniquement sur ma machine, alors je précise, pour la lisibilité.
- il faut lire "$good_data'entre crochet' mail ou prenom ou nom....

merci
Salut Smiley cligne

Un des problèmes est que tu testes la variable $_POST[fichier_joint] alors que pour un fichier uploadé elle n'existe pas. Donc je remplacerais :
    foreach($fields_all as $field)
    {
	$good_data[$field] = strip_tags(trim($_POST[$field]));
    }
par :
    foreach($fields_all as $field)
    {
	if ($field != "fichier_joint") {
		$good_data[$field] = strip_tags(trim($_POST[$field]));
	}
	else
	{
		$good_data[$field] = strip_tags(trim( $_FILES[$field] ['name']));
	}
    }
en supposant que c'est bien le nom de l'image que tu veux sauvegarder dans ta base Smiley rolleyes

Et plus loin je pense qu'il faut remplacer :
...file_get_contents('image.jpg')...
par :
file_get_contents('repertoire/image.jpg')


Voilà ! En espérant que ça te dépannera Smiley biggrin ...
Bonsoir Smiley smile ,

Je viens de tester tes modifs, et avant tout je te remercie pour ta patience et ta bonne volonté.
J'y suis presque, en effet cela fonctionne partiellement.
Désormais le champ "pièce_jointe" de la BDD est incrémenté, mais avec le nom du fichier et pas le fichier lui-même.
De même pour le mail, il arrive dans ma boite, mais sans la pièce jointe, il ajoute simplement un champ, comme nom ou prenom, qui s'appelle image.jpg.
Alors, non, ce n'est pas le nom de l'image que je cherche à récupérer, mais l'image elle même.
j'aimerais aussi qu'elle arrive en pièce jointe dans ma boite mail.
En fait tout mon problème est là......
Dans tous les cas merci à toi de t'être penché sur mon code, il n'est pas trop biscornu je pense, mais très très long Smiley biggrin
Modifié par kesaro (22 May 2007 - 23:46)
Good Morning

OK, je vois mieux ce que tu veux faire ! Cela dit je ne suis pas persuadé que ce soit la meilleure solution de sauvegarder une image dans la base mysql plutôt que le chemin pour y accéder Smiley rolleyes

J'ai pas trop le temps maintenant mais si tu n'as pas résolu ton problème ce soir j'y jetterai un coup d'oeil Smiley cligne

A+
Bonjour,

C'est super et je te remercie pour ton aide.
En fait le but final n'est pas la sauvegarde d'une image.
J'utilise cela pour le moment, simplement pour faire fonctionner le smilblick, et aussi comprendre comment il fonctionne.
L'idée finale étant de recevoir des documents aux formats pdf, doc ou même txt.
Par contre ce soir je dois partir dès 18H30 je ne pourrais être en ligne que dans la journée de jeudi où vendredi soir après 20H30.

Merci encore et bonne fin de journée
Waouou,

Je viens de rentrer, j'ai jeté un oeil sur le code que tu m'as fais parvenir, j'ai pas tout tout compris mais ça a l'air vraiment chouette.
Je m'y colle immédiatement et je te donne des nouvelles.
Dans tous les cas merci beaucoup, toute seule ça m'aurais pris jusqu'à noël... Au moins... Smiley biggrin

A demain
Bonjour,

Simplement un petit passage pour dire que je n'oublie pas le forum.
Je galère un poil sur le code.
Dès que je m'en suis sortie et s'il fonctionne bien je le mettrai en ligne afin que d'autre puisse en profiter.
Le form sera complet avec un traitement de fichier derrière.
Si j'y arrive un jour, mais je ne perd pas espoir Smiley cligne

A bientôt