Opslaan van gegevens van meerdere personen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Bas Bouman

Bas Bouman

07/07/2010 16:13:48
Quote Anchor link
Met de volgende twee bestanden zet ik de geboortedatum van familieleden in de database. Deze bestanden werken prima.
Maar als ik de geboortedata invoer moet ik na elk persoon de gegevens opslaan, terwijl ik pas wil opslaan als ik achter een hele rij personen de data gezet heb.

Het lukt me maar niet dit te veranderen. De enige mogelijkheid die ik zie, is dat ik de namen van familieleden in de database bij de velden plaats. Maar dat is erg omslachtig.

Is het mogelijk de code zo te veranderen dat er pas opgeslagen hoeft te worden als er achter meerdere personen een datum staat?


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?
include ("db_connect.inc.php");
$query = "SELECT * FROM leeftijd"; // de SQL-query die wordt uitgevoerd
$resultaat = ""; // hierin wordt het resultaat van de query opgeslagen
$resultaat = mysql_query($query, $db);
mysql_close($db); // database afsluiten

while(list($leefid, $naam, $gebdatum) = mysql_fetch_row($resultaat)){
    echo "<P>$naam <BR> geboortedatum: $gebdatum";
    echo "<BR><a href=\"bewerk.php?id=$id\">Invoeren</a><br>";
}

?>


BEWERK.PHP
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
<?php
include ("db_connect.inc.php");

if (isset($_POST["bevestiging"])){
    
    
    $query = "UPDATE leeftijd SET
        naam= '"
. $_POST["naam"] ."',
        gebdatum = '"
. $_POST["gebdatum"] . "',
        WHERE leefid='"
.$_POST["id"] ."'";
    mysql_query($query);
    echo "De volgende opdracht is uitgevoerd: <b>$query</b><br><hr>\n";
    echo "Record nummer " .$_POST["id"] . " is bijgewerkt<br>\n";
    echo "<a href=\"overzicht.php\">Terug naar het overzicht</a>";
}

else{
    $query="SELECT * FROM leeftijd WHERE leefid='". $_GET["id"] ."'";
    $resultaat = mysql_query($query);
    while (list($leefid, $naam, $gebdatum) = mysql_fetch_row($resultaat)){
        $nm=$naam;
        $gb=$gebdatum;
            }

?>

<form action="<?php echo($_SERVER["PHP_SELF"]);?>" method="post">
<input type="hidden" name="bevestiging" value="1">
<input type="hidden" name="id" value="<?php echo $_GET["id"];?>">
Naam:<input type="text" name="naam"
         value="<?php echo $nm;?>" size="20"><br>
geboortedatum: <input type="text" name="gebdatum"
        value="<?php echo $gb;?>" size="8"><br>
<hr>
<input type="Submit" value="Gegevens bijwerken">
<input type="Button" value="Terug" onclick="javascript:history.go(-1);">
</form>
<?php
}// else-blok afsluiten
?>
Gewijzigd op 09/07/2010 14:55:52 door Chris -
 
PHP hulp

PHP hulp

08/11/2024 16:02:06
 
P Lekensteyn

P Lekensteyn

07/07/2010 19:15:29
Quote Anchor link
SQL injection en XSS gevoeligheid.
Gebruik mysql_real_escape_string:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
$query = "UPDATE leeftijd SET
        naam= '". mysql_real_escape_string($_POST["naam"]) ."',
        gebdatum = '". mysql_real_escape_string($_POST["gebdatum"]) . "',
        WHERE leefid='" .mysql_real_escape_string($_POST["id"]) ."'";

Invoer controle:
$_POST['id'] mag alleen maar cijfers bevatten, dus:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$id = (int)$_POST['id'];

$_POST['gebdatum'] mag alleen maar een bepaald formaat zijn, bijvoorbeeld dd-mm-yyyy.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
if(preg_match('/^\d{2}-\d{2}-\d{4}$/', $_POST['gebdatum']) $datum = $_POST['gebdatum'];
else echo 'datum is niet ok';


XSS krijg je als id, datum of naam niet goed is gevalideerd.

Je zou met sessies kunnen werken voordat je wijzigingen doorbrengt.
 
Bas Bouman

Bas Bouman

07/07/2010 19:26:05
Quote Anchor link
Ik ga de fouten er met sessies uithalen. Bedankt voor de oplettendheid.

Toch is het wel vreemd, dat de query toch goed werkt. Waarschijnlijk accepteert PHP veel fouten.

Heb je ook een idee hoe ik het kan voorkomen dat ik na ieder persoon de gegevens moet opslaan? Hierover pieker ik me suf.
 
Bas Bouman

Bas Bouman

08/07/2010 09:15:04
Quote Anchor link
Het is heel vreemd, maar als ik mijn UPDATE query door die van jou vervang, krijg ik een foutmelding.

UPDATE leeftijd SET
naam= '". mysql_real_escape_string($_POST["naam"]) ."',
gebdatum = '". mysql_real_escape_string($_POST["gebdatum"]) . "',
WHERE leefid='" .mysql_real_escape_string($_POST["id"]) ."'";

Houdt deze wijziging verband met een ander gegeven dat ik nog moet vervangen?

Voor de oplossing van het probleem met de meerdere personen waar je in 1 keer alle gegevens achter kunt zetten, denk ik aan het toevoegen van een knop aan een session-variabele.

Dat moet met de volgende code kunnen.

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
<?php
                /*
                Session starten.
                */

                session_start();
                
                /*
                Zet de waarde in de variabele.
                */

                $log = "Dit is de waarde die ik wil meegeven";
                
                /*
                Registreer de session
                */

                session_register("log");
        
?>


Zit ik hiermee in de goede richting of kan ik deze weg beter niet inslaan?
Gewijzigd op 08/07/2010 09:45:27 door Bas Bouman
 
Bas Bouman

Bas Bouman

08/07/2010 19:45:01
Quote Anchor link
Ik probeer de fouten er zoveel mogelijk uit te halen, maar ik loop tegen de volgende zaken aan.

opmerking 1:
De int heb ik voor de controle van de id gebruikt. Dat gaat goed. Dank je wel.

opmerking 2:
Maar op welke manieren ik het ook probeer. Het lukt met niet of

mysql_real_escape_string

te gebruiken.Moet ik nog iets meer veranderen om mysql_real_escape_string
goed te laten werken?

opmerking 3:
De datum leverde bij mij geen fouten op, omdat ik de datum gewoon in een tekstvak getypt hebt. Nu ga ik dit veranderen. Maar waar moet de if-constructie die je me voor gebdatum gegeven hebt, in de code plaatsen. Ik neem aan dat deze onder

mysql_query($query);

komt, maar dan krijg ik een foutmelding.


opmerking 4:
Is het mogelijk om voor

<input type="Submit" value="Gegevens bijwerken">

een regel te plaatsen die niet 1 persoon laat zien, maar alle personen die in de database staan?
 
Obelix Idefix

Obelix Idefix

08/07/2010 22:19:49
Quote Anchor link
Je geeft wel aan dat je foutmeldingen krijgt, maar niet welke foutmeldingen.
 
Bas Bouman

Bas Bouman

09/07/2010 09:10:58
Quote Anchor link
Eigenlijk is het geen echte foutmelding. Ik krijg alleen een wit scherm.
 
- SanThe -

- SanThe -

09/07/2010 12:54:39
Quote Anchor link
Wit scherm is vaak het gevolg van een syntaxfout. Haakje vergeten of geen punt tussen verschillende strings of quote te veel/weinig. Ect.
Gewijzigd op 09/07/2010 13:07:29 door - SanThe -
 
Bas Bouman

Bas Bouman

09/07/2010 13:48:19
Quote Anchor link
Dan moet de syntaxfout in dit gedeelte zitten,

UPDATE leeftijd SET
naam= '". mysql_real_escape_string($_POST["naam"]) ."',
gebdatum = '". mysql_real_escape_string($_POST["gebdatum"]) . "',
WHERE leefid='" .mysql_real_escape_string($_POST["id"]) ."'";

Ik heb nog even gedacht dat er geen spatie hoorde voor de punt na leefid='" , maar dat is het niet.

De volgende code werkt wel. Maar dan gebruik ik de mysql_real_escape_string niet.

$query = "UPDATE leeftijd SET
naam= '". $_POST["naam"] ."',
gebdatum = '". $_POST["gebdatum"] . "'
WHERE leefid='" .$_POST["id"] ."'";
 
- SanThe -

- SanThe -

09/07/2010 14:00:44
Quote Anchor link
Vóór de WHERE staat een komma, die moet weg.

Heb je error_reporting(E_ALL) aanstaan?
Gewijzigd op 09/07/2010 14:03:16 door - SanThe -
 
Bas Bouman

Bas Bouman

09/07/2010 14:11:43
Quote Anchor link
De komma voor WHERE heb ik weggehaald. Dank je wel.

Maar ik krijg nog een wit scherm.

Ik weet niet wat je bedoelt met error_reporting(E_ALL). Hoe kan ik dat aanzetten?
 
- SanThe -

- SanThe -

09/07/2010 14:16:48
Quote Anchor link
Helemaal bovenin zetten.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);

// rest
?>
 
Bas Bouman

Bas Bouman

09/07/2010 14:42:01
Quote Anchor link
Dank je wel.

De code staat bovenaan.

Maar waar krijg ik dan de foutmeldingen te zien?
 
- SanThe -

- SanThe -

09/07/2010 14:46:40
Quote Anchor link
Als je nog steeds alleen een wit scherm hebt dan zal je eens in de logfiles moeten kijken. Kan je daar niet bij dan zal je de hele code door moeten lopen en alles checken op correctheid.
Gewijzigd op 09/07/2010 14:47:11 door - SanThe -
 
Bas Bouman

Bas Bouman

09/07/2010 14:56:06
Quote Anchor link
Ik voe me nu echt een beginneling.

Hoe kan ik bij de logfiles komen?
 
- SanThe -

- SanThe -

09/07/2010 14:59:11
Quote Anchor link
Eigen server: Even in de Apache-dirs de logs-dir opzoeken.
Hosting: Dan kan je er waarschijnlijk niet bij.
 
P Lekensteyn

P Lekensteyn

09/07/2010 15:10:33
Quote Anchor link
XAMPP voor windhoos: C:\xampp\logs\error_log
LAMPP: /opt/lampp/logs/error_log
Apache 2.x: /usr/local/apache2/logs/error_log
 
Bas Bouman

Bas Bouman

09/07/2010 15:25:28
Quote Anchor link
Tja, ik zit bij hosting.
 
Bas Bouman

Bas Bouman

11/07/2010 07:18:04
Quote Anchor link
Is er met de usbwebserver 7 ook een foutcontrole mogelijk?
Gewijzigd op 11/07/2010 15:29:43 door Bas Bouman
 



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.