Formulier met radiobuttons opslaan mysql

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jelle Vl

Jelle Vl

14/07/2010 12:09:39
Quote Anchor link
Beste,

Ik ben bezig een formulier te ontwikkelen waarmee men de aanwezigheden per evenement kan bijhouden. Nu stoot ik echter op een aantal problemen:
De waarde van de radio buttons worden niet opgeslagen in de DB, het invoegen in de DB gebeurd ook niet volgens de juiste methode. Ik heb reeds verschillende zaken geprobeerd maar niets kwam tot een goede oplossing.
Hieronder de code van het probleem
Quote:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<?
    include("../../tools/dbconnect.php");
    //Opdracht selecteren
    $i=0;
    
    $sql_opdracht = "SELECT * FROM opdrachten WHERE opdrachtId=$aanwezigid";
    $query_opdracht = mysql_query($sql_opdracht);
    while ($uitvoer = mysql_fetch_array($query_opdracht))
    {


        $aantal_nodig = $uitvoer["aantal"];
        $opdracht = $uitvoer["omschrijving"];
        
    }

    //Formulier aanmaken om aanwezigheden weer te geven
        echo "<TABLE BORDER=\"0\" HEIGHT=\"50\" align=\"center\">
        <TR>
            <TD WIDTH=\"50\" ALIGN=\"CENTER\" VALIGN=\"MIDDLE\"><IMG src=\"../img/zoeken.png\" BORDER=\"0\"></TD>
            <TD ALIGN=\"\" VALIGN=\"MIDDLE\"> <B><U>: : $opdracht : :</U></B></TD>
        </TR>
        </TABLE><BR><BR>"
;
    
                                echo " <form method=\"POST\" action=\"$php_self\">
                                        <table id=\"opdracht\">
                                            <tr>
                                                <td width=\"150\" align=\"center\"> Naam </td>
                                                <td width=\"150\" align=\"center\"> E-mail </td>
                                                <td width=\"100\" align=\"center\"> Aanwezig </td>
                                                <td width=\"100\" align=\"center\"> Gewettigd afwezig </td>
                                                <td width=\"100\" align=\"center\"> Ongewettigd afwezig </td>
                                            </tr>"
;
                            
                            // Mensen uit DB halen die ingeschreven zijn voor opdracht
                            $sql_waar = "SELECT * FROM inschrijving WHERE opdrachtId=$aanwezigid ORDER BY ` tijdInschr` ASC";
                            $query_waar = mysql_query($sql_waar);
                            while ($uitvoer = mysql_fetch_array($query_waar))
                            {

                                $i++;
                                
                                $naam = $uitvoer["naam"];
                                $email = $uitvoer["email"];
                                $test = $i;
                                
                            //Aanwezigheden in DB stoppen
                                if (($aanwezigid != "") AND ($naam != ""))
                                {

                
                                    $sql_toevoegen = "INSERT INTO opdrachten_aanwezigheid VALUES ($aanwezigid, \"$evenement\", \"$naam\", \"$test\")";
                                       if (!$result = mysql_query($sql_toevoegen)) {
                                                print $result;
                                                print "<HR>Fout bij toevoegen!<BR><BR>Contacteer de webmaster<BR><BR>";
                                                echo "<BR>$sql";
                                        }
else {
                                        echo "<p>Opdracht succesvol toegevoegd ...</p>";}
                                        
                                }

                                
                                echo "
                                        <tr>
                                            <input type=\"hidden\" name=\"aanwezigid\" value=\"$aanwezigid\"  size=\"20\">
                                            <input type=\"hidden\" name=\"evenement\" value=\"$opdracht\"  size=\"100\">
                                            <td>- "
.$naam."</td><input type=\"hidden\" name=\"naam\" value=\"$naam\"  size=\"20\">
                                            <td>"
.$email."</td>
                                            <td align=\"center\"><input type=\"radio\" name=\"$test\" value=\"aanwezig\"></td>
                                            <td align=\"center\"><input type=\"radio\" name=\"$test\" value=\"gewettigd\"></td>
                                            <td align=\"center\"><input type=\"radio\" name=\"$test\" value=\"ongewettigd\"></td>
                                        </tr>"
;                            
                            }

                            echo "
                                    </table><BR>
                                    <center><input type=\"submit\" value=\"Aanwezigheden bevestigen\" name=\"sub\">
                                    </form>"
;            

            ?>


Zou iemand mij hiermee kunnen helpen? Alle hulp is welkom!

Mvg,

Jelle
 
PHP hulp

PHP hulp

03/07/2020 00:29:05
 
Mick ForSure

Mick ForSure

14/07/2010 12:35:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$sql_toevoegen
= "INSERT INTO opdrachten_aanwezigheid (aanwezigheid, evenement, naam, email) VALUES($_POST[$aanwezigid], '$_POST[$evenement]', '$_POST[$naam]', '$_POST[$test]')";
?>


edit: en ik denk dat je met $test $_POST[$test] bedoeld net als bij de rest van de vars..

ook moet je je input escapen! mysql_real_escape_string($input) gebruiken
Gewijzigd op 14/07/2010 12:36:28 door Mick ForSure
 
Mark L

Mark L

14/07/2010 14:45:47
Quote Anchor link
Een aantal punten:

1). Mick: je maakt de fout dat de variabele $evenement niet bestaat (en zo ook andere variabelen in $_POST[$evenement]; Dit moet uiteraard $_POST['evenement'] zijn. Dit bedoel je ook, denk ik.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$sql_toevoegen
= "INSERT INTO opdrachten_aanwezigheid (aanwezigheid, evenement, naam, email) VALUES($_POST[aanwezigid], '$_POST[evenement]', '$_POST[naam]', '$_POST[test]')";
?>

2). Variabelen gaan buiten quotes. Deze zijn nu makkelijk te herkennen.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$sql_toevoegen
= "INSERT INTO opdrachten_aanwezigheid (aanwezigheid, evenement, naam, email) VALUES(".$_POST['aanwezigid'].", '".$_POST['evenement']."', '".$_POST['naam']."', '".$_POST['test']."')";
?>

3). Zoals Mick terecht aangaf, word er niets ge-escaped. Dit zorgt ervoor dat een kwaadwillende veel mogelijkheid heeft in jouw database. Zo moet het:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$sql_toevoegen
= "INSERT INTO opdrachten_aanwezigheid (aanwezigheid, evenement, naam, email) VALUES(".myqsl_real_escape_string($_POST['aanwezigid']).", '".myqsl_real_escape_string($_POST['evenement'])."', '".myqsl_real_escape_string($_POST['naam'])."', '".myqsl_real_escape_string($_POST['test'])."')";
?>


PHP-opmaak/HTML:
4). Je begint een tabel. Als je de eerste rij van de tabel hebt gemaakt, kijk je of er een formulier verzonden is. Als dat het geval is, zet je middenin de tabel - zonder een rij of een cell te maken - je tekst. Regel 45-56. Ik raad je aan om dit eerder in het script te doen.
Hierbij geen voorbeeldcode.

5). Controle of een formulier verstuurd is.
Jij gebruikt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
if (($aanwezigid != "") AND ($naam != ""))
?>

Je kijkt of de variabele $naam is gezet, waarvan jij uitgaat dat deze is gezet als het formulier verstuurd is.
Gebruik voor controle of het formulier verstuurd is liever:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST')
?>

6). Geen gebruik van $_POST-vars. Al genoemd door Mick. Hier extra info. Door dit niet te gebruiken, verziek je je site namelijk:
ALS register_globals aanstaat, zal de variabele $naam gezet worden, als er via een input een waarde is ingevuld, die als input-name had 'naam'. Echter word standaard de superglobal $_POST['naam'] gezet met dezelfde waarde. Deze superglobal is overal te gebruiken (in elke functie, in elke class), in tegenstelling tot $naam. Maar dit is niet het grootste probleem.
Een mooi voorbeeld staat in jouw code.
Als naam verstuurd word naar je script (d.m.v. je formulier), word de variabele $naam gezet met de waarde. Dan komt jouw script aan op regel 40 en overschrijft de variabele $naam. Nu wil jij weer de variabele $naam gebruiken op regel 45, maar je wilt de variabele die is meegestuurd van het formulier. Helaas is deze niet meer aanwezig. Of toch! Jaja; $_POST['naam'] bevat deze waarde.
Geen voorbeeld bij deze uitleg.

7. De sql op regel 6 krijgen maximaal één resultaat terug (je ID's zijn als het goed is uniek). Dit betekend dat je geen while-loop nodig hebt. Je kunt het resultaat in een keer fetchen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
    $sql_opdracht
=  "SELECT * FROM opdrachten WHERE opdrachtId=".$_POST['aanwezigid'];
    $query_opdracht = mysql_query($sql_opdracht);
    $result = mysql_fetch_assoc($query_opdracht);
    $aantal_nodig = $result["aantal"];
    $opdracht = $result["omschrijving"];
?>

8). Controle op de input. Input is niet te vertrouwen. Ook als het in een hidden formulier zijn, is het te veranderen. Daarom moet elke input van buitenaf gecontroleerd worden. Als je iets uit je database haalt hoeft dit uiteraard niet. Hiermee bedoel ik de resultaten die uit je database komen. Niet die je in een SQL-statement meestuurt.
Ik laat het zien. Bij de code van #7 verwacht je dat in $_POST['aanwezigid'] een nummer zit. Maar wie weet zit hier iets heel anders in.
In onderstaande code heb ik (int) voor de variabele gezet. Dit kan alleen in dit geval, in veel gevallen zul je d.m.v. een if-statement moeten controleren of de waarden correct zijn en zo niet, een error geven. door (int) toe te voegen, word de variabele tot integer (getal) gemaakt, waardoor elke schadelijke code er direct uitgaat. Dit punt hoort ook bij punt#3, want daar word d.m.v. escapen ook vermeden dat schadelijke informatie naar de database gestuurd word.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
    $sql_opdracht
=  "SELECT * FROM opdrachten WHERE opdrachtId=".(int)$_POST['aanwezigid'];
    $query_opdracht = mysql_query($sql_opdracht);
    $result = mysql_fetch_assoc($query_opdracht);
    $aantal_nodig = $result["aantal"];
    $opdracht = $result["omschrijving"];
?>


9). Bij echo gebruik je single quotes.
Regel 52
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo '<BR>'.$sql;
?>

10). area-, base-, br-, col-, frame-, hr-, img-, input-, link-, meta- & param-Tags sluiten zichzelf af. Dit gebeurd in xHTML d.m.v. een / aan het eind van de tag:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo '<BR />'.$sql;
?>

11). Je gebruikt zowel hoofdletters als kleine letters voor HTML-tags (rgl 18: TD en rgl 26 td) Maak er een gewoonte van om één manier te kiezen. Zo ontstaat minder verwarring en het is mooier. Ik adviseer je - met achterliggend advies van W3Schools - om kleine tekens te gebruiken.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo '<br />'.$sql;
?>

12). De center-tag is depricated. Deze kun je daardoor beter niet meer gebruiken en dit oplossen in je CSS.
13). Je checkboxen krijgen de name-attribute wat een getal is. Dit is bij mijn weten verboden. Er moet minimaal één letter in voorkomen.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo '<input type="radio" name="checkbox_'.$test.'" value="aanwezig" />';
?>

14). Ook $php_self is als superglobal opgenomen.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo '<form method="POST" action="'.$_SERVER['PHP_SELF'].'">';
?>

15). $_SERVER['PHP_SELF'] is door de PATH_INFO die meegestuurd kan worden gevoelig voor XSS attacks. Dit kan opgelost worden door de superglobal $_SERVER['SCRIPT_NAME'] te gebruiken. Deze moet wel gepaard gaan met de functie basename();
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo '<form method="POST" action="'.basename($_SERVER['SCRIPT_NAME']).'">';
?>

16). Zinloze statement op regel 50. Als $result false is, dan word result geprint. Dat is nergens voor nodig. Print liever de error, of print liever niets (de error is ook niet bepaald gebruiksvriendelijk).
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
if (!$result = mysql_query($sql_toevoegen)) {
    print mysql_error();
?>

17). SQL-statement echo-en. Dit is alleen nuttig in een testfase, en daarna sterk af te raden, omdat kwaadwillenden hierdoor informatie over jouw database kunnen vergaren en ook makkelijker jouw SQL-statement kunnen saboteren. Je geeft ze waardevolle informatie. Dit zie ik op regel 52. Ook valt me op dat de variabele $sql eigenlijk niet bestaat... Je bedoelde waarschijnlijk $sql_waar, maar in beide gevallen is dit gevaarlijk.
18. Zorg voor een duidelijke verdeling van whitespaces. Het begint mooi, maar vanaf regel 23 gaan we opeens heel veel tabs naar voren. Nergens voor nodig. Zorg ervoor dat na elke open-accolade ({) de volgende regels een tab erbij krijgen en vanaf elke sluit-accolade (}) de regels (en de regel waar die op staat) een tab eraf krijgen.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
echo 'test';
for ($i = 0; $i < 5; $i++) {
    if ($i === 3) {
        echo 'Nummer 3<br />'.PHP_EOL;
    }

    else {
        echo 'Geen nummer 3<br />'.PHP_EOL;
    }

    echo 'Wauw!';
}

?>

19). Op bijvoorbeeld regel 60 begin je heel veel tabs naar voren. Deze tabs staan BINNEN een echo-statement en worden ook meegestuurd naar de browser. Tabs kunnen voor overzicht zorgen in de broncode, maar als je het doet, doe het dan zoals bij 18 aangegeven staat, alleen dan is de accolade vervangen door elk willekeurige open- en sluit-tag.
Dus:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<table>
    <tr>
        <td>Content 1</td>
        <td>Content 2</td>
        <td>Content 3</td>
    </tr>
</table>


Dit kan makkelijk gemaakt worden door elke echo apart te doen. PHP_EOL betekend een End of Line. Dit word ook wel eens met \n of \r\n aangegeven, maar dit verschilt per OS, dus met PHP_EOL zit je altijd goed.
\t betekend een tab. De slash-termen (\t, \n ...) moeten altijd binnen double-quotes (")
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
echo '<table>'.PHP_EOL;
echo "\t".'<tr>'.PHP_EOL;
echo "\t\t".'<td>Content 1</td>'.PHP_EOL;
echo "\t\t".'<td>Content 2</td>'.PHP_EOL;
echo "\t\t".'<td>Content 3</td>'.PHP_EOL;
echo "\t".'</tr>'.PHP_EOL;
echo '</table>'.PHP_EOL;
?>

20). De backticks op regel 48 zijn gewoon lelijk:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$sql_waar
= "SELECT * FROM inschrijving WHERE opdrachtId=$aanwezigid ORDER BY tijdInschr ASC";
?>

21). Door het toevoegen van * aan een SELECT-statement (in je SQL) haal je ALLE database-cellen op. Vaak heb je ze niet allemaal nodig, en kun je beter de cellen die je nodig hebt specifiseren in de statement. Dit laat ik zien op de SQL van regel 6:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
    $sql_opdracht
=  "SELECT aantal, omschrijving FROM opdrachten WHERE opdrachtId=".(int)$_POST['aanwezigid'];
?>

22). $test = $i; Op line 42 zet je de variabele $test. Hier doe je echter niets anders mee dan hem later echo-en. Dit is dus een zinloze variabele, omdat deze dezelfde waarde als $i heeft. Je hoeft deze dus niet nog een keer te setten. Dat is hetzelfde als:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$value
= 'Hallo';
$groet = $value;
echo $groet;
// De variabele $value kan beter ge-echo'd worden. Dat scheelt een variabele.
?>

23). Ik zou het bijna vergeten. De functie mysql_fetch_assoc(); blijkt sneller dan mysql_fetch_array();. Daarom raad ik je aan om mysql_fetch_assoc(); te gebruiken.
24). Voor duidelijkheid raad ik je aan de accolade (}) van regel 54 naar de volgende regel te plaatsen. Dan zie je waar de blokken beginnen en eindigen.
25). Misschien nog een idee om de veldnamen van je database_tabel bij je INSERT-statement te voegen. Dit heeft Mick al gedaan. Zie zijn code voor het voorbeeld en combineer deze met #3.

Hoop dat je er wat mee doet; anders was dit een verspild uur (ik denk zelfs langer) van mijn leven...

P.S. valt me op dat mijn lijst fouten langer is dan jouw script...
Gewijzigd op 14/07/2010 14:49:31 door Mark L
 
Jelle Vl

Jelle Vl

14/07/2010 14:48:17
Quote Anchor link
Mark L. Heel hard bedankt dit heeft me echt heel hard vooruit geholpen!! Dank je voor je tijd en de goede tips!!
 
Mark L

Mark L

14/07/2010 14:53:20
Quote Anchor link
Graag gedaan. Je bent waarschijnlijk nog druk bezig met lezen.

Nog één ding dat mij opvalt, maar misschien geen fout is.
Als je een fout in je SQL hebt (insert SQL) zeg je 'Contacteer de webmaster'. Maar geef je hier ook de mogelijkheid voor?

En je controleert ook niet of je query gelukt is bij de SELECT-querys.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$sql_waar
= "SELECT * FROM inschrijving WHERE opdrachtId=$aanwezigid ORDER BY ` tijdInschr` ASC";
$query_waar = mysql_query($sql_waar);
if ($query_waar) {
    while ($uitvoer = mysql_fetch_array($query_waar))
    {

        // ...
    }
}

?>
 
Jelle Vl

Jelle Vl

14/07/2010 14:56:43
Quote Anchor link
Neen, die mogelijkheid bestaat niet! Ja idd nog druk bezig met lezen! ik ga dit bij al mijn formulieren veranderen want sommige dingen zijn precies niet echt katholiek! Heel vriendelijk bedankt voor de uitgebreide uitleg!
 
Mick ForSure

Mick ForSure

14/07/2010 15:13:41
Quote Anchor link
Wow Mark L, ik was 30sec bezig om te lezen en te posten vndaar een klein foutje (A) maar 30sec ken je van jou niet zeggen \o/
 
Mark L

Mark L

14/07/2010 15:33:29
Quote Anchor link
haha, ik normaal ook hoor.
't Was vooral frustrerend toen ik een stukje wilde kopiëren uit zijn code, en toen opeens op echo drukte..
Toen kwam ik op PHP.net uit en was mijn post gewist!!
Dus ik begon opnieuw. Maar gelukkig was ik toen nog maar bij nummer 5 ofzo...
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.