Formulaire d'inscription : deux uploads à faire

Eléphanteau du PHP | 12 Messages

07 juin 2012, 19:27

Bonsoir à tous,

Je finalise mon site en améliorant mon formulaire d'inscription. Tout est niquel, je cherche juste à faire en sorte que mon user ajoute lors de son inscription sa photo (avatar) ET son CV (pdf).
Alors la photo, ça roule tout seul, mais maintenant que je veux ajouter le CV ça cafouille.
Je pense bien avoir trouvé pourquoi (mes files sont stockés en temporaire, donc deux "name" et deux "destination" en temporaire ça peut pas cohabiter), mais par contre je ne comprends pas comment contourner ce problème.
J'ai essayé en lançant une page php autre avec un lien, mais là je ne sais pas comment faire pour que le CV soit bien lié à mon user ensuite, d'où la solution idéale : uploader les deux dans le même formulaire.
<?php

// Redirige l'utilisateur s'il est déjà identifié
if(isset($_COOKIE["NumEtu"]))
{
     header("Location: ../index.php");
}
else
{

     
     // Formulaire visible par défaut
     $masquer_formulaire = false;
     
     // Une fois le formulaire envoyé
     if(isset($_POST["BT_Envoyer"]))
     {
          
          // Vérification de la validité des champs
          if(!mb_ereg("^[A-Za-z0-9_]{4,20}$", $_POST["TB_Nom_Utilisateur"]))
          {
               $message = "Votre nom d'utilisateur doit comporter entre 4 et 20 caractères<br />\n";
               $message .= "L'utilisation de l'underscore est autorisée";
          }
          elseif(!mb_ereg("^[A-Za-z0-9]{4,}$", $_POST["TB_Mot_de_Passe"]))
          {
               $message = "Votre mot de passe doit comporter au moins 4 caractères";
          }
          elseif($_POST["TB_Mot_de_Passe"] != $_POST["TB_Confirmation_Mot_de_Passe"])
          {
               $message = "Votre mot de passe n'a pas été correctement confirmé";
          }
		elseif(!mb_ereg("^[A-Za-z0-9]{1,}$", $_POST["TB_Nom"]))
          {
               $message = "Vous devez renseigner votre nom de famille";
          }
		  elseif(!mb_ereg("^[A-Za-z0-9]{1,}$", $_POST["TB_Prenom"]))
          {
               $message = "Vous devez renseigner votre prénom";
          }
          elseif(!mb_ereg("^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]{2,}[.][a-zA-Z]{2,4}$",
               $_POST["TB_Adresse_Email"]))
          {
               $message = "Votre adresse e-mail n'est pas valide";
          }
		  
          else
          {
               
               // Connexion à la base de données
               // Valeurs à modifier selon vos paramètres configuration
               mysql_connect("localhost", "root", "");
               mysql_select_db("baseasso2");
               
               // Vérification de l'unicité du nom d'utilisateur et de l'adresse e-mail
               $result = mysql_query("
                    SELECT Nom_Utilisateur
                         , EmailEtu
                    FROM etudiant
                    WHERE Nom_Utilisateur = '" . $_POST["TB_Nom_Utilisateur"] . "'
                    OR EmailEtu = '" . $_POST["TB_Adresse_Email"] . "'
               ");
               
               // Si une erreur survient
               if(!$result)
               {
                    $message = "Erreur d'accès à la base de données lors de la vérification d'unicité";
               }
               else
               {
                    
                    // Si un enregistrement est trouvé
                    if(mysql_num_rows($result) > 0)
                    {
                         
                         while($row = mysql_fetch_array($result))
                         {
                              
                              if($_POST["TB_Nom_Utilisateur"] == $row["Nom_Utilisateur"])
                              {
                                   $message = "Le nom d'utilisateur " . $_POST["TB_Nom_Utilisateur"];
                                   $message .= "est déjà utilisé";
                              }
                              elseif($_POST["TB_Adresse_Email"] == $row["EmailEtu"])
                              {
                                   $message = "L'adresse e-mail " . $_POST["TB_Adresse_Email"];
                                   $message .= "est déjà utilisée";
                              }
                              
                         }
               
                    }
                    else
                    {
                         
                         // Génération de la clef d'activation
                         $caracteres = array("a", "b", "c", "d", "e", "f", 0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
                         $caracteres_aleatoires = array_rand($caracteres, 8);
                         $clef_activation = "";
                      
$avatar = $_FILES['avatar'];
$n_avatar=basename($avatar['name']);
$ref_avatar=$n_avatar;
 $avatar_destination = "../images/photos/". $ref_avatar ;
if (!move_uploaded_file($avatar['tmp_name'],$avatar_destination)) {
echo "Erreur de téléchargement !!";
exit();
}

					 
                         foreach($caracteres_aleatoires as $i)
                         {
                              $clef_activation .= $caracteres[$i];
                         }
						
                         // Création du compte utilisateur
                         $result = mysql_query("
                              INSERT INTO etudiant(
                                   Nom_Utilisateur
                                   , Motdepasse
								   , Nom
								   , Prenom
                                   , EmailEtu
								   , Photo
								   , SituationPro
								   , CV
								   , SitePerso
                                   , DateInscription
                                   , Clef_Activation
                              )
                              VALUES(
                                   '" . $_POST["TB_Nom_Utilisateur"] . "'
                                   , '" . md5($_POST["TB_Mot_de_Passe"]) . "'
								   , '" . $_POST["TB_Nom"] . "'
								   , '" . $_POST["TB_Prenom"] . "'
                                   , '" . $_POST["TB_Adresse_Email"] . "'
								   , '" . $_FILES['avatar']['name'] . "'
								   , '" . $_POST["TB_SituationPro"] . "'
								   , ''
								   , '" . $_POST["TB_SitePerso"] . "'
                                   , '" . time() . "'
                                   , '" . $clef_activation . "'
                              )
                         ");
						
                         // Si une erreur survient
                         if(!$result)
                         {
                              $message = "Erreur d'accès à la base de données lors de la création du compte utilisateur";
                         }
                         else
                         {
                              
                              // Envoi du mail d'activation
                              $sujet = "Activation de votre compte utilisateur";
                              
                              $message = "Pour valider votre inscription, merci de cliquer sur le lien suivant :\n";
                              $message .= "http://" . $_SERVER["SERVER_NAME"];
                              $message .= "/inscriptionok.php?id=" . mysql_insert_id();
                              $message .= "&clef=" . $clef_activation;
                              
                              // Si une erreur survient
                              if(!@mail($_POST["TB_Adresse_Email"], $sujet, $message))
                              {
                                   $message = "Une erreur est survenue lors de l'envoi du mail d'activation<br />\n";
                                   $message .= "Veuillez contacter l'administrateur afin d'activer votre compte";
                              }
                              else
                              {
                                   
                                   // Message de confirmation
                                   $message = "Votre compte utilisateur a correctement été créer<br />\n";
                                   $message .= "Un email vient de vous être envoyer afin de l'activer";
                                   
                                   // On masque le formulaire
                                   $masquer_formulaire = true;
                                   
                              }
                              
                         }
                         
                    }
                    
               }
               
          }
          
          
     }
     
}

?>
Dans ce code, j'ai enlevé mon upload de cv, mais en fait c'était une simple copie de mon code pour l'avatar (avec cv à la place d'avatar, bien entendu).

D'avance merci !

ViPHP
ViPHP | 2577 Messages

07 juin 2012, 20:44

Comment as tu codé les inputs pour tes 2 fichiers ?
D'après la docs, il y a des comportements surprenant lorsque l'on utilise des tableaux.
un var_dump($_FILES); peut t'aider à exploiter ce tableau.

ViPHP
AB
ViPHP | 5818 Messages

08 juin 2012, 01:26

D'après la docs, il y a des comportements surprenant lorsque l'on utilise des tableaux.
Ah oui ? Je ne m'en suis pas rendu compte lorsque j'ai fait ma classe d'upload et pourtant elle permet d'utiliser la notation tableau (et donc aussi le multi upload html5). Tu as des précisions parce que d'après tous mes tests je n'ai jamais rencontré de problème à ce niveau là.

ViPHP
AB
ViPHP | 5818 Messages

08 juin 2012, 02:55

Je pense bien avoir trouvé pourquoi (mes files sont stockés en temporaire, donc deux "name" et deux "destination" en temporaire ça peut pas cohabiter), mais par contre je ne comprends pas comment contourner ce problème.
Et pourquoi ça pourrait pas cohabiter ? il suffit d'avoir deux input de type file avec des noms différents dans ton formulaire et tu récupéreras deux fichiers temporaires distincts.

Sinon as-tu jeter un oeil à mes petites remarques ici Je sais bien ça fait rabat joie mais bon là tu trace, tu trace mais au final tu auras un script qui finira bien par te renvoyer une page blanche sans plus de formalité puis qu'aucune erreur d'upload n'est gérée, sans compter les failles de sécurité mysql puisque tu n'utilise jamais "mysql_real_escape_string", alors qu'il serait plus prudent de l'utiliser systématiquement.

Sinon tu t'embête pas mal pour générer une clef d'activation. Tu pourrais te servir de la fonction uniqid qui en plus te garantirait un identifiant unique.

Ensuite, pourquoi limiter les caractères autorisés pour le mot de passe, en faisant ainsi tu réduis la sécurité.

Cette limitation est encore pire pour le nom de famille et le prénom : faut être bien français ou anglo saxon pour correspondre au regex (les autres dehors !) et en plus pas de nom composé possible. On se demande pourquoi tu fais cela ? C'est la maladie du contrôle limitatif, tout ça peut-être pour ne pas protéger tes variables avec mysql_real_escape_string ? Enfin bref c'est vraiment pas logique de s'embêter autant pour ensuite avoir des problèmes fonctionnels.

Et pour les mails, plutôt qu'un regex il y a une fonction dédiée php avec filter_var
$mail = '[email protected]';
if(filter_var($mail, FILTER_VALIDATE_EMAIL)) echo 'mail valide'; esle echo 'mail invalide';
Faut y aller doucement avec les contrôles de caractères autorisés et ne les faire uniquement que quand c'est nécessaire sinon c'est contre productif. Par contre tu ne fais aucun contrôle pour l'upload, ni rien pour protéger tes variables dans les requêtes et ces points sont à corriger sinon gare au problèmes fonctionnels ou au piratage.

ViPHP
ViPHP | 2577 Messages

08 juin 2012, 09:37

Source : http://php.net/manual/fr/reserved.variables.files.php

D'après les exemples de la page pour des input "FICHIER[]", il me semble qu'il faut faire attention entre :
$_FILES['FICHIER'][0]['NAME']
et
$_FILES['FICHIER']['NAME'][0]

Mais je ne fais pas d'upload et encore moins d'upload multiple avec des tableaux. J'ai juste parcouru la page suite à un post mais ca devrait venir. J'utiliserai alors surement des noms différents plutôt qu'un tableau.

Edit : en fait je ne sais pas quelle est l'écriture correct entre les 2, ni quelle est la plus logique. Je vérifierai à l'utilisation.

ViPHP
AB
ViPHP | 5818 Messages

08 juin 2012, 19:47

Source : http://php.net/manual/fr/reserved.variables.files.php

D'après les exemples de la page pour des input "FICHIER[]", il me semble qu'il faut faire attention entre :
$_FILES['FICHIER'][0]['NAME']
et
$_FILES['FICHIER']['NAME'][0]

Mais je ne fais pas d'upload et encore moins d'upload multiple avec des tableaux. J'ai juste parcouru la page suite à un post mais ca devrait venir. J'utiliserai alors surement des noms différents plutôt qu'un tableau.

Edit : en fait je ne sais pas quelle est l'écriture correct entre les 2, ni quelle est la plus logique. Je vérifierai à l'utilisation.
Ah oui je n'utilise pas ces notations multi dimensionnelles. Pour moi les choses sont assez simples c'est

Code : Tout sélectionner

<input name = "user_file[]" type = "file" />
uniquement pour télécharger plusieurs fichiers dans le même répertoire.

Si les répertoires de destinations sont différents je mets des champs de type file avec des noms différents.

(C'est pour cela que dans les exemples d'utilisation de ma classe d'upload je fais une initialisation de la classe pour chaque destination différente, même si c'est pour le même formulaire d'upload.)

Bah sinon c'est difficilement gérable :wink: