Comment éviter le renvoi du formulaire en rafraichissant

Fermé
Hocine04 Messages postés 1 Date d'inscription jeudi 25 février 2016 Statut Membre Dernière intervention 25 février 2016 - 25 févr. 2016 à 19:01
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 - 27 févr. 2016 à 22:47
Bonjour, je suis en train de tester un formulaire d'upload d'image et j'ai utilisé le code que l'on trouve ici https://openclassrooms.com/courses/eviter-le-renvoi-repetitif-d-un-formulaire-en-rafraichissant pour éviter de recevoir plusieurs fois le même fichier quand l'utilisateur rafraichi le formulaire. Mais du coup le fichier ne s'envoie pas et je recois le message d'erreur suivant "Une erreur est survenue lors de l'envoie du fichier'.

J'ai besoin d'un coup de pouce :)

Voici le code du formulaire de l'upload (traitement sur la même page) :

<?php
    session_start();
    // { Début - Première partie
    if(!empty($_POST) OR !empty($_FILES))
    {
        $_SESSION['sauvegarde'] = $_POST ;
        $_SESSION['sauvegardeFILES'] = $_FILES ;
         
        $fichierActuel = $_SERVER['PHP_SELF'] ;
        if(!empty($_SERVER['QUERY_STRING']))
        {
            $fichierActuel .= '?' . $_SERVER['REQUEST_URI'] ;
        }
         
        header('Location: ' . $fichierActuel);
        exit;
    }
 
    // { Début - Seconde partie
    if(isset($_SESSION['sauvegarde']))
    {
        $_POST = $_SESSION['sauvegarde'] ;
        $_FILES = $_SESSION['sauvegardeFILES'] ;
         
        unset($_SESSION['sauvegarde'], $_SESSION['sauvegardeFILES']);
    }
    // } Fin - Seconde partie
 
?>
 
<?php
    require 'connexion_bdd.php';
    $message = '';
    if(!empty($_FILES)){
        $file_name = $_FILES['photo']['name'];
        $file_extension = strrchr($file_name, ".");
        $extension_autorisees = array('.jpg', '.jpeg', '.png','.JPG', '.JPEG', '.PNG');
        $file_tmp_name = $_FILES['photo']['tmp_name'];
        $file_dest = '5images/' . date("G-i-s").$file_name;
         
         
        if(in_array($file_extension, $extension_autorisees)){
            if($_FILES['photo']['error'] == 0)
                if ($_FILES['photo']['size'] <= 1000000){
                    if(move_uploaded_file($file_tmp_name, $file_dest)){
                        $req = $bdd->prepare('INSERT INTO formulaire (titre, photo) VALUES(?, ?)');
                        $req->execute(array($_POST['titre'], $file_dest));
                        $bdd = NULL;
                         
                        $message = 'Votre photo a été enregistrée !';
                    }
                    else {
                        $message = 'Une erreur est survenue lors de l\'envoie du fichier';
                    }
                }
                else {
                    $message = 'La taille du fichier dépasse la limite autorisée';
                }
            else {
                $message = 'Votre fichier comporte une erreur';
            }
        }
        else {
            $message = 'Seuls les fichiers jpg/jpeg/png sont autorisés';
        }
    }
?>
 
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
    </head>
         
    <body>
        <form method="POST" enctype="multipart/form-data">
            Titre :<input type="text" name="titre"/><br /><br />
             
            <p><?php if(!empty($message)){echo $message;} ?></p>
            <input type="file" name="photo" /><br /><br />
              
            <input type="submit" name="envoyer" value="Envoyer">
        </form>
    </body>
</html>

1 réponse

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
27 févr. 2016 à 22:47
Bonjour,


1 -

Mais du coup le fichier ne s'envoie pas et je recois le message d'erreur suivant "Une erreur est survenue lors de l'envoie du fichier'.


Le message d'erreur est celui du else du IF
if(move_uploaded_file($file_tmp_name, $file_dest)){


Visiblement... il ne parvient pas à faire le move_uploaded_file...
- Le nom du répertoire de déstination est bon ? (5images ??)
- Les droits sur le répertoire sont bons ?
$file_dest = '5images/' . date("G-i-s").$file_name;



2 -
Que contient la variable $_FILES lorsque tu rencontres ce message d'erreur ?
Peux tu en faire un PRINT_R et nous afficher le résultat ?

3 -
Tu as écrit : (je devrais dire... copier/coller du site openclassroom...) le code suivant :
 $_POST = $_SESSION['sauvegarde'] ;
  $_FILES = $_SESSION['sauvegardeFILES'] ;


Attention... $_POST et $_FILES sont des variables ( globales) créées lors de la soumission d'un formulaire (via un SUBMIT) .
Il n'est pas conseillé d'y mettre des choses .... (autrement que par un submit ! )


4 -
La solution conseillées pour éviter le renvoie d'un formulaire ( lors d'un F5 par exemple;..) c'est l'utilisation de TOKEN. (en cherchant sur le net tu devrais pouvoir trouver des exemples )

Tu peux aussi utiliser la redirection (
 header('location: pagexx.php'); 
une fois que le formulaire a été envoyé et traité (après ton insert en gros..) ainsi les variables POST et FILE sont remises à zéro... et le F5 n'aura plus aucun effet


0