[PHP/SQL] Mettre à jour des données dans un tableau array

Mettre à jour des données dans un tableau array [PHP/SQL] - PHP - Programmation

Marsh Posté le 12-07-2008 à 22:54:17    

Bonjour à tous !
 
Je  débute et je suis confronté à mon premier gros souci !
 
Avec php et MySQL, je veux réaliser, pour le travail, un catalogue de réactifs de laboratoires aidant à gérer les stocks au quotidien.
 
 Dans ma BDD j'ai une table "réactifs" avec deux champs :
- un champ "nom" (le nom de chaque réactifs)
- un champ "quantite" (le volume disponible pour chacun de ces réactifs)
 
Je souhaiterais qu'une page php affiche un tableau avec trois colonnes. Une première colonne "nom", une seconde "quantité initiale" (ces deux colonnes listeraient ni plus ni moins les données présents dans ma BDD avec les variables "nom" et "quantite" ) et enfin une troisième colonne "quantité à retrancher" qui présenterait une zone formulaire <input type="text"/>.
 
Si un réactif a été utilisé, l'utilisateur indique le volume utilisé dans cette zone de saisi... Si le réactif n'a pas été utilisé, cette zone reste sans information... Après envoi du formulaire, cette même page se recharge avec mise à jour des quantités pour les réactifs utilisés.
 
Faire un tableau qui listerait les noms et quantités des réactifs ne me pose pas de souci, c'est cette troisième colonne qui me bloque complétement...
 
Merci beaucoup aux personnes qui pourront m'aider !!!
 
Cordialement,
 
Thomas
 
 
 
 
 
 
Voilà la structure que j'ai pour le moment pour cette page :
 
 

Code :
  1. <form method="post" action="majcatalogue.php">
  2. <table>
  3.     <tr>
  4.         <td>nom du réactif</td>
  5.         <td>quantité<br />initiale</td>
  6.         <td>quantité<br />utilisée</td>
  7.     </tr>
  8. <?php
  9. // Là tout ce qui va bien pour se connecter à la BDD
  10. $reponse = mysql_query("SELECT * FROM reactifs WHERE quantite>0 ORDER BY nom" );
  11. while ($donnees = mysql_fetch_array($reponse))
  12. {
  13. echo "<tr>";
  14.     echo "<td>";
  15.         echo $donnees['nom'];
  16.     echo "</td>";
  17.     echo "<td>";
  18.         echo $donnees['quantite'];
  19.     echo "</td>";
  20.     echo "<td>";
  21.         // endroit ou il faut afficher la zone de saisi "text" permettant la mise à jour de $quantite à  l'envoi du formulaire... C'est là que je bloque :(
  22.     echo "</td>";
  23. echo "</tr>";
  24. }
  25. ?>
  26. </table>
  27. <input type="submit" /> <input type="reset" />
  28. </form>


Reply

Marsh Posté le 12-07-2008 à 22:54:17   

Reply

Marsh Posté le 13-07-2008 à 00:09:42    

Code :
  1. echo "<td>";
  2. echo "<input type='text' id='$nom' name='$nom' value='$quantite' />";
  3. echo "</td>";


 
un truc comme ca  :??:

Message cité 1 fois
Message édité par SICKofitALL le 13-07-2008 à 00:10:03

---------------
We deserve everything that's coming...
Reply

Marsh Posté le 13-07-2008 à 00:39:16    

SICKofitALL a écrit :

un truc comme ca  :??:


 
Non... trop simple ;)
C'est la première chose que j'ai testé mais ça marche pô...
 
Merci quand même pour ton aide... Si d'autres personnes ont des idées, je suis toujours preneur ! ;)


Message édité par Tots le 13-07-2008 à 00:39:34
Reply

Marsh Posté le 15-07-2008 à 18:12:56    

Merci pour ta réponse...
 
Mais il manque quelque chose... J'ai un tableau array associatif... Un tableau avec X lignes pour X réactifs présents dans la table..., et chaque ligne du tableau offre la possibilité de mettre à jour la quantité qui se reporte au réactif de la dite ligne...
 
Comment je peux automatiser le where reactif='nom du reactif' ? (d'ailleurs transformé en where id='id du reactif', ça sera peut être plus simple de jongler avec des chiffres puisque j'ai un champ id dans ma table)
 
En faite, à l'envoi du formulaire, il faudrait associer l'id et la quantité à retrancher pour le réactif à mettre à jour... Et ça c'est déjà au delà de mes faibles connaissance de débutant ! :)
 
Merci pour votre aide !
 
Cordialement,
 
Thomas
 
 
PS : Voici mon code pour le moment... Ca n'a pas bcp avancé...  
 

Code :
  1. <form action="majtest.php" method="post">
  2.    <table>
  3.       <tr>
  4.          <th>nom</th>
  5.          <th>quantité<br/> initiale</th>
  6.          <th>quantité<br/>utilisée</th>
  7.       </tr>
  8.  
  9.  
  10.        <?php
  11.  
  12.           mysql_connect("localhost", "root", "" ); // Connexion à MySQL
  13.           mysql_select_db("fish" ); // Sélection de la base coursphp
  14.   
  15.           $reponse = mysql_query("SELECT * FROM sondes WHERE quantite>0 ORDER BY chrom1" ); // Requête SQL
  16.   
  17.           mysql_close(); // Déconnexion de MySQL
  18.   
  19.   
  20.   
  21. while ($donnees = mysql_fetch_array($reponse))
  22. {
  23. ?>
  24.    <tr>
  25.       <td>
  26.       <?php echo $donnees['nom']; ?>
  27.       </td>
  28.       <td>
  29.       <?php echo $donnees['quantite']; ?>
  30.       </td>
  31.       <td>
  32.       <input type="text" name="quantite_utilisee" id="quantite_utilisee" size="3" />
  33.       <input type="submit" value="Modifier" />
  34.       </td>
  35.    </tr>
  36. <?php
  37. }
  38. ?>
  39.    </table>
  40.  
  41. </form>

Reply

Marsh Posté le 15-07-2008 à 18:34:42    

Salut, là ton machin il marchera jamais, parce que tu as X boutons "Modifier" alors que t'as un seul form .. Du coups t'envoie toujours tout ton tableau alors que tu veux envoyer une seule ligne..
 
Moi ce que je fais dans ce genre de cas, c'est que je crée 1 form par ligne :
 

Code :
  1. while(..)
  2. {
  3. ?>
  4.    <tr>
  5.       <td>
  6.       <?php echo $donnees['nom']; ?>
  7.       </td>
  8.       <td>
  9.       <?php echo $donnees['quantite']; ?>
  10.       </td>
  11.       <td>
  12.       <form action="majtest.php" method="post">
  13.      <input type="hidden" name="id" value="<?=$donnees['id]?>"/>
  14.       <input type="text" name="quantite_utilisee" id="quantite_utilisee" size="3" />
  15.       <input type="submit" value="Modifier" />
  16. </form>
  17.       </td>
  18.    </tr>
  19. <?
  20. }


 
De cette manière tu passes au formulaire un champ ID contenant l'ID de ta ligne.
Après quand tu reçois ton form t'auras plus qu'à faire une requête du style :
 
UPDATE sondes quantite = $_POST['quantite_utilisee'] where id = $_POST['id];
 
P.S: La requête telle que je te l'ai écrite là c'est pour te donner la voie, tu dois impérativement sécuriser les string avant sinon ta bdd risque de se retrouver à plat ventre si un méchant passe par là.
Si t'as mysqli installé sur ton serveur utilise ça :
http://php.oregonstate.edu/manual/ [...] repare.php

Reply

Marsh Posté le 15-07-2008 à 21:49:59    

Voilà !!! Ouf !!!
 
Mon code n'est surement pas parfait mais ça marche !
 
Merci esox_ch d'avoir mit le doigt sur plusieurs soucis, ça m'a bien aidé ! (ne serait-ce que ce problème de balises <form></form> mal placées)
 
Pour dire à quel point je suis débutant, je n'avais pas du tout pensé à utiliser les formulaires cachés pour récupérer facilement les infos manquantes, c'est ça qui m'a complètement débloqué...
 
Voici le code que j'ai "trouvé" :
 
Pour le tableau :

<?php
while ($donnees = mysql_fetch_array($reponse))
{
?>
<tr>
   <td>
      <?php echo $donnees['nom']; ?>
   </td>
   <td>
      <?php echo $donnees['quantite']; ?>
   </td>
   <td>
      <form action="majtest.php" method="post">
      <input type="text" name="quantite_utilisee" size="3" />
      <input type="hidden" name="id" value="<?php echo $donnees['id']; ?>" />
      <input type="hidden" name="quantite" value="<?php echo $donnees['quantite']; ?>" />
      <input type="submit" value="Modifier" />
      </form>
   </td>
</tr>
<?php
}
?>


 
 
Et en tête de page pour recevoir et traiter les variables envoyées par le formulaire :

// Pour la sécurité :
 
$quantite = mysql_real_escape_string(htmlspecialchars($_POST['quantite']));
$quantite_utilisee = mysql_real_escape_string(htmlspecialchars($_POST['quantite_utilisee']));
 
 
// Pour la mise à jour du volume disponible :
 
$newquantite=$quantite-$quantite_utilisee;
     
if ($newquantite < 0)
{
   $newquantite = 0;
}
     
mysql_query("UPDATE sondes SET quantite='" . $newquantite . "' WHERE id='" . $_POST['id'] . "'" );


 
Merci à vous qui avez pris le temps de me répondre !
 
Cordialement,
 
Thomas

Reply

Marsh Posté le 16-07-2008 à 12:46:08    

T'as oublié de sécuriser $_POST['id']

Reply

Marsh Posté le 16-07-2008 à 13:23:54    

ce serais bof qu'on puisse mettre à jour toute ta table en un coup :/

Reply

Marsh Posté le 16-07-2008 à 19:05:28    

C'est pas le cas, avec ce qu'il a écrit, il mettra à jour une ligne à la fois :o
Et puis de toutes façon, quoi que tu mettes à jour, si tu sécurises pas lîd, moi je te poste joli truc style  => '1;Requete Mechante style truncate users; --  
Et toi t'es dans la merde

Reply

Marsh Posté le 16-07-2008 à 19:15:10    

bah en faisant une condition toujours vraie :
WHERE id='1' or '1'='1

Reply

Marsh Posté le 16-07-2008 à 19:15:10   

Reply

Marsh Posté le 16-07-2008 à 20:08:44    

Effectivement l'id est passé à l'as dans la sécurisation... L'oubli est maintenant réparé !
 
Sinon juste pour info ce programme servira a remplacer une pauvre page excel (donc déjà accessible et "ruinable" par quiconque en aurait envi) et cela restera en intranet donc bon niveau sécurité, j'ai pas besoin de pousser le truc comme un dingue... Ceci étant dis, je ne peux pas reprocher à qq'un de sensibiliser le débutant que je suis à la sécurisation de son script ! Merci donc à vous ! :)
 
Cordialement,
 
Thomas

Reply

Marsh Posté le 16-07-2008 à 23:03:28    


 
My bad.. J'ai justement choisi l'exemple qu'il faut pas.
Celà dit, c'est vraiment un cas "isolé" dans le seul qu'à ce que j'en sait (et apparemment la doc semble aller dans le même sens) mysql_query est la seule fonction qui n'execute qu'une seule requête (rien n'est dit pour mysqli_query, et j'ai pas de php sous la main).  
En outre tous les autres SGBD (Postgres et SQLite en tous cas) sont susceptibles d'exécuter plusieurs requêtes à la suite.. En tous cas reste le fait qu'on peut modifier la portée de la requête en concaténant, comme dit par luc@as un 1' && 1=1  
 
Mais merci de ta correction  :jap:


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed