Problème de delete dans une BD Mysql par un formulaire Php
Hors ligneSalva Le 25/02/2006 à 21:00 Profil de Salva Configuration de Salva

Bonjour,

Me revoila avec mon problème de "delete" d'un champ dans une Bd Mysql depuis un formulaire Php.

Voilà, je rapatrie dans un formulaire plusieurs champs d'un agenda. Pour ca j'ai un tableau avec une "région répété" qui fait que tous les champs concernés s'affichent les un en dessous des autres de la date la plus ancienne à la plus recente, ca marche très bien.
Dans cette région répété en bout de ligne j'ai un bouton Delete qui lorsque l'on clique dessus doit effacer la ligne concernée.
Sauf que au lieu d'effacer la ligne concernée, ca efface toujours la derniere ligne du tableau (la date la plus recente au lieu de la 1er ligne la date la plus ancienne).

Je ne comprends pas ce qui se passe.
Je joint une partie de mon code :

Avant le Head

<?php require_once('Connections/connexionmy57595.php'); ?>
<?php
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
  $theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}

if ((isset($_POST['id'])) && ($_POST['id'] != "") && (isset($_POST['form2']))) {
  $deleteSQL = sprintf("DELETE FROM agenda WHERE id=%s",
                       GetSQLValueString($_POST['id'], "int"));

  mysql_select_db($database_connexionmy57595, $connexionmy57595);
  $Result1 = mysql_query($deleteSQL, $connexionmy57595) or die(mysql_error());

  $deleteGoTo = "Copie de supression_moselle.php";
  if (isset($_SERVER['QUERY_STRING'])) {
    $deleteGoTo .= (strpos($deleteGoTo, '?')) ? "&" : "?";
    $deleteGoTo .= $_SERVER['QUERY_STRING'];
  }
  header(sprintf("Location: %s", $deleteGoTo));
}

$colname_agendasup = "1";
if (isset($_GET['ville'])) {
  $colname_agendasup = (get_magic_quotes_gpc()) ? $_GET['ville'] : addslashes($_GET['ville']);
}
mysql_select_db($database_connexionmy57595, $connexionmy57595);
$query_agendasup = sprintf("SELECT id, ville, nom, date_fin FROM agenda WHERE ville = '%s' ORDER BY date_fin ASC", $colname_agendasup);
$agendasup = mysql_query($query_agendasup, $connexionmy57595) or die(mysql_error());
$row_agendasup = mysql_fetch_assoc($agendasup);
$totalRows_agendasup = mysql_num_rows($agendasup);
?>

Après le Head (le formulaire)

<form name="form2" method="post" action="">
          <table width="350" border="1" id="form2">
            <tr>
              <th scope="col">Date</th>
              <th scope="col">Ville</th>
              <th scope="col">Ev&eacute;nement</th>
              <th scope="col">&nbsp;</th>
              <th scope="col">Action</th>
            </tr>
            <?php do { ?>
            <tr>
              <th scope="row"><?php echo $row_agendasup['date_fin']; ?></th>
              <td><?php echo $row_agendasup['ville']; ?></td>
              <td><?php echo $row_agendasup['nom']; ?></td>
              <td><?php echo $row_agendasup['id']; ?></td>
              <td>
              <input name="id" type="hidden" id="id" value="<?php echo $row_agendasup['id']; ?>">
              <input name="form2" type="submit" id="form2" value="Supprimer">
              </td>
            </tr>
            <?php } while ($row_agendasup = mysql_fetch_assoc($agendasup)); ?>
          </table>
        </form>

Merci pour votre aide.

Salutations.
Hors ligneMalalam Le 25/02/2006 à 21:20 Profil de Malalam Configuration de Malalam

Hello,

2 choses, en vrac :
pourquoi faire un do while, au lieu d'un while tout court ? Tu ferais l'économie d'un mysql_fetch_assoc ().

Enfin bref...

A part ça, ce qui se passe est normal.
Tu as un bouton de type hidden, répété autant de fois que tu as d'entrées dans ta base. Mais son nom reste le même.
Donc, quand tu effaces, tu effaces avec le $_POST['id'], qui a pris la valeur du dernier input hidden affiché.
Logique. Ce que tu fais reviens à ceci :

for ($i = 0; $i < 10; $i++) {
  $maVar = $i;
}

A la sortie de ta boucle, $maVar vaudra 9. Je sais, ça a l'air con ce que je te dis, mais c'est très exactement ce que tu fais... ;-)

Il y a plusieurs manières de procéder.
L'une d'elle serait de transformer ton input hidden ET ton submit en tableaux : name="id[<?php echo $row_agendasup['id']; ?>]" et name="form2[<?php echo $row_agendasup['id']; ?>]"

Puis à la soumission, tester si ton tableau $_POST['form2'] existe et n'est pas vide. S'il ne l'est pas, tester quelle clef a pour valeur "Supprimer", et récupérer la valeur de $_POST['id'][$clef_suppr], qui est l'id à supprimer de ta base.

Mais ce serait plus simple avec 1 bouton de suppression seulement, et un input radio, ou des checkboxes, pour chaque entrée. Tu pourrais ainsi supprimer plusieurs entrées de ta base d'un coup.
Hors ligneSalva Le 25/02/2006 à 23:22 Profil de Salva Configuration de Salva

Bonjour,

Merci pour ta réponse.
Je suis débutant en Php. C'est Dreamweaver qui fait tout le boulot pour moi

Mais je vais essayer de mettre en oeuvre ta proposition, c'est vrai qu'avec des boutons radio ca me permetrait d'en effacer plusieurs à la fois et ca s'est cool.

Si tu as une idée pour le code concerné je suis preneur.

Je viens de regarder comment je pourrais faire avec des chekbox, mais ce que je ne comprend pas c'est que comme ma chekbox est aussi dans ma région répété je vais avoir le même problème puisque la chekbox sera répété avec le même nom!!!

Merci pour votre aide

@+
Vous avez résolu votre problème avec VIC ? Faites-le savoir sur les réseaux sociaux !
Vulgarisation-informatique.com
Cours en informatique & tutoriels