Page 1 sur 1

update multiligne

Posté : 24 juil. 2016, 08:52
par bouchb
bonjour,
j'ai un petit soucis de code. je m'explique je fais une requête sélect avec une mise en tableau avec un mysql_fetch_array le resultat est mis dans un form. et je souhaiterai pouvoir faire une modification multiligne pour ensuite faire un update des lignes de ma table

voici le code de mon formulaire :

Code : Tout sélectionner

<?php $i='1'; $id = intval($_GET['id']); $result=mysql_query("SELECT * FROM engin2 where NumArtemis='32'"); ?><form name="armement" method="post" action="modifengin2.php"><?php while($donnees = mysql_fetch_array($result)) { ?> <div id="engin"> <form name="armement" method="post" action="modifengin2.php"> <input type="hidden" name="IdEngin[$i]" id="IdEngin[$i]" value="<?php echo $donnees['IdEngin']; ?>"/> <input type="text" name="pers1[$i]" id="pers1[$i]" value="<?php echo $donnees['pers1']; ?>"/> <input type="text" name="pers2[$i]" id="pers2[$i]" value="<?php echo $donnees['pers2']; ?>"/> <input type="text" name="pers3$i]" id="pers3[$i]" value="<?php echo $donnees['pers1']; ?>"/> <input type="text" name="pers4[$i]" id="pers4[$i]" value="<?php echo $donnees['pers2']; ?>"/> <input type="hidden" name="idinter" id="validate" value="<?php echo $donnees['NumArtemis']; ?>"/> </br> </div> <?php $i++; } ?> <input type="submit" id="bouton" name="Submit" value="Valider"> </form>
voici le code de traitement :

Code : Tout sélectionner

<?php if(isset($_POST['idinter'])) $idinter=$_POST['idinter']; else $idinter="0"; if(isset($_POST['IdEngin'])) $IdEngin=$_POST['IdEngin']; else $IdEngin="0"; foreach ($_POST['donnees'] as $key => $IdEngin) { $pers1 = $_POST['pers1'][$key]; $pers2 = $_POST['pers2'][$key]; $pers3 = $_POST['pers3'][$key]; $pers4 = $_POST['pers4'][$key]; $query = mysql_query("UPDATE engin2 SET pers1 ='".$pers1."', pers2 ='".$pers2."' ,pers3 ='".$pers3."', pers4 ='".$pers4."' WHERE IdEngin='".$IdEngin."'"); // on affiche le résultat pour le visiteur echo 'MODIFS FAITES.'; echo $_POST['pers1']; } ?>
merci d'avance de vos pistes ou votre aide

Re: update multiligne

Posté : 25 juil. 2016, 09:48
par moogli
salut,

tu as une déclaration de formulaire par ligne affichées c'est pas terrible (voir source d'erreur).
en html c'est <br /> et non </br> ;)
tes champs html ont toujours les mêmes noms / id. par exemple IdEngin[$i] (literrallement $i n'est pas remplacée par sa valeur).

Il faut toujours inspecter le code généré ;)
<?php
 if(isset($_POST['IdEngin']))   $IdEngin=$_POST['IdEngin'];
            else   $IdEngin="0";
$_POST['IdEngin'] est un tableau ton utilisation ici est scabreause, sans parler tu fait que cela est écrasé la ligne suivante par foreach ($_POST['donnees'] as $key => $IdEngin) {
du coup vire le if / else

$_POST['donnees'] n'existe pas dans le tableau, tu devrais avoir un message d'erreur de php (regarde dans le source html si tu ne le vois pas). Ci ce n'est pas le cas il faut activer l'affichage des erreurs.
En développement tu devrais avoir
display_error = on
error_reporting = E_ALL
à modifier dans ton php.ini (+ redémarrage du serveur web pour prise en compte).

cette ligne devrait être en dehors de la boucle : <input type="hidden" name="idinter" id="validate" value="<?php echo $donnees['NumArtemis']; ?>"/> (inutile de la mettre 5000000 fois c'est toujours la même ;) ).

WHERE IdEngin='".$IdEngin."'") => si tas clef primaire est un entier tu n'as pas besoin des ' autours dans la requête.
Ta requête SQL est sensible aux "attaques" type injections SQL. Utilise mysql_real_escape_string pour éviter cela.
Dans la même veine, l'extension mysql n'est plus supportée (et n'existe plus sur php7) tu devrais passer à mysqli ou PDO. le tuto qui va bien pour passer de mysql à mysqli


Ton code peu ressembler à ceci
<?php
// Formulaire
$cnx = mysqli_connect("localhost", "my_user", "my_password", "world");
$i='1';
// elle sert à quoi cette variable ? c'est pour la requête du dessous ?
// $id = intval($_GET['id']);
$result=mysqli_query($cnx, 'SELECT * FROM engin2 where NumArtemis=32');
?>
<form method="post" action="modifengin2.php">
<?php
while($donnees = mysqli_fetch_array($result)){
  echo <<<html
    <div id="engin">
         <input type="hidden" name="IdEngin[$i]" id="IdEngin[$i]" value="{$donnees['IdEngin']}"/>
        <input type="text" name="pers1[$i]"  id="pers1[$i]" value="{$donnees['pers1']}"/>
        <input type="text" name="pers2[$i]"  id="pers2[$i]" value="{$donnees['pers2']}"/>
        <input type="text" name="pers3$i]"  id="pers3[$i]" value="{$donnees['pers1']}"/>
        <input type="text" name="pers4[$i]"  id="pers4[$i]" value="{$donnees['pers2']}"/>
      <br/>
   </div>
html;
$i++;
}
mysqli_close($cnx);
//<!-- à vérifier si c'est bien l'id de l'utl qui correspond à 32 ($GET_['id']), sinon il faut remettre cette ligne dans le while et utiliser la notation tableau, mais vue la requête SQL il n'y a pas de raison c'est touours la même valeur -->
?>
<input type="hidden" name="idinter" id="validate" value="32"/>
<input type="submit" id="bouton" name="Submit" value="Valider">
</form>

// validation
<?php
$cnx = mysqli_connect("localhost", "my_user", "my_password", "world");
// il ne faut partir sur une valide qui ne correspondant pas aux données sinon c'est la merde dans les données très rapidement.
if(empty($_POST['idinter'])){
  echo 'Formulaire invalide';
}else {
  foreach ($_POST['IdEngin'] as $key => $IdEngin) {
    $pers1 = $_POST['pers1'][$key];
    $pers2 = $_POST['pers2'][$key];
    $pers3 = $_POST['pers3'][$key];
    $pers4 = $_POST['pers4'][$key];
    $query = mysqli_query($cnx, 'UPDATE engin2 SET pers1 ='. mysqli_real_escape_string($cnx, $pers1) .', pers2 ='. mysqli_real_escape_string($cnx, $pers2). ' ,pers3 ='. mysqli_real_escape_string($cnx, $pers3) .', pers4 ='. mysqli_real_escape_string($cnx, $pers4) .' WHERE IdEngin='. mysqli_real_escape_string($cnx, $IdEngin));
  // on affiche le résultat pour le visiteur (la concaténation c'est pratique ;) )
    echo 'MODIFS FAITES.', $_POST['pers1'];
  }
}

mysqli_close($cnx);
@+