Verwerken van formulier
Ik zit met een probleem waar ik al enkele dagen over aan het denken ben. Ik ben bezig met een website waar mensen een soort van wedstrijd kunnen starten. Hiervoor moeten ze een aantal vragen invullen. Zo zijn er vragen die bij alle onderwerpen terug komen en en zijn vragen die specifiek zijn voor bepaalde onderwerpen.
De manier waarop ik de formulieren wil verwerken op dit moment is het volgende:
- Eerst selecteert de gebruiker een onderwerp en gaat hij verder naar de volgende pagina (step2.php);
- Op step2.php worden alle vragen geselecteerd die bij alle onderwerpen terug komen. Wanneer de gebruiker verder gaat, gaat hij naar de pagina step3.php;
- Op de pagina step3.php worden alle vragen getoond die specifiek zijn voor het onderwerp.
Wanneer deze vragen zijn ingevuld, moeten alle gegevens van de 3 formulieren worden opgeslagen in een database.
Aangezien dat de standaard vragen altijd gelijk zijn, is het makkelijk om de waarden hiervan toe te kennen aan een variabele. Maar de vragen voor een onderwerp kunnen verschillen in aantal, bv. voor het ene onderwerp 3 vragen en voor het andere onderwerp 5 vragen.
Het liefste wil ik alle antwoorden op vragen in een aparte variabele die ik dan doorgeef aan een functie die zorgt dat alles in een database komt te staan.
Nu is mijn vraag hoe ik dit het beste kan doen. Alle voorstellen zijn welkom en wanneer je een andere manier hebt wat volgens jou op een makkelijkere en/of snellere manier werkt hoor ik het graag!
Alvast heel erg bedankt!
de ingevulde waarden kunnen in dat geval met $_POST[..] uitgelezen worden. $_POST is hier gewoon een array welke je met een foreach kunt doorlopen:
Op de plaats van de echo moet ik dan dus de waarde doormiddel van een function doorsturen?
De opbouw van mijn functions is dat ik de waarde meegeef, de sql query opbouw, dan de waarden doe binden en daarna alles doe uitvoeren. Kan ik dit ook toepassen bij jouw voorbeeld frank?
Moet ik het dan op deze manier doen:
Nu ik dit typ merk ik dat het naar mijn mening niet gaat lukken omdat ik dan voor elke vraag de functie oproep.
Op kan ik dat doen en elke keer een nummer meegeven om zo de vragen met hetzelfde nummer aan elkaar te koppelen?
Hopelijk is het allemaal duidelijk wat ik hierboven heb getypt, alvast bedankt!
Ik probeer het kwartje bij je te laten vallen..
Je hebt voor ieder veld in je formulier een name attribuut. Als je die 'name' nu eens gelijk maakt aan de kolomnaam in de database.. dan weet je dus welke kolom welke waarde dient te krijgen
gauw even een voorbeeldje in elkaar gezet. Je moet nog wel zorgen dat je fouten gaat afvangen, bijvoorbeeld als een kolomnaam niet bestaat.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
// Test array $_POST
$_POST = array('naam' => 'Frank', 'email' => '[email protected]');
// kolomnamen achter elkaar zetten met komma's er tussen
$columnnames = implode(', ', array_keys($_POST));
// alle $_POST variabelen in een nieuwe array met quotes er omheen
foreach($_POST as $value) {
$values[] = "'" . mysql_real_escape_string($value) . "'";
}
// waardes achter elkaar zetten met komma's er tussen
$values = implode(', ', $values);
// query opbouwen
$query = "INSERT INTO table_name (" . $columnnames . ") VALUES (" . $values . ")";
echo $query;
?>
// Test array $_POST
$_POST = array('naam' => 'Frank', 'email' => '[email protected]');
// kolomnamen achter elkaar zetten met komma's er tussen
$columnnames = implode(', ', array_keys($_POST));
// alle $_POST variabelen in een nieuwe array met quotes er omheen
foreach($_POST as $value) {
$values[] = "'" . mysql_real_escape_string($value) . "'";
}
// waardes achter elkaar zetten met komma's er tussen
$values = implode(', ', $values);
// query opbouwen
$query = "INSERT INTO table_name (" . $columnnames . ") VALUES (" . $values . ")";
echo $query;
?>
Ik wist niet helemaal zeker hoe ik de kolomnamen en waardes moest verwerken. Bovenstaande code lijkt me in ieder geval vrij logisch. Ik ga het straks eens proberen. Mocht het niet lukken laat ik het weten.
In ieder geval alvast heel erg bedankt Frank!!
Maar dat zal je waarschijnlijk niet in je database doen. En dus een foutmelding geven.
Daarnaast beveilig je nu wel de waarden, maar als ik een formulier verzend naar jouw verwerkscript, met als kolomnaam iets als onzin'); DROP TABLE table_name;, dan ben je dus alles mooi kwijt.
Natuurlijk, dat spreekt voor zich.
Maak gewoon een zogenaamde whitelist aan met geldige kolomnamen en controleer voor ieder element in de $_POST array of deze in de lijst voorkomt. Zo niet dan sla je die niet op in de database.
Bij een sneller google search kom ik op een script uit op de website codewall.
Iemand die ervaring heeft met whitelist systemen en een bepaald systeem kan aanraden?
stel je hebt deze kolommen in de database: naam, email, telefoon.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
// Test array $_POST
$_POST = array('naam' => 'Frank', 'email' => '[email protected]', 'verzenden' => '');
$whitelist = array('naam', 'email', 'telefoon');
foreach($_POST as $key => $value)
{
if(in_array($key, $whitelist))
$post[$key] = $value;
}
// $post bezit nu enkel geldige Postvariabelen.
print_r($post);
?>
// Test array $_POST
$_POST = array('naam' => 'Frank', 'email' => '[email protected]', 'verzenden' => '');
$whitelist = array('naam', 'email', 'telefoon');
foreach($_POST as $key => $value)
{
if(in_array($key, $whitelist))
$post[$key] = $value;
}
// $post bezit nu enkel geldige Postvariabelen.
print_r($post);
?>
Ahh, klopt inderdaad, ik denk te moeilijk na