Formulaire avec données modifiables

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

18 mars 2011, 01:02

Bonjour, ton problème est simple. Voici comment l'aborder simplement (sans devoir utiliser PDO pour l'instant)

Le formulaire va jouer en fait deux rôles : l'ajout d'une nouvelle News ou bien la modification d'une News existante que l'on sélectionne dans la table des titres affichée.

Voici ta page essai.php qui affiche les News existants. Je l'appelle : afficherNews.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
   <head>
       <title>Afficher News</title>
       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <link rel="stylesheet" media="screen" type="text/css" title="tab" href="tab.css" />
   </head>
   <?php
//========connection==========
 $Flag1=mysql_connect("localhost","root","");
 $Flag2=mysql_select_db("test");
//==========selection=========
 $result=mysql_query( "select * from news Order By date_news DESC ");
 ?>

<html>
<body>
<table>
   <?php
      while ($result && $row=mysql_fetch_array($result))
         {
          $id = $row['id'];
          $titre= stripslashes($row['titre']);
          //titre affiché  avec lien pour faciliter la gestion de cette News (le lien appelle la page: gererNews.php et lui passe l'action MettreAjour et l'id)
          echo "<tr><td><a href=\"gererNews.php?action=MettreAjour&id=". $id . "\" title=\"Cliquez pour modifier\">" . $titre . "</a></td></tr> ";
         }
mysql_close($Flag1);
?>
</table>
<br>
<br>
<A HREF="index.html">retour</A> <br>
</body>
</html>
Sur chaque titre le lien hypertexte, une fois cliqué, renvoie vers la page gererNews.php et lui passe 2 paramètres : action=MettreAjour et id=l'id de la News à modifier. Cette page doit donc afficher les données de la News indiquée par l'id dans les zones de saisie du formulaire pour permettre leur modification.
Mais on a dit que ce formulaire "gererNews.php" doit jouer aussi le rôle d'ajout d'une nouvelle News. Pour réaliser ce double rôle on va donc remplir les zones de saisie en cas de modification et les laisser vides en cas d'ajout. En ajoutant 2 boutons submit : Modifier et Ajouter, le formulaire peut envoyer à chaque fois une de ces actions pour permettre au programme de savoir s'il doit exécuter une requête d'ajout (INSERT) ou de modification (UPDATE).

Voici une proposition de cette conception de la page : gererNews.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Gérer News</title>
<style type="text/css">
<!--
body,td,th {
        color: #000;
}
body {
        background-color: #9CF;
}
-->
</style></head>

<body>
<?php
//Détection des paramètres GET ou POST
if (isset ($_GET['action'])) 	$action = $_GET['action']; //si action envoyée par l'url via un appel externe
if (isset ($_POST['action'])) 	$action = $_POST['action']; //si action envoyée par le formulaire (prioritaire)
if (isset ($_GET['id'])) 		$id = $_GET['id']; //si id envoyé par l'url via un appel externe
if (isset ($_POST['id'])) 		$id = $_POST['id']; //si id envoyé par le formulaire (prioritaire)

//Détecter s'il s'agit d'un appel interne de modification d'une News modifiée par le formulaire (POST)
if (isset ($action) && isset ($id) && $action=='Modifier'){ 
          // Modifier les données de la News dans la base
         //========connection==========
         $Flag1=mysql_connect("localhost","root","");
         $Flag2=mysql_select_db("test");
         //==========UPdate_news=========
         $titre= addslashes($_POST['titre']);
         $texte = addslashes($_POST['texte']);
         $date_news = $_POST['date_news'];
		 
         if (mysql_query( 'UPdate news SET titre="'. $titre . '", texte ="'. $texte . '", date_news="'. $date_news . '"  WHERE id=' . $id ))
         {
              echo 'Modification effectuée';
         }
         else  { echo 'Modification non effectuée'; }
         mysql_close($Flag1);
}
//Détecter s'il s'agit d'un appel interne d'ajout d'une nouvelle News envoyé par le formulaire (POST)
if (isset ($action) && $action=='Ajouter'){ 
          // Ajouter les données de la News dans la base
         //========connection==========
         $Flag1=mysql_connect("localhost","root","");
         $Flag2=mysql_select_db("test");
         //==========INSERT=========  
         // id auto-incrémenté
         $titre= addslashes($_POST['titre']);
         $texte = addslashes($_POST['texte']);
         $date_news = $_POST['date_news'];
		 
         if (mysql_query( 'INSERT INTO news (titre, texte, date_news)  VALUES ("'. $titre . '", "'. $texte . '", "'. $date_news . '")' )) 
         {
              echo 'Ajout effectué';
         }
         else  { echo 'Ajout non effectué'; }
         mysql_close($Flag1); 
}
//Détecter s'il s'agit d'un appel interne de suppression d'une News existante envoyé par le formulaire (POST)
if (isset ($action) && isset ($id) && $action=='Supprimer'){ 
          // Supprimer la News dans la base
         //========connection==========
         $Flag1=mysql_connect("localhost","root","");
         $Flag2=mysql_select_db("test");
         //==========DELETE=========
         $titre= addslashes($_POST['titre']);
         $texte = addslashes($_POST['texte']);
         $date_news = $_POST['date_news'];
		 
         if (mysql_query( 'DELETE FROM news WHERE id='. $id ))
         {
              echo 'Suppression effectuée';
         }
         else  { echo 'Suppression non effectuée'; }
         mysql_close($Flag1);
}
//Détecter s'il s'agit d'un appel externe (URL: GET) de modification d'une New (dans ce cas on reçoit une action=MettreAjour et un id d'une News)
if (isset ($action) && isset ($id) && $action=='MettreAjour'){ 
          // trouver les données de la News à  mettre à  jour
         //========connection==========
         $Flag1=mysql_connect("localhost","root","");
         $Flag2=mysql_select_db("test");
         //==========selection=========
         $result=mysql_query( 'SELECT * FROM news WHERE id=' . $id );
         if ($result && $row=mysql_fetch_array($result))
         {
             $id = $row['id'];
             $titre= stripslashes($row['titre']);
             $texte = stripslashes($row['texte']);
             $date_news = $row['date_news'];
         }
		 else { echo 'Le titre que vous cherchez n\'existe pas';  exit(); } //Sortie
         mysql_close($Flag1);
}
?>
<form method="post" enctype="multipart/form-data">
  <p>Titre : <br /><input type="text" name="titre" <?php if (isset($titre)) echo 'value="'.htmlspecialchars(stripslashes($titre)).'"'; ?> /></p>
  <p>date : <br /><input type="text" name="date_news" <?php if (isset($date_news)) echo 'value="'. ($date_news).'"'; ?> /></p>
  <p>Texte : <br /><textarea name="texte"><?php if (isset($texte)) echo htmlspecialchars(stripslashes($texte)); ?></textarea></p>
   <?php
         // afficher l'id caché pour les cas de modification et suppression
        if (isset ($id)) {
             echo '<input type="hidden" name="id" value="' . $id . '" />';
        }
    ?>
    <input name="action" type="submit" value="Ajouter" />
    <input name="action" type="submit" value="Modifier" />
    <input name="action" type="submit" value="Supprimer" />
    <input type="button" value="Afficher News" onclick="window.location.href='afficherNews.php'" />
</form>
</body>
</html>
Voilà, donc en tout on a 2 pages : gererNews.php et afficherNews.php

A+
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 18 Messages

18 mars 2011, 20:48

Bonsoir.
et merci à toi Sadeq, effectivement sans utiliser PDO, vu mon niveau de super-débutant..ça me parait plus simple.!!!!
Toutefois un grand, très très grand merci à Moogli pour son aide et ses conseils..(grace à lui j'ai pigé le passage de l'id dans l'url)
Donc la soultion que tu me propose fonctionne très bien, et donc je me suis empressé de la modifier en essayant de rajouter des fonctionnalités au formulaire "gererNews.php"...(car mon projet final devrait comporter environ 300 champs de différentes natures)
J'ai donc rajouté un champ "Jours" à ma table news, que je souhaite alimenter avec une zone de liste "lundi, mardi, mercredi...etc)
voiçi le code modifié, qui fonctionne..à peu près...c'est à dire que
-l'ajout par acces direct à "gererNews.php" fonctionne
-la modification en passant par "afficherNews.php" fonctionne aussi.
Par contre, ce que je n'arrive pas à faire c'est le remplissage de la liste déroulante pour modification, à l'ouverture de la page, après séléction dans "afficherNews.php" la liste déroulante n'affiche rien...comment faire?
<?php
//Détection des paramètres GET ou POST
if (isset ($_GET['action']))    $action = $_GET['action']; //si action envoyée par l'url via un appel externe
if (isset ($_POST['action']))   $action = $_POST['action']; //si action envoyée par le formulaire (prioritaire)
if (isset ($_GET['id']))                $id = $_GET['id']; //si id envoyé par l'url via un appel externe
if (isset ($_POST['id']))               $id = $_POST['id']; //si id envoyé par le formulaire (prioritaire)

//Détecter s'il s'agit d'un appel interne de modification d'une News modifiée par le formulaire (POST)
if (isset ($action) && isset ($id) && $action=='Modifier'){ 
          // Modifier les données de la News dans la base
         //========connection==========
         $Flag1=mysql_connect("localhost","root","");
         $Flag2=mysql_select_db("test");
         //==========UPdate_news=========
         $titre= addslashes($_POST['titre']);
		 $date = $_POST['date'];
         $texte = addslashes($_POST['texte']);
         $Jour = $_POST['day'];
                 
         if (mysql_query( 'UPdate news SET titre="'. $titre . '", date ="'. $date . '", text="'. $texte . '", Jours="'. $Jour . '"  WHERE id=' . $id ))
         {
              echo 'Modification effectuée';
         }
         else  { echo 'Modification non effectuée'; }
         mysql_close($Flag1);
}
//Détecter s'il s'agit d'un appel interne d'ajout d'une nouvelle News envoyé par le formulaire (POST)
if (isset ($action) && $action=='Ajouter'){ 
          // Ajouter les données de la News dans la base
         //========connection==========
         $Flag1=mysql_connect("localhost","root","");
         $Flag2=mysql_select_db("test");
         //==========INSERT=========  
         // id auto-incrémenté
         $titre= addslashes($_POST['titre']);
		 $date= $_POST['date'];
         $texte = addslashes($_POST['texte']);
         $jour = $_POST['day'];
                 
         if (mysql_query( 'INSERT INTO news (titre, date, text, jours)  VALUES ("'. $titre . '", "'. $date . '", "'. $texte . '","'. $jour . '")' )) 
         {
              echo 'Ajout effectué';
         }
         else  { echo 'Ajout non effectué'; }
         mysql_close($Flag1); 
}
//Détecter s'il s'agit d'un appel interne de suppression d'une News existante envoyé par le formulaire (POST)
if (isset ($action) && isset ($id) && $action=='Supprimer'){ 
          // Supprimer la News dans la base
         //========connection==========
         $Flag1=mysql_connect("localhost","root","");
         $Flag2=mysql_select_db("test");
         //==========DELETE=========
         $titre= addslashes($_POST['titre']);
		 $date = $_POST['date'];
         $texte = addslashes($_POST['texte']);
		 $jour= $row['day'];
                 
         if (mysql_query( 'DELETE FROM news WHERE id='. $id ))
         {
              echo 'Suppression effectuée';
         }
         else  { echo 'Suppression non effectuée'; }
         mysql_close($Flag1);
}
//Détecter s'il s'agit d'un appel externe (URL: GET) de modification d'une New (dans ce cas on reçoit une action=MettreAjour et un id d'une News)
if (isset ($action) && isset ($id) && $action=='MettreAjour'){ 
          // trouver les données de la News à  mettre à  jour
         //========connection==========
         $Flag1=mysql_connect("localhost","root","");
         $Flag2=mysql_select_db("test");
         //==========selection=========
         $result=mysql_query( 'SELECT * FROM news WHERE id=' . $id );
         if ($result && $row=mysql_fetch_array($result))
         {
             $id = $row['id'];
             $titre= stripslashes($row['titre']);
             $date = stripslashes($row['date']);
             $texte= $row['text'];
			 $jour= $row['Jours'];
         }
                 else { echo 'Le titre que vous cherchez n\'existe pas';  exit(); } //Sortie
         mysql_close($Flag1);
}
?>
<form method="post" enctype="multipart/form-data">
  <p>Titre : <br /><input type="text" name="titre" <?php if (isset($titre)) echo 'value="'.htmlspecialchars(stripslashes($titre)).'"'; ?> /></p>
  <p>date : <br /><input type="text" name="date" <?php if (isset($date)) echo 'value="'. ($date).'"'; ?> /></p>
  <p>Texte : <br /><textarea name="texte"><?php if (isset($texte)) echo htmlspecialchars(stripslashes($texte)); ?></textarea></p>
  
  <select name="day">
    <option value="">Entrez le jour</option> 
    <option value="1">Lundi</option> 
    <option value="2">Mardi</option>
    <option value="3">Mercredi</option>
  </select>
<p></p>
  
  
  
  
   <?php
         // afficher l'id caché pour les cas de modification et suppression
        if (isset ($id)) {
             echo '<input type="hidden" name="id" value="' . $id . '" />';
        }
    ?>
    <input name="action" type="submit" value="Ajouter" />
    <input name="action" type="submit" value="Modifier" />
    <input name="action" type="submit" value="Supprimer" />
    <input type="button" value="Afficher News" onclick="window.location.href='afficherNews.php'" />
</form>
</body>
</html>
encore une question,
est-il possible de "désactiver" la fonction "ajout" lorsqu'on sélectionne un enregistrement dans la liste, pour modification.
et inversement, "désactiver" la fonction "modifier" lorsque l'on accède directement à la page "gererNews.php"
Encore merci pour ton aide.
l'intelligence est le seul outil qui permet à l'Homme de mesurer l'imensité de son malheur.(P.Desproges)
C'est en sciant que Léonard devint scie...

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

20 mars 2011, 17:46

Bonjour,

Dans ta base de données, le nouveau champ pour le jour est nommé "jours" alors que dans la liste déroulante html il est nommé "day" ainsi que dans le code php de la modification, ajout et suppression tu l'as nommé "day". Tu dois lui donner le même nom soit "jours" soit "day".

Autre chose, il y a une erreur de copie/coller dans ton code concernant ce même champ : Il ne faut utiliser $row["jours"] que dans le cas provenant de la liste d'affichage car on fait une requête SQL SELECT qui donne $row, dans les autres cas de l'ajout, l'update et le delete, les champs proviennent de $_POST donc on utilise plutôt : $_POST["jours"].

Pour la seconde question, pour afficher les boutons selon le contexte de traitement adéquat, il faut tester avant l'affichage des boutons comme on a testé dans le code PHP pour détecter les actions. Par exemple, si l'action est "MettreAjour" alors on affiche simplement les boutons "Modifier" et "Supprimer" sinon on affiche le bouton "Ajouter". etc... réfléchie bien à tous les cas possible c'est jouable avec ce qu'on a.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 18 Messages

21 mars 2011, 08:15

Bonjour et merci,
j'ai bien corrigé les 2 premiers points que tu m'a relevé, concernant le nom day --> jours
et la modification $_POST / $row
j'ai essayé de rajouter un code d'affichage de la Liste ( <select name="jours">)...en m'inspirant de tu code pour les zones de texte...
Mais cela ne marche pas..
Pour l'affichage des boutons..je verrais après..mais effectivement le code est à placer dans la zone de test correspondante.
Encore merci pour ton aide.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Gérer News</title>
<style type="text/css">
<!--
body,td,th {
        color: #000;
}
body {
        background-color: #9CF;
}
-->
</style></head>

<body>
<?php
//Détection des paramètres GET ou POST
if (isset ($_GET['action']))    $action = $_GET['action']; //si action envoyée par l'url via un appel externe
if (isset ($_POST['action']))   $action = $_POST['action']; //si action envoyée par le formulaire (prioritaire)
if (isset ($_GET['id']))                $id = $_GET['id']; //si id envoyé par l'url via un appel externe
if (isset ($_POST['id']))               $id = $_POST['id']; //si id envoyé par le formulaire (prioritaire)

//Détecter s'il s'agit d'un appel interne de modification d'une News modifiée par le formulaire (POST)
if (isset ($action) && isset ($id) && $action=='Modifier'){ 
          // Modifier les données de la News dans la base
         //========connection==========
         $Flag1=mysql_connect("localhost","root","");
         $Flag2=mysql_select_db("test");
         //==========UPdate_news=========
         $titre= addslashes($_POST['titre']);
		 $date = $_POST['date'];
         $texte = addslashes($_POST['texte']);
         $jours= $_POST['jours'];
                 
         if (mysql_query( 'UPdate news SET titre="'. $titre . '", date ="'. $date . '", text="'. $texte . '", jours="'. $jours . '"  WHERE id=' . $id ))
         {
              echo 'Modification effectuée';
         }
         else  { echo 'Modification non effectuée'; }
         mysql_close($Flag1);
}
//Détecter s'il s'agit d'un appel interne d'ajout d'une nouvelle News envoyé par le formulaire (POST)
if (isset ($action) && $action=='Ajouter'){ 
          // Ajouter les données de la News dans la base
         //========connection==========
         $Flag1=mysql_connect("localhost","root","");
         $Flag2=mysql_select_db("test");
         //==========INSERT=========  
         // id auto-incrémenté
         $titre= addslashes($_POST['titre']);
		 $date= $_POST['date'];
         $texte = addslashes($_POST['texte']);
         $jours = $_POST['jours'];
                 
         if (mysql_query( 'INSERT INTO news (titre, date, text, jours)  VALUES ("'. $titre . '", "'. $date . '", "'. $texte . '","'. $jours . '")' )) 
         {
              echo 'Ajout effectué';
         }
         else  { echo 'Ajout non effectué'; }
         mysql_close($Flag1); 
}
//Détecter s'il s'agit d'un appel interne de suppression d'une News existante envoyé par le formulaire (POST)
if (isset ($action) && isset ($id) && $action=='Supprimer'){ 
          // Supprimer la News dans la base
         //========connection==========
         $Flag1=mysql_connect("localhost","root","");
         $Flag2=mysql_select_db("test");
         //==========DELETE=========
         $titre= addslashes($_POST['titre']);
		 $date = $_POST['date'];
         $texte = addslashes($_POST['texte']);
		 $jours= $_Post['jours'];
                 
         if (mysql_query( 'DELETE FROM news WHERE id='. $id ))
         {
              echo 'Suppression effectuée';
         }
         else  { echo 'Suppression non effectuée'; }
         mysql_close($Flag1);
}
//Détecter s'il s'agit d'un appel externe (URL: GET) de modification d'une New (dans ce cas on reçoit une action=MettreAjour et un id d'une News)
if (isset ($action) && isset ($id) && $action=='MettreAjour'){ 
          // trouver les données de la News à  mettre à  jour
         //========connection==========
         $Flag1=mysql_connect("localhost","root","");
         $Flag2=mysql_select_db("test");
         //==========selection=========
         $result=mysql_query( 'SELECT * FROM news WHERE id=' . $id );
         if ($result && $row=mysql_fetch_array($result))
         {
             $id = $row['id'];
             $titre= stripslashes($row['titre']);
             $date = stripslashes($row['date']);
             $texte= $row['text'];
			 $jours= $row['Jours'];
         }
                 else { echo 'Le titre que vous cherchez n\'existe pas';  exit(); } //Sortie
         mysql_close($Flag1);
}
?>
<form method="post" enctype="multipart/form-data">
  <p>Titre : <br /><input type="text" name="titre" <?php if (isset($titre)) echo 'value="'.htmlspecialchars(stripslashes($titre)).'"'; ?> /></p>
  <p>date : <br /><input type="text" name="date" <?php if (isset($date)) echo 'value="'. ($date).'"'; ?> /></p>
  <p>Texte : <br /><textarea name="texte"><?php if (isset($texte)) echo htmlspecialchars(stripslashes($texte)); ?></textarea></p>
 
  <select name="jours">
    <?php // if (isset($jours)) echo htmlspecialchars(stripslashes($jours)); ?>
	<?php if (isset($jours)) echo 'value="'. ($jours).'"'; ?>
    <option value="">Entrez le jour</option> 
    <option value="1">Lundi</option> 
    <option value="2">Mardi</option>
    <option value="3">Mercredi</option>
  </select>

 
  
   <?php
         // afficher l'id caché pour les cas de modification et suppression
        if (isset ($id)) {
             echo '<input type="hidden" name="id" value="' . $id . '" />';
        }
    ?>
    <input name="action" type="submit" value="Ajouter" />
    <input name="action" type="submit" value="Modifier" />
    <input name="action" type="submit" value="Supprimer" />
    <input type="button" value="Afficher News" onclick="window.location.href='afficherNews.php'" />
</form>
</body>
</html>
l'intelligence est le seul outil qui permet à l'Homme de mesurer l'imensité de son malheur.(P.Desproges)
C'est en sciant que Léonard devint scie...

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

21 mars 2011, 10:57

Bonjour,

Tu as encore des p'tites erreurs de frappe dans ton code comme $_Post au lieu de $_POST, $row["Jours"] (j majuscule) au lieu de $row["jours"] (j minuscule) ainsi que dans l'impression de "value" dans le "select" de la liste. é oui mon ami, on ne peut pas y échapper :wink:
Voici une simplification du code pour éviter les redondances de code qui favorisent les erreurs de frappe et de copie/coller qu'on a l'habitude de faire dans les cas de modification et de mise à jour d'un programme.

On peut effectivement mettre un seul bloc d'affectation des variables : titre, text, date, jours, ... au début du programme en évitant de les répéter à chaque traitement d'ajout, modif et suppression. Voici comment.
Tu remarques qu'avant d'affecter un champ provenant de $_GET ou $_POST on avait testé son existence avec isset() comme ça:
if (isset ($_POST['action']))    $action = $_POST['action'];
On fera donc de même pour toutes les données utiles.

Un autre problème posé est la sélection du jour automatiquement dans la liste à partir de la valeur du jour sélectionné à la fois suite à une demande de modification et après postage des valeurs et ré-affichage du formulaire. Voici une solution basée sur javascript:
 <?php
       //sélection automatique de l'option correspondant au jours posté (rappel de valeur) 
       if (isset($jours)) 
  	 echo '<script> document.getElementById("jours").options('.$jours.').selected="selected"; </script>';
  ?>
J'explique le script JavaScript utilisé abstraction faite du php qui l'imprime:
document.getElementById("jours").options(X).selected="selected";

La méthode document.getElementById permet d'accéder à la liste déroulante par son id (c'est pour cela on a ajouter l'attribut id="jours" dans la balise SELECT). La collection .options de l'objet Select permet d'accéder aux lignes de la liste qui sont indexées par valeur, où le X correspond en fait à la valeur du jour qu'on cherche à sélectionner et se trouve dans la variable PHP $jours. La propriété .selected permet de sélectionner une option (ligne) de la liste, c'est pour ça qu'on lui affecte ici la valeur réservée "selected".

Voici le correctif alors:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Gérer News</title>
<style type="text/css">
<!--
body,td,th {
        color: #000;
}
body {
        background-color: #9CF;
}
-->
</style></head>

<body>
<?php
//Détection des paramètres GET ou POST
if (isset ($_GET['action']))    $action = $_GET['action']; //si action envoyée par l'url via un appel externe
if (isset ($_POST['action']))   $action = $_POST['action']; //si action envoyée par le formulaire (prioritaire)
if (isset ($_GET['id']))                $id = $_GET['id']; //si id envoyé par l'url via un appel externe
if (isset ($_POST['id']))               $id = $_POST['id']; //si id envoyé par le formulaire (prioritaire)
if (isset ($_POST['titre']))  $titre= addslashes($_POST['titre']);
if (isset ($_POST['texte']))  $texte = addslashes($_POST['texte']);
if (isset ($_POST['date']))  $date = $_POST['date'];
if (isset ($_POST['jours']))  $jours= $_POST['jours'];

//Détecter s'il s'agit d'un appel interne de modification d'une News modifiée par le formulaire (POST)
if (isset ($action) && isset ($id) && $action=='Modifier'){
          // Modifier les données de la News dans la base
         //========connection==========
         $Flag1=mysql_connect("localhost","root","");
         $Flag2=mysql_select_db("test");
         //==========UPdate_news=========          
         if (mysql_query( 'UPdate news SET titre="'. $titre . '", date ="'. $date . '", text="'. $texte . '", jours="'. $jours . '"  WHERE id=' . $id ))
         {
              echo 'Modification effectuée';
         }
         else  { echo 'Modification non effectuée'; }
         mysql_close($Flag1);
}
//Détecter s'il s'agit d'un appel interne d'ajout d'une nouvelle News envoyé par le formulaire (POST)
if (isset ($action) && $action=='Ajouter'){
          // Ajouter les données de la News dans la base
         //========connection==========
         $Flag1=mysql_connect("localhost","root","");
         $Flag2=mysql_select_db("test");
         //==========INSERT=========  
         // id auto-incrémenté
         if (mysql_query( 'INSERT INTO news (titre, date, text, jours)  VALUES ("'. $titre . '", "'. $date . '", "'. $texte . '","'. $jours . '")' ))
         {
              echo 'Ajout effectué';
         }
         else  { echo 'Ajout non effectué'; }
         mysql_close($Flag1);
}
//Détecter s'il s'agit d'un appel interne de suppression d'une News existante envoyé par le formulaire (POST)
if (isset ($action) && isset ($id) && $action=='Supprimer'){
          // Supprimer la News dans la base
         //========connection==========
         $Flag1=mysql_connect("localhost","root","");
         $Flag2=mysql_select_db("test");
         //==========DELETE=========
         if (mysql_query( 'DELETE FROM news WHERE id='. $id ))
         {
              echo 'Suppression effectuée';
         }
         else  { echo 'Suppression non effectuée'; }
         mysql_close($Flag1);
}
//Détecter s'il s'agit d'un appel externe (URL: GET) de modification d'une New (dans ce cas on reçoit une action=MettreAjour et un id d'une News)
if (isset ($action) && isset ($id) && $action=='MettreAjour'){
          // trouver les données de la News à  mettre à  jour
         //========connection==========
         $Flag1=mysql_connect("localhost","root","");
         $Flag2=mysql_select_db("test");
         //==========selection=========
         $result=mysql_query( 'SELECT * FROM news WHERE id=' . $id );
         if ($result && $row=mysql_fetch_array($result))
         {
             $id = $row['id'];
             $titre= stripslashes($row['titre']);
             $date = stripslashes($row['date']);
             $texte= $row['text'];
             $jours= $row['jours'];
         }
                 else { echo 'Le titre que vous cherchez n\'existe pas';  exit(); } //Sortie
         mysql_close($Flag1);
}
?>
<form method="post" enctype="multipart/form-data">
  <p>Titre : <br /><input type="text" name="titre" <?php if (isset($titre)) echo ' value="'.htmlspecialchars(stripslashes($titre)).'"'; ?> /></p>
  <p>date : <br /><input type="text" name="date" <?php if (isset($date)) echo ' value="'. ($date).'"'; ?> /></p>
  <p>Texte : <br /><textarea name="texte"><?php if (isset($texte)) echo htmlspecialchars(stripslashes($texte)); ?></textarea></p>
 
  <select id="jours" name="jours"  <?php if (isset($jours)) echo ' value="'. ($jours).'"'; ?> >
    <option value="">Entrez le jour</option>
    <option value="1">Lundi</option>
    <option value="2">Mardi</option>
    <option value="3">Mercredi</option>
  </select>
  <?php
       //sélection automatique de l'option correspondant au jours posté (rappel de valeur) 
       if (isset($jours)) 
  	 echo '<script> document.getElementById("jours").options('.$jours.').selected="selected"; </script>';
  ?>
   <?php
         // afficher l'id caché pour les cas de modification et suppression
        if (isset ($id)) {
             echo '<input type="hidden" name="id" value="' . $id . '" />';
        }
    ?>
    <input name="action" type="submit" value="Ajouter" />
    <input name="action" type="submit" value="Modifier" />
    <input name="action" type="submit" value="Supprimer" />
    <input type="button" value="Afficher News" onclick="window.location.href='afficherNews.php'" />
</form>
</body>
</html>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 18 Messages

21 mars 2011, 21:54

Bonsoir .
Arghh..ces maudites majuscules/minuscules...!!! :evil:
Mais malgré tout je commence à comprendre de + en + de choses. tes explications sont importantes.
maintenant que la zone de liste marche, j'ai essayé de rajouter des boutons d'option Oui/Non dans le formulaire, après avoir créé un champ "rep" de type booléan dans ma table "news".
j'ai le même problème que précédement...pour le réaffichage en cas de modif. l'ajout lui se fait bien.
j'ai pourtant bien essayé de ré-utiliser la partie JavaScript qui fonctionne pour la liste.
mais cela vient surement de la nature de la variable..?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Gérer News</title>
<style type="text/css">
<!--
body,td,th {
        color: #000;
}
body {
        background-color: #9CF;
}
-->
</style></head>

<body>
<?php
//Détection des paramètres GET ou POST
if (isset ($_GET['action']))    $action = $_GET['action']; //si action envoyée par l'url via un appel externe
if (isset ($_POST['action']))   $action = $_POST['action']; //si action envoyée par le formulaire (prioritaire)
if (isset ($_GET['id']))                $id = $_GET['id']; //si id envoyé par l'url via un appel externe
if (isset ($_POST['id']))               $id = $_POST['id']; //si id envoyé par le formulaire (prioritaire)
if (isset ($_POST['titre']))  $titre= addslashes($_POST['titre']);
if (isset ($_POST['texte']))  $texte = addslashes($_POST['texte']);
if (isset ($_POST['date']))  $date = $_POST['date'];
if (isset ($_POST['jours']))  $jours= $_POST['jours'];
if (isset ($_POST['rep']))  $rep= $_POST['rep'];

//Détecter s'il s'agit d'un appel interne de modification d'une News modifiée par le formulaire (POST)
if (isset ($action) && isset ($id) && $action=='Modifier'){
          // Modifier les données de la News dans la base
         //========connection==========
         $Flag1=mysql_connect("localhost","root","");
         $Flag2=mysql_select_db("test");
         //==========UPdate_news=========          
         if (mysql_query( 'UPdate news SET titre="'. $titre . '", date ="'. $date . '", text="'. $texte . '", jours="'. $jours . '", rep="'. $rep . '" WHERE id=' . $id ))
         {
              echo 'Modification effectuée';
         }
         else  { echo 'Modification non effectuée'; }
         mysql_close($Flag1);
}
//Détecter s'il s'agit d'un appel interne d'ajout d'une nouvelle News envoyé par le formulaire (POST)
if (isset ($action) && $action=='Ajouter'){
          // Ajouter les données de la News dans la base
         //========connection==========
         $Flag1=mysql_connect("localhost","root","");
         $Flag2=mysql_select_db("test");
         //==========INSERT=========  
         // id auto-incrémenté
         if (mysql_query( 'INSERT INTO news (titre, date, text, Jours,rep)  VALUES ("'. $titre . '", "'. $date . '", "'. $texte . '","'. $jours . '" ,"'. $rep . '")' ))
         {
              echo 'Ajout effectué';
         }
         else  { echo 'Ajout non effectué'; }
         mysql_close($Flag1);
}
//Détecter s'il s'agit d'un appel interne de suppression d'une News existante envoyé par le formulaire (POST)
if (isset ($action) && isset ($id) && $action=='Supprimer'){
          // Supprimer la News dans la base
         //========connection==========
         $Flag1=mysql_connect("localhost","root","");
         $Flag2=mysql_select_db("test");
         //==========DELETE=========
         if (mysql_query( 'DELETE FROM news WHERE id='. $id ))
         {
              echo 'Suppression effectuée';
         }
         else  { echo 'Suppression non effectuée'; }
         mysql_close($Flag1);
}
//Détecter s'il s'agit d'un appel externe (URL: GET) de modification d'une New (dans ce cas on reçoit une action=MettreAjour et un id d'une News)
if (isset ($action) && isset ($id) && $action=='MettreAjour'){
          // trouver les données de la News à  mettre à  jour
         //========connection==========
         $Flag1=mysql_connect("localhost","root","");
         $Flag2=mysql_select_db("test");
         //==========selection=========
         $result=mysql_query( 'SELECT * FROM news WHERE id=' . $id );
         if ($result && $row=mysql_fetch_array($result))
         {
             $id = $row['id'];
             $titre= stripslashes($row['titre']);
             $date = stripslashes($row['date']);
             $texte= $row['text'];
             $jours= $row['Jours'];
		     $rep= $row['rep'];
         }
                 else { echo 'Le titre que vous cherchez n\'existe pas';  exit(); } //Sortie
         mysql_close($Flag1);
}
?>
<form method="post" enctype="multipart/form-data">
  <p>Titre : <br /><input type="text" name="titre" <?php if (isset($titre)) echo ' value="'.htmlspecialchars(stripslashes($titre)).'"'; ?> /></p>
  <p>date : <br /><input type="text" name="date" <?php if (isset($date)) echo ' value="'. ($date).'"'; ?> /></p>
  <p>Texte : <br /><textarea name="texte"><?php if (isset($texte)) echo htmlspecialchars(stripslashes($texte)); ?></textarea></p>
 
	<select id="jours" name="jours">  <?php if (isset($jours)) echo ' value="'. ($jours).'"'; ?> >
    <option value="">Entrez le jour</option>
    <option value="1">Lundi</option>
    <option value="2">Mardi</option>
    <option value="3">Mercredi</option>
	</select>
  
    <p>Réponse</p>
	<input type="radio" name="rep" value="1" id="oui" /> <label for="oui">Oui</label>
	<input type="radio" name="rep" value="0" id="non" /> <label for="non">Non</label>
	
	
  <p></p>
  
  <?php
       //sélection automatique de l'option correspondant au jours posté (rappel de valeur) 
       if (isset($jours)) 
         echo '<script> document.getElementById("jours").options('.$jours.').selected="selected"; </script>';
		 
	   // essai de selection de l'option bouton radio
	   if (isset($rep)) 
         echo '<script> document.getElementById("rep").options('.$rep.').selected="selected"; </script>';
		 
  ?>
  
   <?php
         // afficher l'id caché pour les cas de modification et suppression
        if (isset ($id)) {
             echo '<input type="hidden" name="id" value="' . $id . '" />';
        }
    ?>
    <input name="action" type="submit" value="Ajouter" />
    <input name="action" type="submit" value="Modifier" />
    <input name="action" type="submit" value="Supprimer" />
    <input type="button" value="Afficher News" onclick="window.location.href='afficherNews.php'" />
</form>
</body>
</html>
l'intelligence est le seul outil qui permet à l'Homme de mesurer l'imensité de son malheur.(P.Desproges)
C'est en sciant que Léonard devint scie...

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

21 mars 2011, 23:06

Pour les cases à cocher "CHECKBOX" et les boutons d'options "RADIO" la propriété pour les sélectionner est ".checked" qui prend comme valeur "true" ou "false"
ça marche pas comme pour les listes déroulantes.

De ce fait le plus simple n'est pas d'utiliser javascript mais de faire une affectation de l'attribut "checked" comme on a fait pour "value" pour les zones de texte.

Voici comment:
<p>Réponse</p>
        <input type="radio" name="rep" value="1" id="oui" <?php if (isset($rep) && $rep==1) echo ' checked="true" '; ?> /> <label for="oui">Oui</label>
        <input type="radio" name="rep" value="0" id="non" <?php if (isset($rep) && $rep==0) echo ' checked="true" '; ?>/> <label for="non">Non</label>
Donc si rep égale à 1 on met checked=true pour le radio "oui" et si rep égale à 0 on met checked=true sur le radio "non"
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

21 mars 2011, 23:20

Yop,

plutot checked ou checked="checked" en xhtml ;)

@+
Il en faut peu pour être heureux ......

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

21 mars 2011, 23:59

Exact moogli. Selon le standard XHTML, Merci de l'avoir rappelé.

On peut aussi faire ça avec javascript comme on a fait avec la liste déroulante, même si ça ne sert pas à grand chose pour le cas de 2 radio oui/non. Mais dans le cas de plusieurs radio ou checkbox ça peut servir. Voila, une boucle FOR peut parcourir les objets radio ayant le même "name" comme un tableau (Array) voici un exemple concret:
<form id="f1">
<p> <input type="radio" name="rep" value="1"  /> </p>
<p> <input type="radio" name="rep" value="2"  /> </p>
<p> <input type="radio" name="rep" value="3"  /> </p>
<p> <input type="radio" name="rep" value="4"  /> </p>
<p> <input type="radio" name="rep" value="5"  /> </p>
<script>
// accès au tableau rep constitué des boutons radio nommés "rep" (f1 est l'id de leur formulaire)
var tab = document.getElementById('f1').rep; 
// la valeur recherchée provient de PHP de la variable $rep
var valeurRep = <?php if (isset($rep)) echo $rep; else echo "''"; ?>;
// parcourir le tableau rep et détecter le radio dont la valeur = l'index recherché
for (i=0; i<tab.length; i++){
	if (tab[i].value == valeurRep) { 
		tab[i].checked = true; // si la valeur recherchée est trouvée on sélectionne le bouton radio
		break; // arrêter la boucle FOR car on a trouvé
	}
}
</script>
</form>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 18 Messages

22 mars 2011, 00:09

bonsoir.
Formidable..!!! ça marche !!!
je commence à évaluer l'ampleur du travail qui m'attend..pour réaliser mon projet ..!! :?
:D courage et tenacité... :D
il me reste la gestion des boutons
modifier invisible si acces direct pour "ajout"
et
ajouter invisible si acces par la lise "afficherNews.php"


Ps: dans ton exemple ci-dessus, la boucle FOR ne vaut que si les zones de liste (par exemple) ont le même "name"..
ce qui est difficilement réalisable dans la même page..non? car si elles ont le même nom..on ne peut pas leurs attribuer de $variale différente..
Modifié en dernier par Nesdonal le 22 mars 2011, 00:14, modifié 1 fois.
l'intelligence est le seul outil qui permet à l'Homme de mesurer l'imensité de son malheur.(P.Desproges)
C'est en sciant que Léonard devint scie...

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

22 mars 2011, 00:13

:D courage et tenacité... :D
C'est une très bonne résolution. Je t'encourage fort de continuer comme ça :wink:
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 18 Messages

22 mars 2011, 00:27

j'ai bien testé ton conseil:
il faut tester avant l'affichage des boutons comme on a testé dans le code PHP pour détecter les actions. Par exemple, si l'action est "MettreAjour" alors on affiche simplement les boutons "Modifier" et "Supprimer" sinon on affiche le bouton "Ajouter
j'ai don essayé de déplacer le code:
<input name="action" type="submit" value="Ajouter" />
dans la partie "INSERT"...mais bien sur ce serait trop simple :(
l'intelligence est le seul outil qui permet à l'Homme de mesurer l'imensité de son malheur.(P.Desproges)
C'est en sciant que Léonard devint scie...

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

22 mars 2011, 01:33

Non, les boutons d'action doivent rester à leur emplacement actuel c'est à dire en bas du formulaire. Il faut simplement ajouter un teste PHP avec un IF avant d'afficher chaque bouton. comme on a fait pour le champ "hidden". En l'occurrence, un truc comme ça:
<?php 
    // cas où on vient de la page d'affichage des News et qu'on a demandé la modification d'une News (action='MettreAjour')
    if (isset($action) && $action == "MettreAjour") { 
        echo '<input name="action" type="submit" value="Modifier" /><input name="action" type="submit" value="Supprimer" />';            
    }
?>
...
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 18 Messages

22 mars 2011, 11:14

Bonjour
donc ça fonctionne bien avec ton code pour modification..!! avec le test sur l'action mise à jour,
mais bien sur cela ne fonctionne pas avec mon code pour ajout...j'ai bien fait le test sur l'action "ajouter"..
c'est quoi le problème..?
		if (isset ($action) && $action == "Ajouter") {
	    echo '<input name="action" type="submit" value="Ajouter" />';
	
	}
l'intelligence est le seul outil qui permet à l'Homme de mesurer l'imensité de son malheur.(P.Desproges)
C'est en sciant que Léonard devint scie...

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

22 mars 2011, 23:55

Le problème avec ton code est que le test sur l'action=Ajouter n'est pas logique car cette action est déclenchée par le bouton Ajouter lui même, donc l'action Ajouter ne peut pas exister avant l'affichage du bouton Ajouter.

Le mieux est de dire que le bouton Ajouter doit être affiché si on est pas en mode mise à jour. C'est à dire : quand il n'y a aucune action engagée avant l'affichage du formulaire (premier affichage par défaut) C'est à dire aussi : quand on vient pas de l'action mise à jour provenant de la page d'affichage de la liste des News. Donc c'est exactement l'état contraire de l'action qui affiche les boutons "Modifier" et "Supprimer". D'où le code suivant:
<?php
    // cas où on vient de la page d'affichage des News et qu'on a demandé la modification d'une News (action='MettreAjour') => Modifier/Supprimer News
    if (isset($action) && $action == "MettreAjour") {
        echo '<input name="action" type="submit" value="Modifier" /><input name="action" type="submit" value="Supprimer" />';            
    }
   else {
         // cas où aucune action préalable (affichage du formulaire par défaut) et aussi le cas où aucune mise à jour News n'est demandée => Ajouter New
        echo '<input name="action" type="submit" value="Ajouter" />';
  }
?>
A+
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène