Bonjour,

Voila je rencontre un petit problème avec mon code. l'ajout et la suppression d'une news fonctionne , mais pas l'edition. Quand je passe en mode edition (editer une news) et que je valide, j'ai pas le $message et aucune modificiation dans la table, par contre j'ai bien la redirection header(Loca.....) qui fonctionne.

<?php
  require('includes/condb.inc.php');

$mode_edition = 0;
if(isset($_GET['edit']) AND !empty($_GET['edit'])) {
   $mode_edition = 1;
   $edit_id = htmlspecialchars($_GET['edit']);
   $edit_article = $bdd->prepare('SELECT * FROM news WHERE id = ?');
   $edit_article->execute(array($edit_id));
   if($edit_article->rowCount() == 1) {
      $edit_article = $edit_article->fetch();
   } else {
      die('Erreur : l\'article n\'existe pas...');
   }
}
if(isset($_POST['titre'], $_POST['contenu'])) {
   if(!empty($_POST['titre']) AND !empty($_POST['contenu'])) {

     $titre = htmlspecialchars($_POST['titre']);
      $contenu = htmlspecialchars($_POST['contenu']);
      if($mode_edition == 0) {
         // var_dump($_FILES);
         // var_dump(exif_imagetype($_FILES['miniature']['tmp_name']));
         $ins = $bdd->prepare('INSERT INTO news (titre, contenu, date_time_publication) VALUES (?, ?, NOW())');
         $ins->execute(array($titre, $contenu));
         $lastid = $bdd->lastInsertId();

         if(isset($_FILES['miniature']) AND !empty($_FILES['miniature']['name'])) {
            if(exif_imagetype($_FILES['miniature']['tmp_name']) == 2) {
               $chemin = '../img/news/miniatures/'.$lastid.'.jpg';
               move_uploaded_file($_FILES['miniature']['tmp_name'], $chemin);
            } else {
               $message = 'Votre image doit être au format jpg';
            }
         }
         $message = '<div class="container-fluid">
           <div class="row">
             <section class="bloc-content">
               <p class="anotation">Votre news a bien été posté
               </p>
             </section>
           </div>
         </div>';
      } else {
         $update = $bdd->prepare('UPDATE news SET titre = ?, contenu = ?, date_time_edition = NOW() WHERE id = ?');
         $update->execute(array($titre, $contenu, $edit_id));
         header('Location: redaction.php?id='.$edit_id);
         $message = 'Votre news a bien été mis à jour !';
      }
   } else {
      $message = 'Veuillez remplir tous les champs';
   }
}
?>

<?php require('includes/meta.inc.php');?>

<body>

  <header>

    <!--MENU-->
    <section>
      <?php include ('includes/menu.inc.php') ?>
    </section>
    <!-- END MENU-->
  </header>

 <div class="clear"></div>

<section class="ss-bandeau">
  <h2>Ecrire ou corriger une news</h2>
</section>
<div class="container-fluid">
  <div class="row">
    <section class="bloc-content">

   <form method="POST" enctype="multipart/form-data" action="">
      <div class="form-group">
         <label for="titre-news">Ajouter un titre</label>
         <input class="form-control" id="titre-news" type="text" name="titre" placeholder="Titre"<?php if($mode_edition == 1) { ?> value="<?=
         $edit_article['titre'] ?>"<?php } ?> />
      </div>

      <label for="contenu-news">Ajouter du contenu</label>
      <textarea class="form-control" row="4" name="contenu" id="contenu-news" placeholder="Contenu de la news"><?php if($mode_edition == 1) { ?><?=
      $edit_article['contenu'] ?><?php } ?></textarea>

      <br />

      <?php if($mode_edition == 0) { ?>
      <div class="form-group">
      <label for="fichier-news">Joindre un fichier</label>
      <input type="file" id="fichier-news" name="miniature" class="btn-xs"/>
      </div>
               <?php } ?>

      <button type="submit" class="btn btn-default btn-xs">Publié la news</button>
     </form>
    </section>
  </div>
</div>
<br/>

   <?php if(isset($message)) { echo $message; }?>

<?php include ('includes/footer.inc.php') ?>

Merci de votre aide

36 réponses


Carouge10
Réponse acceptée

oui c'est cela.

Salut,

Il n'y a pas d'attribut action dans le formulaire.

Le code qui est écrit là, il est dans quel fichier ?

Comment ça se fait qu'au millieu du code on voit :

</head>

<body>

Est-ce que tu as écrit tout le code suivant, dans la balise HTML <head> qui sert pour les link, meta... ?

<?php
  require('includes/meta.inc.php');
  require('includes/condb.inc.php');

$mode_edition = 0;
if(isset($_GET['edit']) AND !empty($_GET['edit'])) {
   $mode_edition = 1;
   $edit_id = htmlspecialchars($_GET['edit']);
   $edit_article = $bdd->prepare('SELECT * FROM news WHERE id = ?');
   $edit_article->execute(array($edit_id));
   if($edit_article->rowCount() == 1) {
      $edit_article = $edit_article->fetch();
   } else {
      die('Erreur : l\'article n\'existe pas...');
   }
}
if(isset($_POST['titre'], $_POST['contenu'])) {
   if(!empty($_POST['titre']) AND !empty($_POST['contenu'])) {

     $titre = htmlspecialchars($_POST['titre']);
      $contenu = htmlspecialchars($_POST['contenu']);
      if($mode_edition == 0) {
         // var_dump($_FILES);
         // var_dump(exif_imagetype($_FILES['miniature']['tmp_name']));
         $ins = $bdd->prepare('INSERT INTO news (titre, contenu, date_time_publication) VALUES (?, ?, NOW())');
         $ins->execute(array($titre, $contenu));
         $lastid = $bdd->lastInsertId();

         if(isset($_FILES['miniature']) AND !empty($_FILES['miniature']['name'])) {
            if(exif_imagetype($_FILES['miniature']['tmp_name']) == 2) {
               $chemin = '../img/news/miniatures/'.$lastid.'.jpg';
               move_uploaded_file($_FILES['miniature']['tmp_name'], $chemin);
            } else {
               $message = 'Votre image doit être au format jpg';
            }
         }
         $message = '<div class="container-fluid">
           <div class="row">
             <section class="bloc-content">
               <p class="anotation">Votre news a bien été posté
               </p>
             </section>
           </div>
         </div>';
      } else {
         $update = $bdd->prepare('UPDATE news SET titre = ?, contenu = ?, date_time_edition = NOW() WHERE id = ?');
         $update->execute(array($titre, $contenu, $edit_id));
         header('Location: redaction.php?id='.$edit_id);
         $message = 'Votre news a bien été mis à jour !';
      }
   } else {
      $message = 'Veuillez remplir tous les champs';
   }
}
?>

</head>

Hello. Pour le head c'etait une erreur, pareil pour mon include/meta.inc.php ( qui contient l'ouverture de la balise head)

C'est corriger et editer dans le post plus haut.

Par contre pour revenir au form, concernant "l' action", le code ce trouve sur la page redaction/edition.
Index.php -> Affiche les articles
Redaction.php -> Poster un article ou l editer
News.php-> Affiche la news
Suppr.php-> Supprime l'edition de la page.

Si dans action je redige sur redaction.php ( page qui contient le code donc,) il cree une nouvelle news mais l'édite pas.

Comme dit plus haut. Si tu renseigne pas l'action avec l'id de la news.
Tu ne passeras jamais dans la condition "if(isset($_GET['edit']))"

dans la barre d'url j'ai remarquer ceci "redaction.php?id=%27.$edit_id"

j'ai renseigner le champ action par " form action="redaction.php?id='.$edit_id".

Du coup je me demande si le header('Location....) sert à quelque chose vue que le form action redirige aussi.

Petite précision, mes competences sont limitées. Ce code vient d'un tuto que j'ai appliquer ( d'ailleur avec avec les fichiers source ya ce meme probleme).

Merci encore

Du coup je me demande si le header('Location....) sert à quelque chose vue que le form action redirige aussi.

En fait la différence entre les 2 c'est que,
l'un (action="...") attend que l'utilisateur "clic" sur le bouton du formulaire de type = "submit" pour faire la redirection,
alors que l'autre (header('Loca...) n'attend rien du tout et redirige dès que la ligne est "lu" par le serveur.

Donc en effet tu as raison, le header ne sert pas ici, en fait, il est même en trop, il FAUT NE PAS le mettre.
Il faut enlever le header, et mettre le action.

Et pour remplir le action, regardes bien ce qu'a dit Carouge10

Honnetement je séche même si je pense que la solution est sous mes yeux...depuis 2 jours...

Comme tout les codeurs ;)

Le soucis c'est que moi je suis pas codeur ;) j'ai pas cette prétention ^^ juste un simple gars de l'agriculture en IE qui fait une refonte de son site web sans trop sortir de la tréso ;).

La ca fait 2 jours que je suis dessus, je me retape des heures de vidéo youtube des tuto sur openclass etc... mais c'est du temps que je ne peut pas trop investir car j'ai mon activité principale qui prend du retard derriere .

Apres je cherche quand meme les solutions par moi meme mais la quand je poste c'est que vraiment j'ai pas la connaissance surtout dans le php/mysql.

salut
je te donne le code que j'ai fait avec l'aide SLK et Carouge10 avec un peu de recherche de ma part :

if (!isset($error)) {
        $req = $bdd->prepare("UPDATE products SET name = :name, description = :description, sex = :sex, priceJ = :priceJ, priceA = :priceA, image = :userPic  WHERE id = :id LIMIT 1");
        $req->bindValue(':id', $_POST['numcontact'], PDO::PARAM_INT);
        $req->bindValue(':name', $_POST['name'], PDO::PARAM_STR);
        $req->bindValue(':description', $_POST['description'], PDO::PARAM_STR);
        $req->bindValue(':sex', $_POST['sex'], PDO::PARAM_STR);
        $req->bindValue(':priceJ', $_POST['priceJ'], PDO::PARAM_STR);
        $req->bindValue(':priceA', $_POST['priceA'], PDO::PARAM_STR);
        $req->bindValue(':userPic', $_FILES['image']['name'], PDO::PARAM_STR);

        $inserOk = $req->execute();

        if ($inserOk) {
            $success = 'Modification de la base de données effectuée';

    }else{
            $error = 'Désolé echec de la modification';
    }
}

si ça peut aider.

Je vais t'aider un peux.
Il faut passer en paramettre l'id de ton article à modifier avant qu'il passe en mode édition

<form method="POST" enctype="multipart/form-data" action="?edit=<?= $post_id; ?>">

Je te laisse remplacer "$post_id" par la variable contenant l'id du post à éditer.

la variable ce trouve dans la page? car j'ai penser a edit__id mais elle ne fonctionne pas.

oui puisqu'elle vous à permis de remplir les champs du formulaire

On progresse ^^ "redaction.php?edit=<?= $mode_edition; ?>" m'affiche maintenant " $message = 'Votre news a bien été mis à jour !';

donc je suis bien rentrer dans la condition " else " ? J'ai envie de vous dire autre chose mais j'ai honte que vous me preniez pour un gros noob....ce que je suis fatalement ;)

Ah non, mode_edition, définie si tu édites ou non ton post.
Il nous faut id du post qu'on edite.

Oui je me doutais bien, mais lastid ou edit_id ne fonctionne pas.

ps: madame me dit " il devrait arreter de jouer a Pére Fouras avec toi"
Moi j'aime bien comme ca j'apprend des choses, de quoi elle ce mele ^^.

Merci a toi du temp que tu m'accorde en tout cas.

Et oui, je n'aime pas donner la réponse de suite. Sinon, on apprend rien.

Alors oui, on ne peux avoir $edit_id puisque qu'on ne passe pas dans la 1ère condition.
Par contre, tu récupère tes données depuis la BDD ($edit_article)..... il n'y aurais pas l'id du post dans ce tableau ?

c'est la premiere que j'ai essayer ;(
redaction.php?edit=<?= $edit_article; ?>

undefinied variable et si je post quand meme j'ai Erreur : l'article n'existe pas... car je pense que nous somme en mode_edition 1 si j'ai ce messange ;'(

en effet.
mais edit_article est un tableau.

On va reprendre au début.
Quelle est ton url quand tu arrives la 1ère fois sur cette page ?

../admin/redaction.php

ce que je ne comprends, c'est qu'avec cette url, tu n'as pas l'ID de la news à editer. Donc comment récupères-tu l'ID ?

<?php
require('includes/condb.inc.php');
$news = $bdd->query('SELECT * FROM news ORDER BY date_time_publication DESC');

require('includes/meta.inc.php'); ?>

<body>

<!--MENU-->
<section>
  <?php include ('includes/menu.inc.php') ?>
</section>
<!-- END MENU-->

</header>

<div class="clear"></div>

<section class="bandeau bandeau-sm m0">
<h1>Gestion des news</h1>
</section>

  <?php while($n = $news->fetch()) { ?>
    <section class="ss-bandeau ss-bandeau-md m0">
      <a href="news.php?id=<?= $n['id'] ?>">
        <h2><?= $n['titre'] ?></h2>
        <div class="container-fluid">
          <div class="row">
            <section class="bloc-content">
              <p class="date_time_publication t-center">Publié le : <?= ''.date("j/n/Y G:i",strtotime($n["date_time_publication"])).'';?>
              </p>
            </section>
          </div>
        </div>
      </a>
    </section>
      <img class="img-responsive" src="../img/news/miniatures/<?= $n['id'] ?>.jpg"/>

      <div class="container-fluid">
        <div class="row">
          <section class="bloc-content">
            <p>
            <a class="btn btn-default btn-xs" href="redaction.php?edit=<?= $n['id'] ?>">Modifier</a> |
            <a class="btn btn-default btn-xs" href="suppr.php?id=<?= $n['id'] ?>">Supprimer</a>
            </p>
          </section>
        </div>
      </div>

  <?php } ?>

  <?php include ('includes/footer.inc.php') ?>

<?php
require('includes/condb.inc.php');
$news = $bdd->query('SELECT * FROM news ORDER BY date_time_publication DESC');

require('includes/meta.inc.php'); ?>

<body>

<!--MENU-->
<section>
  <?php include ('includes/menu.inc.php') ?>
</section>
<!-- END MENU-->

</header>

<div class="clear"></div>

<section class="bandeau bandeau-sm m0">
<h1>Gestion des news</h1>
</section>

  <?php while($n = $news->fetch()) { ?>
    <section class="ss-bandeau ss-bandeau-md m0">
      <a href="news.php?id=<?= $n['id'] ?>">
        <h2><?= $n['titre'] ?></h2>
        <div class="container-fluid">
          <div class="row">
            <section class="bloc-content">
              <p class="date_time_publication t-center">Publié le : <?= ''.date("j/n/Y G:i",strtotime($n["date_time_publication"])).'';?>
              </p>
            </section>
          </div>
        </div>
      </a>
    </section>
      <img class="img-responsive" src="../img/news/miniatures/<?= $n['id'] ?>.jpg"/>

      <div class="container-fluid">
        <div class="row">
          <section class="bloc-content">
            <p>
            <a class="btn btn-default btn-xs" href="redaction.php?edit=<?= $n['id'] ?>">Modifier</a> |
            <a class="btn btn-default btn-xs" href="suppr.php?id=<?= $n['id'] ?>">Supprimer</a>
            </p>
          </section>
        </div>
      </div>

  <?php } ?>

  <?php include ('includes/footer.inc.php') ?>

Sinon je pense qu'on récupere l'id avec le $_GET[id]

D'accord, je comprends mieux.
Dans le formulaire, il te faut passer l'id de la news. Tu as 2 possibilité :
1/ en la rentrant dans "action" comme je l'avais dit.
2/ en la rentrant dans un champ input de type hidden.

  <input name="id" type="hidden" value="<?=$edit_id['id'] ?>"/>

Variable non définie...j'ai des fois envie de tout delete et tout recommencer mais deja 3 fois que je recommence.

je verrai plutôt $_GET[id'] et comme nom de champ "edit"

     <input name="edit" type="hidden" value="<?=$_GET['id'] ?>"/>

Notice: Undefined index: id

Cela apparait lorsque tu valides le formulaire ?

Non, quand je fait "editer la news" ou que j'en ecrit une nouvelle.

Autant pour moi.

 <a class="btn btn-default btn-xs" href="redaction.php?edit=<?= $n['id'] ?>">Modifier</a> |

Donc l'id arrive en GET avec la variable $_GET['edit'] et non $_GET['id']

donc d'apres toi sur la page redaction.php

 <input name="edit" type="hidden" value="<?=$_GET['edit'] ?>"/>

et sur la page index.php

 <a class="btn btn-default btn-xs" href="redaction.php?edit=<?= $n['id'] ?>">Modifier</a> |

malheureusement ;'(
Undefined index: edit

apres avoir cliquer sur "publié". par contre il la post en nouvelle news mais pas en edition.

Toujours pas de solution ...

Trouvé la solution....il manquer une table dans la DB ( date_time_edition ).

donc résolu !