HTML 5 form met PHP while loop

  • Goedemiddag heren & Dames,


    ik ben bezig om voor mijn werkgever een form te maken om dakdragers, voetensets en dak koffers voor de juiste auto te tonen. Nu ben ik een concurrent tegen gekomen die daar een gebruiksvriendelijk systeem heeft ontwikkelt om op auto merk, model, type & jaartal en soort dak de juiste producten te tonen. (concurrent: http://www.dakdragerstore.com)


    Nu wil ik graag voor mijn werkgever dit systeem maken echter kom ik er niet uit hoe ik nu meerdere selectie velden kan voorzien van de juiste informatie. Zo wil ik bijvoorbeeld dat wanneer er bij merk:"BMW" er bij model:"" alleen de modellen van BMW worden getoond en dat wanneer er bij model"3-serie Touring"wordt geselecteerd erbij het selectie veld type en jaar alleen de mogelijkheden die daar bij horen worden getoond.


    Nu heb ik een getracht een begin te maken maar alle eerlijkheid gebied dat ondanks mijn zoektocht naar tutorials ik er niet uit kom en vandaar dat ik dit forum benader voor iemand die mij hierbij wilt helpen.


    Op dit moment bestaat mijn database uit meerdere tabellen:
    - dakdragers
    - dakkoffers
    - autos (hier staan alle merken, mogelijke modellen, types jaartallen en soort daken in)
    - Voetensets


    Waar loop ik op vast?
    - Database structuur voor deze producten
    - Meerdere select velden vullen met 1 while loop: merk, model, type_jaar, soort dak,
    - Hoe ik database data uit verschillende tabellen kan combineren in één html form




  • Hoi Marijn,


    Allereerst welkom op het forum! ;)


    Om te doen wat jij wil doen zul je er meer dan alleen php bij moeten trekken. PHP is serverside en kan dus op zichzelf niet live je selectformulieren aanpassen. Dit kun je doen door Ajax te gebruiken.


    Een aantal relevante links hiervoor:


    Intro: https://www.w3schools.com/php/php_ajax_intro.asp


    Database: https://www.w3schools.com/php/php_ajax_database.asp


    Wat betreft je database structuur zul je een manier moeten verzinnen waarbij je makkelijk aan kan geven welke dragers bij welke auto's passen. Er vanuit gaande dat een drager op meerder auto's past zul je dat dus op een manier moeten opslaan in je database. Wellicht een derde tabel producten die JOINS met de rest van je tabellen om maar wat te roepen.


    Deze vraag snap ik even niet, maar dan kan aan mij liggen:

    Citaat van Marijn


    - Meerdere select velden vullen met 1 while loop: merk, model, type_jaar, soort dak


    Je mag me ook altijd op Skype toevoegen. In dit soort specifieke gevallen is dat altijd makkelijker meekijken. Mijn skype is te vinden op mijn profiel.

  • Beste Victor,


    bedankt voor uw reactie, ik zal in eerste instantie de links die u heeft gepost bekijken, maar ik heb een vermoeden dat dit een stuk gecompliceerder is dan ik op voorhand had gedacht.


    Uw aanname dat dak dragers op meerdere modellen en merken passen is correct. Ik dacht er in eerste instantie aan om met een parent_id te werken om zo dakdragers aan meerdere auto merken en modellen te kunnen koppelen.


    U geeft aan dat u mijn vraag niet begreep omtrent de while loop. Ik maakte een denk fout dat het mogelijk was om met een while loop meerdere dropdowns van informatie te voorzien, maar nu ik uw reactie lees werkt dat niet op die manier.


    Nogmaals bedankt voor uw reactie en ik ga er mee aan de slag.

  • Op een sidenote, het is wel te doen in PHP. Enkel een stuk minder gebruiksvriendelijk.
    Met behulp van Ajax kan je de forms automatisch laten updaten, wat zorgt voor een betere ervaring.


    Als je enkel in PHP wil blijven zul je een update knop moeten toepassen die elke keer de informatie die je al hebt pakt, dat vergelijkt met de database en vervolgens weer data teruggeeft die je kunt gebruiken om een nieuw formulier te maken. Deze stappen volg je net zo lang tot het einde van het formulier is bereikt, maar zoals je ziet moet je daarvoor een aantal keer de pagina herladen wat de userfriendliness negatief beïnvloed.


    Ik hoor wel of je eruit komt, succes! ;)


    Je mag overigens gewoon je zeggen!



    -Edit-


    Zie T.Nijborg's opmerking. Het gaat hier om een veel op veel relatie door middel van een relatietabel. Je hebt meerdere auto's en meerdere dakdragers die op verschillende auto's passen. (Oftewel meerdere auto's passen op meerdere dakdragers en andersom.)

    Met vriendelijke groet,


    Victor
    Beheerder ICTscripters

    Bewerkt één keer, laatst door Victor ().

  • Martijn,


    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.


    Code
    id
    dakdrager_id
    auto_id

    Betreft Victor's antwoord zou het ook iets makkelijker door met javascript gewoon een http request te sturen naar een stukje php om de data op te halen. Ajax gaat meteen een stapje verder.

    PHP, JAVA, C#, JAVASCRIPT, HTML(5), CSS(3) developer.
    Vragen?! Stuur me gerust een prive bericht :) !

  • http://blog.chapagain.com.np/u…-populate-selection-list/


    Nog een voorbeeld waarin een lijst met steden word weergeven op basis van het gekozen land.
    In het voorbeeld gebruiken ze een array, maar dit kan natuurlijk ook iets uit de dabase zijn.


    Verder kun je op in het idee van het voorbeeld te blijven, na het kiezen van een land de stad kiezen, die vervolgens weer een lijst kan tonen met wijken, gevolgd door straatnamen.


    Land > Stad > Wijk > Straatnaam.
    En dat kan natuurlijk ook zijn zoals je het nodig bent met:
    Merk > Model > Type & Jaartal > Dak

  • Bedankt voor jullie reacties, ik ben met een aantal voorbeelden die jullie hebben gegeven aan de slag gegaan.


    Ik ben nog niet echt bekend met het programmeer werk, dus vandaar dat ik zoveel vragen stel. Uiteraard probeer ik wel zoveel mogelijk zelf te zoeken voordat ik vragen stel.


    Nu gebruik ik voor de auto's op dit moment 1 tabel met volgende structuur:


    id - parent_id - brand - model - type_year - roof_1 - roof_2 - roof_3


    Er staan 1650 regels in waar van 39 verschillende auto merken.


    Nu had ik ergens gelezen dat ik met DISTINCT er voor kan zorgen dat er bij de dropdown voor Merken alleen unieke waarde worden getoond, echter toont hij nu alle regels in de database en staat er dus voor iedere regel een merk.


    Mijn doelstelling is dus dat er maar 39 merken getoond worden. Maar ik kom er niet helemaal uit met de DISTINCT functie.

  • 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
    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?

  • 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.



  • 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
    $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

    Bewerkt één keer, laatst door Victor ().

  • 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.



    $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.

  • Citaat van FangorN

    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 :) !

  • 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'.

    En dat doe je alleen als je extra attributen hebt, zoals ik hier al aangaf:

    tenzij deze relatie aanvullende informatie heeft die je apart wilt aanspreken

    Anders, als relaties tussen twee of meer tabellen veranderen, is het veel makkelijker om de relaties op grond van de tabel die je als uitgangspunt neemt te verwijderen en opnieuw te inserten. In dat geval is een auto increment id nogal loos.

Participate now!

Heb je nog geen account? Registreer je nu en word deel van onze community!