Bonjour,
Je suis novice en la matière & je rencontre un petit problème avec mon code.

J'ai crée un formulaire (titre, contenu article & upload image) qui permet de modifier les données dans la base de donnée pour ensuite les
affichés côté user.

Mais voilà, je suis bloquée par l'affichage des erreurs, dans le cas ou l'image n'est pas un jpg, png.. Je ne sais pas trop comment m'y prendre
Pour le moment, j'ai essayée de faire un tableau & si celui ci n'est pas vide, j'affiche le message, mais malheureusement pour moi ça ne marche pas.

Voici mes code:

  • La vue du formulaire (adminModifActualite.php)
    
    <?php include 'layout/layout-headerModif.php' ;?>

<main id="modifActualite">
<h3>Modification d'article</h3>
<form method="POST" action="update.class.php" enctype="multipart/form-data">

<?php
if(isset($error))
{
foreach($error as $e)
{
echo '<p class="error">$e</p>';
}
}
?>

<fieldset>
  <legend>Modifier</legend>
  <div>
    <label for="titre">Titre: </label>
    <input type="text" id="titre" name="titre" value="<?= $article['titre']?>">
  </div>
  <div>
    <label for="contenu">Article: </label>
    <textarea name="contenu" rows="5"><?= $article['contenu']?></textarea>
  </div>
  <div>
    <label for="photo">Photo: </label>
    <input type="file" id="photo" name="photo">
  </div>
  <input type="hidden" name="id_article" value="<?=$_GET['id'] ?>">
  <button type="submit">Ajouter</button>
  <button type="reset">Annuler</button>
</fieldset>

</form>
</main>

<?php include 'layout/layout-footer.php'; ?>


Mon code qui traite le formulaire:

include '../../BDD/pdo.php';

$upload = '../upload'; //Chemin pour le dossier image uplaod
var_dump(is_dir($upload)); //Vérif le dossier true/false

var_dump($_POST); //Formulaire
var_dump($_FILES); //Photo

$photo = $_FILES['photo']['name']; //Nom photo
$tmp_file = $_FILES['photo']['tmp_name'];
$type_file = $_FILES['photo']['type'];

if( isset($_POST) ) // si formulaire soumis
{

if( !is_uploaded_file($tmp_file) )
{
$error[] = "Le fichier est introuvable";

}
if( !strstr($type_file, 'jpg') && !strstr($type_file, 'png') && !strstr($type_file, 'bmp') && !strstr($type_file, 'gif'))
{
$error[] = "Le fichier n'est pas une image";
}
}

if(!isset($error))
{
//REQUETE MISE A JOUR DE L'ARTICLE
$queryMiseAJour = $pdo -> prepare ('
UPDATE actualite
SET id_article = ?, titre = ?, contenu = ?, photo = ?
WHERE id_article = ?');
$queryMiseAJour -> execute([$_POST['id_article'], $_POST['titre'], $_POST['contenu'], $photo, $_POST['id_article']]);

//MOVE UPLAOD IMG
move_uploaded_file($_FILES['photo']['tmp_name'], $upload.'/'.$photo);
//Redirect vers l'interface: modif actualite
header('Location: adminActualite.class.php');
}

exit();


EDIT - Merci à tout ceux qui prendront le temps de m'aider ! 

3 réponses


Bonsoir,
Je trouve que l'idée de passer par des input de type hidden assez mauvaise (cf forum OCR)
Je passerais par les sessions

C'est normal que tu ne puisse pas afficher les erreurs car quand tu as des erreurs tu exit donc tu arrête ton processus PHP, donc déjà il faut que tu rediriges sur ton formulaire denouveau et passé ton tableau d'erreur à celui-ci (le plus simple étant d'utiliser les sessions).

PS: Pas tout à fait sur que vérifier que le nom du fichier se termine par l'extension (de plus tu as oublié JPEG) soit hyper sécurisé pour vérifier un type de fichier.

Bonjour.
En plus de ce qui t'a été dit plus haut, je te ferais remarqué que ta condition concernant le type de fichier, n'est pas correcte, tu devrais plutôt faire :

if ($type_file !== 'jpg' || $type_file !== 'png' || $type_file !== 'bmp' || $type_file !== 'gif') {
    $error[] = "Le fichier n'est pas une image";
}

Car ta condition voudrait dire que le fichier correspond a toutes les extensions, ce qui est totalement impossible.

Ou encore mieux :

if (!in_array($type_file, ['jpg', 'png', 'bmp', 'gif'])) {
    $error[] = "Le fichier n'est pas une image";
}