2009-01-01 6 views
0

s'il vous plaît je veux aider im un begginerAide avec case à cocher et base de données

J'ai un formulaire avec des cases à cocher. Chacun a une valeur lorsque les cases à cocher sont cochées, sa valeur est ajoutée à la somme ... Je veux sauvegarder les cases cochées dans une base de données.

<script type="text/javascript"> 
    function checkTotal() { 
     document.listForm.total.value = ''; 
     var sum = 0; 
     for (i=0;i<document.listForm.choice.length;i++) { 
      if (document.listForm.choice[i].checked) { 
      sum = sum + parseFloat(document.listForm.choice[i].value); 
      } 
     } 
     document.listForm.total.value = sum; 
    } 
</script> 

<form name="listForm" method="post" action="insert_options.php" > 
<TABLE cellPadding=3 width=600 border=0> 
     <TBODY> 

     <TR> 
      <TH align=left width="87%" bgColor=#b0b3b4><SPAN 
      class=whiteText>Item</SPAN></TH> 
      <TH align=right width="13%" bgColor=#b0b3b4><SPAN 
      class=whiteText>Select</SPAN></TH></TR> 
     <TR> 
      <TD bgcolor="#9da8af"colSpan=2><SPAN class=normalText><B>General</B></SPAN></TD></TR> 
     <TR> 
      <TD bgcolor="#c4c8ca"><SPAN class=normalText >TEAK SIDE DECKS (2889)</SPAN></TD> 
      <TD align=right bgColor=#c4c8ca><input name="choice" value="2889" type="checkbox" onchange="checkTotal()" /></TD></TR> 
     <TR> 
      <TD bgColor=#c4c8ca><SPAN class=normalText>LEAD DEEP KEEL (1825)</SPAN></TD> 
      <TD align=right bgColor=#c4c8ca><input name="choice" value="1825" type="checkbox" onchange="checkTotal()"></TD></TR> 

     <TR> 
      <TD bgColor=#c4c8ca><SPAN class=normalText>FULLY BATTENED MAINSAIL (558)</SPAN></TD> 
      <TD align=right bgColor=#c4c8ca><input name="choice" value="558" type="checkbox" onchange="checkTotal()"></TD></TR> 

     <TR> 
      <TD bgColor=#c4c8ca><SPAN class=normalText>HIGH TECH SAILS FOR CONVENTIONAL RIG (1979)</SPAN></TD> 
      <TD align=right bgColor=#c4c8ca><input name="choice" value="1979" type="checkbox" onchange="checkTotal()"></TD></TR> 

      <TR> 
      <TD bgColor=#c4c8ca><SPAN class=normalText>IN MAST REEFING WITH HIGH TECH SAILS (2539)</SPAN></TD> 
      <TD align=right bgColor=#c4c8ca><input name="choice" value="2539" type="checkbox" onchange="checkTotal()"></TD></TR> 

      <TR> 
      <TD bgColor=#c4c8ca><SPAN class=normalText>SPlNNAKER GEAR (POLE LINES DECK FITTINGS) (820)</SPAN></TD> 
      <TD align=right bgColor=#c4c8ca><input name="choice" value="820" type="checkbox" onchange="checkTotal()"></TD></TR> 

      <TR> 
      <TD bgColor=#c4c8ca><SPAN class=normalText>SPINNAKER POLE VERTICAL STOWAGE SYSTEM (214)</SPAN></TD> 
      <TD align=right bgColor=#c4c8ca><input name="choice" value="214" type="checkbox" onchange="checkTotal()"></TD></TR> 

      <TR> 
      <TD bgColor=#c4c8ca><SPAN class=normalText>GAS ROD KICKER (208)</SPAN></TD> 
      <TD align=right bgColor=#c4c8ca><input name="choice" value="208" type="checkbox" onchange="checkTotal()"></TD></TR> 

      <TR> 
      <TD bgColor=#c4c8ca><SPAN class=normalText>SIDE RAIL OPENINGS (BOTH SIDES) (392)</SPAN></TD> 
      <TD align=right bgColor=#c4c8ca><input name="choice" value="392" type="checkbox" onchange="checkTotal()"></TD></TR> 

      <TR> 
      <TD bgColor=#c4c8ca><SPAN class=normalText>SPRING CLEATS MIDSHIPS -ALUMIMIUM (148)</SPAN></TD> 
      <TD align=right bgColor=#c4c8ca><input name="choice" value="148" type="checkbox" onchange="checkTotal()"></TD></TR> 


      <TR> 
      <TD bgColor=#c4c8ca><SPAN class=normalText>ELECTRIC ANCHOR WINDLASS (1189)</SPAN></TD> 
      <TD align=right bgColor=#c4c8ca><input name="choice" value="1189" type="checkbox" onchange="checkTotal()"> </TD></TR> 



      <TR> 
      <TD bgColor=#c4c8ca><SPAN class=normalText>ANCHOR CHAIN GALVANISED (50m) (202)</SPAN></TD> 
      <TD align=right bgColor=#c4c8ca><input name="choice" value="202" type="checkbox" onchange="checkTotal()"> </TD></TR> 



      <TR> 
      <TD bgColor=#c4c8ca><SPAN class=normalText>ANCHOR CHAIN GALVANISED (50m) (1141)</SPAN></TD> 
      <TD align=right bgColor=#c4c8ca><input name="choice" value="1141" type="checkbox" onchange="checkTotal()"></TD></TR> 

      <TR> 
      <TD bgcolor="#9da8af"colSpan=2><SPAN class=normalText><B>NAVIGATION & ELECTRONICS</B></SPAN></TD></TR> 
     <TR> 
      <TD bgcolor="#c4c8ca"><SPAN class=normalText >WIND VANE (STAINLESS STEEL)(41)</SPAN></TD> 
      <TD align=right bgColor=#c4c8ca><input name="choice" value="41" type="checkbox" onchange="checkTotal()" /></TD></TR> 
     <TR> 
      <TD bgColor=#c4c8ca><SPAN class=normalText>RAYMARINE ST6O LOG & DEPTH (SEPARATE UNITS)(226)</SPAN></TD> 
      <TD align=right bgColor=#c4c8ca><input name="choice" value="226" type="checkbox" onchange="checkTotal()"></TD></TR> 

     <TR> 
      <TD bgcolor="#9da8af"colSpan=2><SPAN class=normalText><B>ENGINES & ELECTRICS</B></SPAN></TD></TR> 
     <TR> 
      <TD bgColor=#c4c8ca><SPAN class=normalText>SHORE SUPPLY (220V) WITH 3 OUTLETS (EXCLUDJNG SHORE CABLE) (327)</SPAN></TD> 
      <TD align=right bgColor=#c4c8ca><input name="choice" value="327" type="checkbox" onchange="checkTotal()"></TD></TR> 

     <TR> 
      <TD bgColor=#c4c8ca><SPAN class=normalText>3rd BATTERY(14OA/H)(196)</SPAN></TD> 
      <TD align=right bgColor=#c4c8ca><input name="choice" value="196" type="checkbox" onchange="checkTotal()"></TD></TR> 

     <TD bgColor=#c4c8ca><SPAN class=normalText>24 AMP BATTERY CHARGER (475)</SPAN></TD> 
      <TD align=right bgColor=#c4c8ca><input name="choice" value="475" type="checkbox" onchange="checkTotal()"></TD></TR> 

      <TD bgColor=#c4c8ca><SPAN class=normalText>2 BLADED FOLDING PROPELLER (UPGRADE)(299)</SPAN></TD> 
      <TD align=right bgColor=#c4c8ca><input name="choice" value="299" type="checkbox" onchange="checkTotal()"></TD></TR> 


     <TR> 
      <TD bgcolor="#9da8af"colSpan=2><SPAN class=normalText><B>BELOW DECKS/DOMESTIC</B></SPAN></TD></TR> 

      <TD bgColor=#c4c8ca><SPAN class=normalText>WARM WATER (FROM ENGINE & 220V)(749)</SPAN></TD> 
      <TD align=right bgColor=#c4c8ca><input name="choice" value="749" type="checkbox" onchange="checkTotal()"></TD></TR> 

      <TD bgColor=#c4c8ca><SPAN class=normalText>SHOWER IN AFT HEADS WITH PUMPOUT(446)</SPAN></TD> 
      <TD align=right bgColor=#c4c8ca><input name="choice" value="446" type="checkbox" onchange="checkTotal()"></TD></TR> 

      <TD bgColor=#c4c8ca><SPAN class=normalText>DECK SUCTION DISPOSAL FOR HOLDINGTANK(166)</SPAN></TD> 
      <TD align=right bgColor=#c4c8ca><input name="choice" value="166" type="checkbox" onchange="checkTotal()"></TD></TR> 

      <TD bgColor=#c4c8ca><SPAN class=normalText>REFRIGERATED COOLBOX (12V)(666)</SPAN></TD> 
      <TD align=right bgColor=#c4c8ca><input name="choice" value="666" type="checkbox" onchange="checkTotal()"></TD></TR> 

      <TD bgColor=#c4c8ca><SPAN class=normalText>LFS SAFETY PACKAGE (COCKPIT HARNESS POINTS STAINLESS STEEL JACKSTAYS)(208)</SPAN></TD> 
      <TD align=right bgColor=#c4c8ca><input name="choice" value="208" type="checkbox" onchange="checkTotal()"></TD></TR> 

      <TD bgColor=#c4c8ca><SPAN class=normalText>UPHOLSTERY UPGRADE IN SALOON (SUEDETYPE)(701)</SPAN></TD> 
      <TD align=right bgColor=#c4c8ca><input name="choice" value="701" type="checkbox" onchange="checkTotal()"></TD></TR> 

      <TR> 
      <TD bgcolor="#9da8af"colSpan=2><SPAN class=normalText><B>NAVIGATION ELECTRONICS & ELECTRICS</B></SPAN></TD></TR> 

      <TD bgColor=#c4c8ca><SPAN class=normalText>VHF RADIO AERIAL CABLED TO NAVIGATION AREA(178)</SPAN></TD> 
      <TD align=right bgColor=#c4c8ca><input name="choice" value="178" type="checkbox" onchange="checkTotal()"></TD></TR> 
</table> 

et le code php est

<?php 

$opt=serialize($_POST['choice']); //takes the data from a post operation... 
$query="INSERT INTO options VALUES('$opt')"; 

?> 
+0

veuillez simplifier votre code, enlevez tout ce dont vous avez besoin HTML –

+0

Voir ma réponse [ici] (http://stackoverflow.com/questions/408834/retriving-saved-checkboxes-name-and-values-from-database#408899 –

Répondre

4

Tout d'abord, tous vos <input type="checkbox"> champs ont le même attribut name. Cela entraîne l'envoi de plusieurs valeurs portant le même nom (si plusieurs cases sont cochées), dont PHP n'utilise que le dernier pour sa collection $_POST.

Pour résoudre ce problème, donnez-leur le nom "choice[]", au lieu de "choice". Cela indique à PHP qu'il y a plusieurs valeurs possibles, et elles seront toutes disponibles sous forme de tableau. En d'autres termes, vous serez en mesure de faire ce qui suit:

$choices = $_POST['choice']; 
foreach ($choices as $key => $value) 
    echo "$key => $value"; 

Et ce quelque chose Affichera comme

0 => 32 
1 => 12 
2 => 48 

En d'autres termes - vous obtenez un tableau avec les valeurs des cases cochées. Après cela, vous pouvez faire ce que vous aimez avec eux. Par exemple, implode() pour obtenir une liste séparée par des virgules.

Une chose que vous devriez être prévenu cependant. C'est ce qu'on appelle "Injection SQL" et est une erreur courante des programmeurs inexpérimentés. L'idée est qu'un utilisateur malveillant peut facilement y envoyer d'autres valeurs, pas seulement celles que vous avez spécifiées dans votre code HTML. Il ne faut pas beaucoup de compétences pour forger une requête HTTP. Il peut y avoir n'importe quel provenant de l'utilisateur, de sorte que vous devez TOUJOURS vérifier ALL INPUT que vous obtenez de l'utilisateur. Ne faites pas confiance aux validations JavaScript que vous effectuez. Tant que c'est du côté des utilisateurs - on ne peut pas faire confiance. Déjà.

Et si vous vous demandez comment cela peut être une mauvaise chose - considérer, ce qui se passerait si tout à coup l'une des valeurs dans votre tableau ne serait pas 43 plus, mais serait plutôt « '); DROP DATABASE; -- ».

Puisque vous exécutez aveuglément une requête comme

INSERT INTO options VALUES('$opt'); 

Ce serait alors se transformer en

INSERT INTO options VALUES(''); DROP DATABASE; --); 

Et bye-bye va votre base de données. Ainsi, TOUJOURS assurez-vous que l'entrée de l'utilisateur est ce que vous attendez et qu'il n'y a pas de possibilité pour quelque chose comme ça. Oh, et oui - addslashes() n'est pas une bonne méthode car il y a encore un moyen de contourner cela. Les requêtes paramétrées sont la meilleure solution, mais si vous ne pouvez pas l'utiliser, utilisez au moins mysql_real_escape_string() pour MySQL, ou tout ce que vous propose votre SGBD.

+0

Réponse impressionnante de l'homme.vous méritez plus de points pour celui-ci :) – mdgrech

Questions connexes