HTML 5 form met PHP while loop

    ICTscripters maakt gebruik van cookies. Door het gebruiken en browsen naar onze site gaat je automatisch akkoord met het gebruik van cookies. Klik hier voor meer informatie

    • Zet eerst even de hele structuur zoals je die nu hebt hier neer. (Dus de tabellen auto's, dakdragers en de relatietabel) Ik weet niet wat je onder roof_1/2/3 gaat neerzetten, maar dat ziet er op het eerste oog al niet erg handig uit. Je zou eventueel ook tutorials op kunnen zoeken over "Database normalisatie".

      Daarnaast mis ik goede foutafhandeling. Wat gebeurt er als je niet kunt connecten met de database? Dan werkt opeens je hele script niet meer en dat is niet altijd wenselijk. Je wilt in dit geval dat de gebruiker gewoon de rest van de site kan gebruiken, ook al werkt dit systeem niet. "or die()" is daarom zelden een goede oplossing.

      De reden dat je DISTINCT op deze manier niet werkt is omdat je in eerste instantie alleen de unieke velden wilt ophalen, maar vervolgens er ook nog eens allemaal andere velden bij pakt.
      Ik weet niet zo goed wat je probeert op te halen, maar dit zou in principe alle unieke automerken moeten ophalen met de gegevens in die rows:

      SQL-Query

      1. SELECT brand, id, parent_id, model, type_year, roof FROM automerken GROUP BY brand

      Je ziet dat ik voor alle SQL related woorden hoofdletters gebruik. Dat is voor mij makkelijker onderscheiden welke onderdelen wat zijn. Mocht je nou een langere query, dan mag je hem ook opdelen door enters te gebruiken.
      Dit is alleen niet echt een handige aanpak, wat probeer je te doen?
      Met vriendelijke groet,

      Victor
      Beheerder ICTscripters
    • Gezien ik veel hulp heb gehad, lijkt het me wel zo fair om dit script hier te posten zodat wellicht andere er nog iets aan hebben. Nogmaals bedankt voor alle hulp.

      JavaScript Source Code

      1. <script type="text/javascript">
      2. $(document).ready(function(){
      3. $('#brand').on('change',function(){
      4. var brandID = $(this).val();
      5. if(brandID){
      6. $.ajax({
      7. type:'POST',
      8. url:'ajaxData.php',
      9. data:'brand_id='+brandID,
      10. success:function(html){
      11. $('#model').html(html);
      12. $('#type').html('<option value="">Selecteer uw model</option>');
      13. $('#roof').html('<option value="">Selecteer uw type</option>');
      14. }
      15. });
      16. }else{
      17. $('#model').html('<option value="">Selecteer uw brand</option>');
      18. $('#type').html('<option value="">Selecteer uw model</option>');
      19. $('#roof').html('<option value="">Selecteer uw type</option>');
      20. }
      21. });
      22. $('#model').on('change',function(){
      23. var modelID = $(this).val();
      24. if(modelID){
      25. $.ajax({
      26. type:'POST',
      27. url:'ajaxData.php',
      28. data:'model_id='+modelID,
      29. success:function(html){
      30. $('#type').html(html);
      31. }
      32. });
      33. }else{
      34. $('#type').html('<option value="">Selecteer uw model</option>');
      35. $('#roof').html('<option value="">Selecteer uw type</option>');
      36. }
      37. });
      38. });
      39. </script>
      Laat alles zien


      PHP Source Code

      1. <body>
      2. <div class="select-boxes">
      3. <?php
      4. //Include database configuration file
      5. include('dbConfig.php');
      6. //Get all brand data
      7. $query = $db->query("SELECT * FROM automerken ORDER BY brand ASC");
      8. //Count total number of rows
      9. $rowCount = $query->num_rows;
      10. ?>
      11. <select name="brand" id="brand">
      12. <option value="">Selecteer uw merk</option>
      13. <?php
      14. if($rowCount > 0){
      15. while($row = $query->fetch_assoc()){
      16. echo '<option value="'.$row['brand_id'].'">'.$row['brand'].'</option>';
      17. }
      18. }else{
      19. echo '<option value="">Dit automerk is niet beschikbaar.</option>';
      20. }
      21. ?>
      22. </select>
      23. <select name="model" id="model">
      24. <option value="">Selecteer uw model</option>
      25. </select>
      26. <select name="type" id="type">
      27. <option value="">Selecteer uw type</option>
      28. </select>
      29. <select name="roof" id="roof">
      30. <option value="">Selecteer uw type dak</option>
      31. </select>
      32. </div>
      33. </body>
      Laat alles zien

      PHP Source Code

      1. <?php
      2. //Include database configuration file
      3. include('dbConfig.php');
      4. if(isset($_POST["brand_id"]) && !empty($_POST["brand_id"])){
      5. //Get all model data
      6. $query = $db->query("SELECT * FROM automodel WHERE brand_id = ".$_POST['brand_id']." AND status = 1 ORDER BY model ASC");
      7. //Count total number of rows
      8. $rowCount = $query->num_rows;
      9. //Display models list
      10. if($rowCount > 0){
      11. echo '<option value="">Select model</option>';
      12. while($row = $query->fetch_assoc()){
      13. echo '<option value="'.$row['model_id'].'">'.$row['model'].'</option>';
      14. }
      15. }else{
      16. echo '<option value="">Geen model beschikbaar</option>';
      17. }
      18. }
      19. if(isset($_POST["model_id"]) && !empty($_POST["model_id"])){
      20. //Get all type data
      21. $query = $db->query("SELECT * FROM automerken WHERE model_id = ".$_POST['model_id']." AND status = 1 ORDER BY type_name ASC");
      22. //Count total number of rows
      23. $rowCount = $query->num_rows;
      24. //Display cities list
      25. if($rowCount > 0){
      26. echo '<option value="">Select type</option>';
      27. while($row = $query->fetch_assoc()){
      28. echo '<option value="'.$row['type_id'].'">'.$row['type_name'].'</option>';
      29. }
      30. }else{
      31. echo '<option value="">Geen type beschikbaar</option>';
      32. }
      33. }
      34. if(isset($_POST["type_id"]) && !empty($_POST["type_id"])){
      35. //Get all model data
      36. $query = $db->query("SELECT * FROM autodak WHERE type_id = ".$_POST['type_id']." AND status = 1 ORDER BY roof_type ASC");
      37. //Count total number of rows
      38. $rowCount = $query->num_rows;
      39. //Display models list
      40. if($rowCount > 0){
      41. echo '<option value="">Selecteer uw type dak</option>';
      42. while($row = $query->fetch_assoc()){
      43. echo '<option value="'.$row['roof_id'].'">'.$row['roof_type'].'</option>';
      44. }
      45. }else{
      46. echo '<option value="">Geen model beschikbaar</option>';
      47. }
      48. }
      49. ?>
      Laat alles zien
    • Ik mis ook nog steeds goede foutafhandeling. Als deze query om de een of andere reden niet goed wordt uitgevoerd zul je een lelijke error kijgen.

      PHP Source Code

      1. $query = $db->query("SELECT * FROM automodel WHERE brand_id = ".$_POST['brand_id']." AND status = 1 ORDER BY model ASC");
      -Edit-

      SELECT * is vaak juist geen goede oplossing. Het is beter om te definiëren welke waarde je wilt hebben, tenzij je zeker weet dat je alles gaat gebruiken. Scheelt op grote schaal in tijd.
      Met vriendelijke groet,

      Victor
      Beheerder ICTscripters

      Post werd 1x aangepast, het laatst door Victor ().

    • T.Nijborg wrote:

      Mijn advies voor het koppelen van dakdragers bij auto's zou zijn een extra relatie tabel te maken. Waarin je aangeeft per row, welke dakdrager op welke auto past. Die tabel qua velden ziet er dan ongeveer zo uit.


      id
      dakdrager_id
      auto_id
      Een koppeltabel heeft geen apart id nodig tenzij deze relatie aanvullende informatie heeft die je apart wilt aanspreken, dan is zo'n id handig / gerechtvaardigd. Anders is deze gewoon niet nodig.


      Victor wrote:

      $query = $db->query("SELECT * FROM automodel WHERE brand_id = ".$_POST['brand_id']." AND status = 1 ORDER BY model ASC"); -Edit-
      Los hiervan is dit knetter onveilig. Deze query is vatbaar voor SQL-injectie. Ook zou je voor de goede orde moeten controleren of $_POST['brand_id'] een positief geheel getal is (input filtering), dan zijn verdere controles eigenlijk overbodig maar dan zou het voor de goede orde nog steeds verstandig zijn om deze informatie te escapen in je query (output escaping).

      On a side note: Als je na controle (en voor uitvoering van de query) constateert dat $_POST['brand_id'] géén positief geheel getal is dan heeft het simpelweg geen zin om ook maar te proberen deze query uit te voeren omdat dat nooit (zinnige) resultaten zal opleveren. Het is misschien verleidelijk om een typecast te doen op brand id - (int) $_POST['brand_id'] - maar dat is toch min of meer een hack... Het lijkt mij beter om je input te controleren, zoals altijd eigenlijk.
    • FangorN wrote:

      Een koppeltabel heeft geen apart id nodig tenzij deze relatie aanvullende informatie heeft die je apart wilt aanspreken, dan is zo'n id handig / gerechtvaardigd. Anders is deze gewoon niet nodig.

      En waarom dan niet? Op het moment dat je de relaties gaat oproepen doe je dat door middel van de auto_id of dakdrager_id, om zo alle koppelingen te krijgen. Maar op het moment dat je deze relatie wilt updaten in de database, dus aanpassen of verwijderen, ga je dit dan doen door middel van 'WHERE auto_id = x AND dakdrager_id = x'. Waarom niet gewoon 'WHERE rel_id = x'.

      Ik vind persoonlijk dat elke relatie z'n eigen unieke key moet hebben, bijvoorbeeld om dus te verwijderen of te wijzigen.
      PHP, JAVA, C#, JAVASCRIPT, HTML(5), CSS(3) developer.
      Vragen?! Stuur me gerust een prive bericht :) !