Page 1 sur 1

Envoi fichier via messagerie privé :)

Posté : 02 juin 2019, 15:44
par Hyoshiko
Salut, i'm back 8-) :priere:

Je suis en train d'essayer de faire évoluer le système de messagerie privée sur mon site en rajoutant l'option d'envoi de fichiers.
J'ai sur ma bdd une table messages ou j'y ai ajouté un nom = pour le nom du fichier et file_url pour enregistrer le chemin en bdd.

J'ai une page pour le formulaire d'envoi : qui est envoicorrec.php et une page de réception qui est correction.php
Grâce à l'aide de Saian :priere: j'ai pu obtenir un code pour envoyer un message en privé. J'ai voulu du coup rajouter dedans mon code pour le fichier.

J'en suis donc à cette étape j'ai rajouté le code et testé le code en rajoutant quelques echo par ci par là. Je fais un test et saisie tous les champs une fois validé je n'ai pas de messages d'erreurs ( je me dis que c'est une bonne chose ? :? ) et j'ai donc le premier et deuxieme echo 'OK'; et echo'pouet'; qui s'affichent. mais pas d'erreurs et il se passe rien et pas d'enregistrement fait en bdd
envoicorrec.php

Code : Tout sélectionner

if(isset($_SESSION['id']) AND !empty($_SESSION['id'])) { if(isset($_POST['envoi_correction'])){ if(isset($_POST['destinataire'],$_POST['mess']) AND !empty($_POST['destinataire']) AND !empty($_POST['mess']) AND !empty($_FILES)) { echo 'OK'; // test echo juste ici $destinataire = htmlspecialchars($_POST['destinataire']); $messages = htmlspecialchars($_POST['mess']); $stmt = $DB->query( 'SELECT id FROM utilisateur WHERE mail = :mail', // paramètre $sql array(':mail' => $destinataire)); // paramètre $data $dest_exist = $stmt->rowCount(); $file_name = $_FILES['fichier']['tmp_name']; $file_dest = 'files/' . $file_name; $file_extention = strrchr($file_name, "."); $check_ext = array('.pdf', '.PDF', '.PNG', '.png', '.JPG', '.jpg', '.JPEG', '.jpeg'); if ($dest_exist== 1 AND !file_exists($file_dest)) { if (in_array($file_extention, $check_ext)) { echo 'OKEY'; //encore un test echo par là if (move_uploaded_file($file_name, $file_dest)) { $stmt = $stmt->fetch(); $stmt = $stmt['id']; $id = $DB->insert('INSERT INTO messages (id_expediteur,id_destinataire, mess, nom, file_url ) VALUES (?,?,?,?,?)', array($_SESSION['id'],$stmt, $messages,$file_name,$file_dest)); $error = $id ? "Votre message a bien été envoyé !" : $DB->getError(); }else { $error = "Cet utilisateur n'existe pas..."; $error = "Veuillez compléter tous les champs"; } }else { echo 'pouet'; //encore un test juste là. } } } } ?> ... <form method="post" enctype="multipart/form-data" > <br /><br /> <legend>Envoi de fichiers</legend><!-- champs d'envoi de fichier, de type file --> <p>Destinataire:</p><input type="text" name="destinataire" /><br><br> <input type="file" name="fichier" /></p> <textarea placeholder="Votre message" name="mess"></textarea> <br /><br /> <input type="submit" value="Envoyer" name="envoi_correction" /> <br /><br /> <?php if(isset($error)) { echo '<span style="color:red">'.$error.'</span>'; } ?> </legend></form> ... <?php } ?>
correction.php

Code : Tout sélectionner

<?php session_start(); include('bd/connexionDB.php'); // S'il n'y a pas de session alors on ne va pas sur cette page if (!isset($_SESSION['id'])){ header('Location: index.php'); exit; } // On récupère les informations (ps: je ne sais pas trop comment le modifier, un problème à la fois) if(isset($_SESSION['id']) AND !empty($_SESSION['id'])) { $messages = $DB->query('SELECT * FROM messages WHERE id_destinataire = ?', array($_SESSION['id'])); $msg_nbr = $messages->rowCount(); ?> ... <h1>Liste des corrections disponibles</h1> <?php if($msg_nbr == 0) { echo "Vous n'avez aucun message..."; } while($m = $messages->fetch()) { $stmt = $DB->query( 'SELECT mail FROM utilisateur WHERE id = :id', // paramètre $sql array(':id' => $m['id_expediteur'])); // paramètre $data $mail = $stmt->fetchObject()->mail; ?> <b><?= $mail ?></b> vous a envoyé: <br /> <?= nl2br($m['mess']), '<a href="'.$m['file_url'].'">Télécharger'.$m['nom'].'</a>;' ?><br /> -------------------------------------<br/> <?php } ?>

Re: Envoi fichier via messagerie privé :)

Posté : 02 juin 2019, 16:07
par Saian
Rebonjour, ^^

Si tu as le echo 'pouet' qui s'affiche c'est que la condition if (in_array($file_extention, $check_ext)) { n'est pas passée et donc le fichier n'a pas été déplacé et le message n'a pas été enregistré. :P

Quand le code est bien indenté on le voit très bien :
if ($dest_exist== 1 AND !file_exists($file_dest)) {
  if (in_array($file_extention, $check_ext)) {
    echo 'OKEY'; //encore un test echo par là
    if (move_uploaded_file($file_name, $file_dest)) {
      $id = $DB->insert(
        'INSERT INTO messages (id_expediteur,id_destinataire, mess, nom, file_url) VALUES (?,?,?,?,?)',
        array($_SESSION['id'], $stmt->fetchObject()->id, $messages, $file_name, $file_dest));
      $error = $id ? "Votre message a bien été envoyé !" : $DB->getError();
    } else {
      $error = "Cet utilisateur n'existe pas...";
      $error = "Veuillez compléter tous les champs";
    }
  } else {
    echo 'pouet'; //encore un test juste là.
  }
}

Re: Envoi fichier via messagerie privé :)

Posté : 02 juin 2019, 16:25
par Hyoshiko
est-ce que c'est trop imbriqué ? Ou mal imbriqué ?

Re: Envoi fichier via messagerie privé :)

Posté : 02 juin 2019, 16:36
par Saian
La question n'est pas là, la question c'est pourquoi la condition n'est-elle pas remplie ?
Alors vérifies les variables concernées en l’occurrence $file_extention et $check_ext et essaie de comprendre en quoi ce n'est pas bon et comment tu peux corriger ça si cela doit être corrigé.

Re: Envoi fichier via messagerie privé :)

Posté : 02 juin 2019, 17:35
par Hyoshiko
Je rame, j'ai cherché sur le net pour comprendre ce qui n'allait pas mais j'ai beau modifier j'ai soit plus que le echo ok soit echo ok et pouet u_u.

Code : Tout sélectionner

if(isset($_SESSION['id']) AND !empty($_SESSION['id'])) { if(isset($_POST['envoi_correction'])){ if(isset($_POST['destinataire'],$_POST['mess']) AND !empty($_POST['destinataire']) AND !empty($_POST['mess']) AND !empty($_FILES)) { echo 'OK'; // test echo juste ici $destinataire = htmlspecialchars($_POST['destinataire']); $messages = htmlspecialchars($_POST['mess']); $stmt = $DB->query( 'SELECT id FROM utilisateur WHERE mail = :mail', // paramètre $sql array(':mail' => $destinataire)); // paramètre $data $dest_exist = $stmt->rowCount(); $file_name = $_FILES['fichier']['tmp_name']; $file_dest = 'files/' . $file_name; $file_extension = strtolower(substr(strrchr($file_name, '.'), 1)); $check_ext = array('.pdf', '.PDF', '.PNG', '.png', '.JPG', '.jpg', '.JPEG','.jpeg'); if ($dest_exist== 1 AND !file_exists($file_dest)) { if (in_array($file_extension, $check_ext)) { if (move_uploaded_file($file_name, $file_dest)) { $stmt = $stmt->fetch(); $stmt = $stmt['id']; echo 'OKEY'; //encore un test echo par là $id = $DB->insert('INSERT INTO messages (id_expediteur,id_destinataire, mess, nom, file_url ) VALUES (?,?,?,?,?)', array($_SESSION['id'],$stmt, $messages,$file_name,$file_dest)); $error = $id ? "Votre message a bien été envoyé !" : $DB->getError(); }else { $error = "Cet utilisateur n'existe pas..."; $error = "Veuillez compléter tous les champs"; } }else { echo 'pouet'; //encore un test juste là. } } } } ?>

Re: Envoi fichier via messagerie privé :)

Posté : 02 juin 2019, 17:45
par Saian
Hyoshiko, c'est pas sur le net qu'il faut chercher là, c'est dans ton code.
Comme je t'ai déjà dit, si ça t'affiche pouet c'est que ta condition if (in_array($file_extension, $check_ext)) { retourne false.
Et pour comprendre pourquoi, il faut que tu regardes ce que tu as dans $file_extension et $check_ext.
C'est pas compliqué, la valeur de $file_extension n'est pas présente dans le tableau $check_ext. Rien de plus, rien de moins.
Tu as juste à regarder le contenu de $file_extension pour comprendre.
Un simple echo $file_extension; juste avant le if, c'est tout.

Tu vas voir à tous les coups il manque juste le . au début ou le dernier caractère dans $file_extension.
Tu auras juste à corriger cette ligne :
$file_extension = strtolower(substr(strrchr($file_name, '.'), 1));
Ou modifier ton tableau $check_ext pour que ça corresponde avec $file_extension.

PS : fait aussi l'effort de bien indenter ton code, il sera beaucoup plus lisible et tu le comprendras beaucoup mieux.
if(isset($_SESSION['id']) AND !empty($_SESSION['id'])) {
  if (isset($_POST['envoi_correction'])) {
    if (isset($_POST['destinataire'], $_POST['mess']) AND !empty($_POST['destinataire']) AND !empty($_POST['mess']) AND !empty($_FILES)) {
      echo 'OK'; // test echo juste ici 
      $destinataire = htmlspecialchars($_POST['destinataire']);
      $messages = htmlspecialchars($_POST['mess']);
      $stmt = $DB->query(
        'SELECT id FROM utilisateur WHERE mail = :mail', // paramètre $sql
        array(':mail' => $destinataire)); // paramètre $data
      $dest_exist = $stmt->rowCount();
      $file_name = $_FILES['fichier']['tmp_name'];
      $file_dest = 'files/'.$file_name;
      $file_extension = strtolower(substr(strrchr($file_name, '.'), 1));
      $check_ext = array('.pdf', '.PDF', '.PNG', '.png', '.JPG', '.jpg', '.JPEG', '.jpeg');

      if ($dest_exist == 1 AND !file_exists($file_dest)) {
        if (in_array($file_extension, $check_ext)) {
          if (move_uploaded_file($file_name, $file_dest)) {
            $stmt = $stmt->fetch();
            $stmt = $stmt['id'];
            echo 'OKEY'; //encore un test echo par là
            $id = $DB->insert('INSERT INTO messages (id_expediteur,id_destinataire, mess, nom, file_url ) VALUES (?,?,?,?,?)',
              array($_SESSION['id'], $stmt, $messages, $file_name, $file_dest));
            $error = $id ? "Votre message a bien été envoyé !" : $DB->getError();
          } else {
            $error = "Cet utilisateur n'existe pas...";
            $error = "Veuillez compléter tous les champs";
          }
        } else {
          echo 'pouet'; //encore un test juste là.
        }
      }
    }
  }
}

Et si tu as juste le echo OK qui s'affiche c'est que tu as un problème avec la condition if ($dest_exist == 1 AND !file_exists($file_dest)) { juste avant celle du in_array.
C'est à dire soit $dest_exist est différent de 1 soit $file_dest existe déjà... fais fonctionner ta logique, essaie de lire le code comme si tu étais l'ordinateur en train de l'exécuter.

Re: Envoi fichier via messagerie privé :)

Posté : 02 juin 2019, 18:30
par Hyoshiko
C'est bon !!! *_*
ca donne ça

Code : Tout sélectionner

// On récupère les informations de l'utilisateur grâce à son ID if(isset($_SESSION['id']) AND !empty($_SESSION['id'])) { if(isset($_POST['envoi_correction'])){ if(isset($_POST['destinataire'],$_POST['mess']) AND !empty($_POST['destinataire']) AND !empty($_POST['mess']) AND !empty($_FILES)) { echo 'OK'; // test echo juste ici $destinataire = htmlspecialchars($_POST['destinataire']); $messages = htmlspecialchars($_POST['mess']); $stmt = $DB->query( 'SELECT id FROM utilisateur WHERE mail = :mail', // paramètre $sql array(':mail' => $destinataire)); // paramètre $data $dest_exist = $stmt->rowCount(); $file_name = $_FILES['fichier']['name']; $file_tmp_name = $_FILES['fichier']['tmp_name']; $file_dest = 'files/' . $file_name; $file_extention = strrchr($file_name, "."); $check_ext = array('.pdf', '.PDF', '.PNG', '.png', '.JPG', '.jpg', '.JPEG','.jpeg'); if (in_array($file_extention, $check_ext)) { echo $file_extention; if(file_exists($file_dest) AND ($dest_exist== 1) ) { echo 'OKEY'; //encore un test echo par là $stmt = $stmt->fetch(); $stmt = $stmt['id']; if (move_uploaded_file($file_tmp_name, $file_dest)) { echo'prout'; $id = $DB->insert('INSERT INTO messages (id_expediteur,id_destinataire, mess, names, file_url) VALUES (?,?,?,?,?)', array($_SESSION['id'],$stmt, $messages,$file_name,$file_dest)); $error = $id ? "Votre message a bien été envoyé !" : $DB->getError(); }else { $error = "Cet utilisateur n'existe pas..."; $error = "Veuillez compléter tous les champs"; } }else { echo 'pouet'; //encore un test juste là. } } } } ?>
merci :priere: Je regarde maintenant pour l'autre page ! :)

Re: Envoi fichier via messagerie privé :)

Posté : 02 juin 2019, 18:32
par Hyoshiko
C'est nickel ça marche super !