Problème Upload image sur le serveur

Résolu
lina-24 Messages postés 63 Date d'inscription   Statut Membre Dernière intervention   -  
jordane45 Messages postés 38480 Date d'inscription   Statut Modérateur Dernière intervention   - 16 nov. 2020 à 20:54
Bonjour j'ai réussi à afficher un message d'alerte lors de la saisie d'une adresse e-mail en double (Adresse mail déja utiliser), mais le problème lorsque je clique sur le bouton d'envoi, l'image est transférée vers le serveur malgré que j'ai une adresse mail en double !! je pense que j’ai une erreur sur mon script que je n’arrive pas à détecter

if($_POST) {
 // database connection
 include 'connect_bd.php';

 $conn = new mysqli($server, $username, $password, $dbname);

 // check db connection
 if($conn->connect_error) {
  die("Connection Failed : " . $conn->connect_error);
 } 
 else {
  // echo "Successfully Connected";
 }

 $valid = array('success' => false, 'messages' => array());

 $name = htmlspecialchars ($_POST['Name']);
 $lastname = htmlspecialchars ( $_POST['lastname']);
    $sex =  htmlspecialchars ($_POST['Sex']);
    $age = htmlspecialchars ( $_POST['Age']);
    $statut = htmlspecialchars ( $_POST['Statut']);
    $proffession =  htmlspecialchars ($_POST['Proffession']);
    $ville = htmlspecialchars ( $_POST['Ville']);
    $mobile = htmlspecialchars ( $_POST['Mobile']);
    $email =  htmlspecialchars ($_POST['email']);
    //$date_created = $_POST['fullName'];

 $type = explode('.', $_FILES['userImage']['name']);
    
    
 $type = $type[count($type) - 1];
 $url = '../uploads/files/' . uniqid(rand()) . '.' . $type;

 if(in_array($type, array('gif', 'jpg', 'jpeg', 'png'))) {
  if(is_uploaded_file($_FILES['userImage']['tmp_name'])) {
   if(move_uploaded_file($_FILES['userImage']['tmp_name'], $url)) {
}
                
 //******************************************************************       
// Vérification doublon email avant validation du formulaire
       
      $sql = "SELECT * FROM visitor WHERE email = '$email' ";
      $result = $conn->query($sql);
      $row = $result -> fetch_array(MYSQLI_ASSOC);
  
  if (empty($row)){
                 // dans ce cas, la requete n'a rien retourné..


    // insert into database
    $sql = "INSERT INTO visitor (Name,lastname, Sex, Age, Statut, Proffession, Ville, Mobile, email, Image) VALUES ('$name','$lastname','$sex','$age','$statut','$proffession','$ville','$mobile','$email','$url')";

    if($conn->query($sql) === true) {
     $valid['success'] = true;
     $valid['messages'] = "Successfully Uploaded";
    } 
    else {
     
     $valid['messages'] = "Erreur lors du telechargement";
    }

    

   }
   else {
    $valid['success'] = false;
    $valid['messages'] = "Adresse mail déja utiliser";
   }
                }
            
            else{
                
                }  
    }
        echo json_encode($valid);
$conn->close();
            }


Configuration: Windows / Chrome 86.0.4240.198
A voir également:

3 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour,
au lieu de
empty($row)
, moi je testerais la valeur de
count($row)
0
Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention   1 011
 
Bonjour,

Le problème vient simplement du fait que tu fais le move_uploaded_file avant de vérifier l'email...
Revois l'ordre des actions dans ton script, pour que l'a validation de l'adresse soit faite avant toute autre chose.
Autre possibilité : en cas d'erreur, supprimer le fichier qui a été au préalable copié.

Xavier
0
lina-24 Messages postés 63 Date d'inscription   Statut Membre Dernière intervention   4
 
oui exactement :) mais quand je vérifie l'email avant le move_uploaded_file le message alerte disparaît

0
Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention   1 011 > lina-24 Messages postés 63 Date d'inscription   Statut Membre Dernière intervention  
 
Fais voir ton code quand tu fais ça ?
0
lina-24 Messages postés 63 Date d'inscription   Statut Membre Dernière intervention   4 > Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention  
 
$conn = new mysqli($server, $username, $password, $dbname);

 // check db connection
 if($conn->connect_error) {
  die("Connection Failed : " . $conn->connect_error);
 } 
 else {
  // echo "Successfully Connected";
 }

 $valid = array('success' => false, 'messages' => array());

 $name = htmlspecialchars ($_POST['Name']);
 $lastname = htmlspecialchars ( $_POST['lastname']);
    $sex =  htmlspecialchars ($_POST['Sex']);
    $age = htmlspecialchars ( $_POST['Age']);
    $statut = htmlspecialchars ( $_POST['Statut']);
    $proffession =  htmlspecialchars ($_POST['Proffession']);
    $ville = htmlspecialchars ( $_POST['Ville']);
    $mobile = htmlspecialchars ( $_POST['Mobile']);
    $email =  htmlspecialchars ($_POST['email']);
    //$date_created = $_POST['fullName'];


  
   //******************************************************************       
// Vérification doublon email avant validation du formulaire
       
      $sql = "SELECT * FROM visitor WHERE email = '$email' ";
      $result = $conn->query($sql);
      $row = $result -> fetch_array(MYSQLI_ASSOC);
  
  if (empty($row)){
                 // dans ce cas, la requete n'a rien retourné..  
   

 $type = explode('.', $_FILES['userImage']['name']); 
 $type = $type[count($type) - 1];
 $url = '../uploads/files/' . uniqid(rand()) . '.' . $type;

 if(in_array($type, array('gif', 'jpg', 'jpeg', 'png'))) {
  if(is_uploaded_file($_FILES['userImage']['tmp_name'])) {
   if(move_uploaded_file($_FILES['userImage']['tmp_name'], $url)) {
}
                



    // insert into database
    $sql = "INSERT INTO visitor (Name,lastname, Sex, Age, Statut, Proffession, Ville, Mobile, email, Image) VALUES ('$name','$lastname','$sex','$age','$statut','$proffession','$ville','$mobile','$email','$url')";

    if($conn->query($sql) === true) {
     $valid['success'] = true;
     $valid['messages'] = "Successfully Uploaded";
    } 
    else {
     
     $valid['messages'] = "Erreur lors du telechargement";
    }

    

   }
   else {
    $valid['success'] = false;
    $valid['messages'] = "Adresse mail déja utiliser";
   }
                }
            
            else{
                
                }  
    }
        echo json_encode($valid);
$conn->close();
            }
0
jordane45 Messages postés 38480 Date d'inscription   Statut Modérateur Dernière intervention   4 746 > lina-24 Messages postés 63 Date d'inscription   Statut Membre Dernière intervention  
 
Tu fermes ton if trop top...
   if(move_uploaded_file($_FILES['userImage']['tmp_name'], $url)) {
}


De plus, la fonction htmlspecialchar ne doit pas s'utiliser pour stocker les données en BDD et ne doit être utilisée que pour de l'affichage sur une page web.

Il serait bien également d'être un peu plus rigoureuse sur l'indentation de ton code et l'écriture de celui-ci.

Bien que ça ne soit pas une réelle obligation, ne serait-ce que sur l'écriture des IF/ELSE, pourrais tu appliquer la norme
https://www.php-fig.org/psr/psr-2/#51-if-elseif-else
0
lina-24 Messages postés 63 Date d'inscription   Statut Membre Dernière intervention   4 > jordane45 Messages postés 38480 Date d'inscription   Statut Modérateur Dernière intervention  
 
je vous remercie pour le conseil Jordane pour le ( htmlspecialchar ) c'est mon 1er exercice en php j'ai commencé le php il y a que 2 mois pour la fermiture du if quand je le ferme tard le message d'alert ne s'afiche plus.
0
jordane45 Messages postés 38480 Date d'inscription   Statut Modérateur Dernière intervention   4 746
 
Voici ( encore une fois... )
ton code amélioré ... ( je l'ai découpé en fonctions )


<?php 
//Affichage des erreurs PHP
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);


//connexion à ta bdd
$server = '127.0.0.1';
$username = 'root';
$password = '';
$dbname = 'base';

$mysqli = new mysqli($server, $username, $password, $dbname);
if ($mysqli->connect_error) {
  sendResponse('Erreur de connexion (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error, false); 
}



/**
 * Permet de récupérer proprement les variables avant de les utiliser
 * @param type $varName
 * @param type $defaultValue
 * @return type
 */
function getPost($varName,$defaultValue=NULL){
  return isset($_POST[$varName]) ? $_POST[$varName] : $defaultValue;
}


/**
 * Fonction qui va assurer le renvoi, au format json, du message
 * @param type $message
 * @param type $success
 */
function sendResponse($message,$success=false){
  header('Content-Type: application/json'); // on force le format en JSON dans le header http de la réponse
  $data = array('success' => $success, 'messages' => $message);
  echo json_encode($data);
  exit;
}

/**
 * Retourne les infos d'un "visiteur" 
 * @global mysqli $mysqli
 * @param string $email
 * @return array
 */
function getVisitorByMail($email){
  global $mysqli;
  $sql = "SELECT * FROM visitor 
         WHERE email = '$email' ";
  
  if (!$result = $mysqli->query($sql)) {
    sendResponse("Message d'erreur : %s\n", $mysqli->error , false);
  }
  return $result -> fetch_array(MYSQLI_ASSOC);
}

/**
 * Fonction permettant d'inséeer les données dans la bdd
 * @global mysqli $mysqli
 * @param type $name
 * @param type $lastname
 * @param type $sex
 * @param type $age
 * @param type $statut
 * @param type $proffession
 * @param type $ville
 * @param type $mobile
 * @param type $email
 * @param type $url
 * @return type
 */
function addInDb($name,$lastname,$sex,$age,$statut,$proffession,$ville,$mobile,$email,$url){
  global $mysqli;
  $sql = "INSERT INTO visitor (Name,lastname, Sex, Age, Statut, Proffession, Ville, Mobile, email, Image) 
          VALUES ('$name','$lastname','$sex','$age','$statut','$proffession','$ville','$mobile','$email','$url')";
  if (!$result = $mysqli->query($sql)) {
    sendResponse("Message d'erreur : %s\n", $mysqli->error , false);
  }
  return $result;
}

//récupération PROPRE des variables AVANT de les utiliser
$name = getPost('fullName');
$lastname = getPost('lastname');
$email = getPost('email');
$sex =  getPost('Sex');
$age = getPost('Age');
$statut = getPost('Statut');
$proffession =  getPost ('Proffession');
$ville = getPost('Ville');
$mobile = getPost('Mobile');

//on récupère proprement la variables $_FILES
$files = !empty($_FILES['userImage']) ? $_FILES['userImage'] : NULL;
if(empty($files)){
  sendResponse("Aucun fichie à uploader !",false);
}

//On récupère les infos du visiteur pour voir si son email existe déjà
$visitor = getVisitorByMail($email);

//si l'utilisateur existe déjà
if(!empty($visitor)){
  sendResponse("Cet email existe déjà !",false);
}

$filename = $files['name'];
$ext = pathinfo($filename, PATHINFO_EXTENSION);
$url = '../uploads/files/' . uniqid(rand()) . '.' . $ext;

$allowed = array('gif', 'jpg', 'jpeg', 'png');
if (!in_array($ext, $allowed)) {
  sendResponse("Extension de fichier non autorisé !",false);
}

if(!is_uploaded_file($files['tmp_name'])){
  sendResponse("Erreur lors du téléchargement du fichier !",false);
}

 if(!move_uploaded_file($files['tmp_name'],$url)){
   //si le move_uploaded a échoué
   sendResponse("Erreur lors du déplacement du fichier !",false);
 }else{
   //l'uplod c'est bien passé...
  addInDb($name,$lastname,$sex,$age,$statut,$proffession,$ville,$mobile,$email,$url);
  sendResponse("Successfully Uploaded",true); 
 }





Je te laisse le tester.

N'oublie pas de regarder dans la CONSOLE de ton navigateur si d'éventuelles informations apparaissent lorsque tu exécutes ce code.
( console de FireFox ... plus facile pour débuguer de l'ajax comme je te l'ai déjà indiqué )




Je t'invite au passage, à lire (et à appliquer dans tes prochains codes, les conseils donnés ici :
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code
0
lina-24 Messages postés 63 Date d'inscription   Statut Membre Dernière intervention   4
 
ça marche 5/5 UN GRAND MERCI Jordan45 <3 Je vous promets d'apprendre plus & de faire de mon mieux la prochaine fois
0
jordane45 Messages postés 38480 Date d'inscription   Statut Modérateur Dernière intervention   4 746 > lina-24 Messages postés 63 Date d'inscription   Statut Membre Dernière intervention  
 
Tu penseras à mettre la discussion en résolue

Bonne soirée.
0