Lek?
dit is niet mijn hele code, alleen de code die het in de database stop en eruit haalt.
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
24
25
26
27
28
29
30
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
<?php
if($_SERVER['REQUEST_METHOD'] == "POST") {
if (empty($_POST['naam'])) {
echo "Naam was leeg!"; // Naam is leeg
} elseif (empty($_POST['bericht'])) {
echo "Bericht was leeg!"; // Bericht was leeg
} else { // Niks aan de hand!
$naam = $_POST['naam']; // Wat=wat?
$bericht = $_POST['bericht'];
$naam = mysql_real_escape_string($naam); // voor de veiligheid
$bericht = mysql_real_escape_string($bericht); // met real_escape_string
// de query: In de tabel blog, in kolom naam & bericht, de inhoud van $naam en $bericht doen
$sql = "
INSERT INTO blog
(
naam,
bericht
)
VALUES
(
'".$naam."',
'".$bericht."'
)
";
?>
if($_SERVER['REQUEST_METHOD'] == "POST") {
if (empty($_POST['naam'])) {
echo "Naam was leeg!"; // Naam is leeg
} elseif (empty($_POST['bericht'])) {
echo "Bericht was leeg!"; // Bericht was leeg
} else { // Niks aan de hand!
$naam = $_POST['naam']; // Wat=wat?
$bericht = $_POST['bericht'];
$naam = mysql_real_escape_string($naam); // voor de veiligheid
$bericht = mysql_real_escape_string($bericht); // met real_escape_string
// de query: In de tabel blog, in kolom naam & bericht, de inhoud van $naam en $bericht doen
$sql = "
INSERT INTO blog
(
naam,
bericht
)
VALUES
(
'".$naam."',
'".$bericht."'
)
";
?>
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
24
25
26
27
28
29
30
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
<?php
$sql = "
SELECT
naam,
bericht
FROM
blog
ORDER BY
id DESC
";
// Gaat iets fout
if(!$res = mysql_query($sql))
{
trigger_error(mysql_error().'<br />In query: '.$sql); // foutmessage
}
elseif(mysql_num_rows($res) == 0)
{
echo 'no messages yet'; // als de database leeg is
}
else
{
// Nu gaat alles goed
while($row = mysql_fetch_assoc($res))
{
echo "<div style='width:300px; border:1px solid black; text-align:left;'><br><b>Naam:</b>". htmlentities($row['naam']) ."<br/><b>Bericht:</b><br/><br>". htmlentities($row['bericht']) ."<br></div><br/>"; // de regels
}
}
mysql_close($db) ; // connectie sluiten
?>
$sql = "
SELECT
naam,
bericht
FROM
blog
ORDER BY
id DESC
";
// Gaat iets fout
if(!$res = mysql_query($sql))
{
trigger_error(mysql_error().'<br />In query: '.$sql); // foutmessage
}
elseif(mysql_num_rows($res) == 0)
{
echo 'no messages yet'; // als de database leeg is
}
else
{
// Nu gaat alles goed
while($row = mysql_fetch_assoc($res))
{
echo "<div style='width:300px; border:1px solid black; text-align:left;'><br><b>Naam:</b>". htmlentities($row['naam']) ."<br/><b>Bericht:</b><br/><br>". htmlentities($row['bericht']) ."<br></div><br/>"; // de regels
}
}
mysql_close($db) ; // connectie sluiten
?>
Oh, wel is een mysql_error() weergeven levensgevaarlijk als er ergens toch injection mogelijk blijkt.
Gewijzigd op 17/08/2010 13:25:45 door Pim -
Gebruik dubbele quotes voor html en enkele voor php om je html valid te maken.
2) van je eerste stukje code is lijn 11 en 12 totaal overbodig. Verwerk die $_POST beter in lijn 14 en 15
3) Je toont bij een fout de query aan je bezoekers. Stel dat je bezoeker een hacker/scriptkiddie is, dan weet ie meteen een deel van je database schema. Toon een melding aan de bezoeker en stuur de effectieve fout door naar jezelf of plaats het in een log bestand.
Je formulier afhandeling is niet echt al te mooi om eerlijk te zijn.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
// de query: In de tabel blog, in kolom naam & bericht, de inhoud van $naam en $bericht doen
$sql = "
INSERT INTO blog
(
naam,
bericht
)
VALUES
(
'".mysql_real_escape_string($_POST['naam'])."',
'".mysql_real_escape_string($_POST['bericht'])."'
)
";
?>
// de query: In de tabel blog, in kolom naam & bericht, de inhoud van $naam en $bericht doen
$sql = "
INSERT INTO blog
(
naam,
bericht
)
VALUES
(
'".mysql_real_escape_string($_POST['naam'])."',
'".mysql_real_escape_string($_POST['bericht'])."'
)
";
?>
@Hipska, wat kan er dan mis gaan met sorteren op ID. Een auto-increment is betrouwbaar toch?
Kijk eens naar dit: Dat ziet er toch veel beter uit?
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
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
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
<?php
// Foutmeldingen bijhouden in een array
$aErrors = array( );
// Kijken of de pagina zichzelf heeft aangeroepen
if( $_SERVER['REQUEST_METHOD'] == 'POST' )
{
// Kijken of er een geldige naam is ingevoerd
if( !preg_match( '#^[\w\d]+$#', $_POST['naam'] ) )
{
// Array vullen
$aErrors[ ] = '...';
}
// Kijken of er een geldig bericht is ingevoerd
if( empty( $_POST['bericht'] ) && strlen( $_POST['bericht'] ) < 10 )
{
// Array vullen
$aErrors[ ] = '...';
}
// Kijken of er foutmeldingen zijn opgetreden, dit kan ook met count of sizeof
if( empty( $aErrors ) )
{
// Query die uitgevoerd dient te worden
$insertQuery =
"
INSERT INTO
blog
(
blog_name,
blog_message,
user_id,
blog_date
)
VALUES
(
'" .mysql_real_escape_string( $_POST['naam'] ). "',
'" .mysql_real_escape_string( $_POST['bericht'] ). "',
'" .mysql_insert_id( ). "',
NOW()
)
";
// Kijken of Query gelukt is
if( !$result = mysql_query( $insertQuery ) )
{
$aErrors[ ] = '..';
}
// Etc..
}
}
?>
// Foutmeldingen bijhouden in een array
$aErrors = array( );
// Kijken of de pagina zichzelf heeft aangeroepen
if( $_SERVER['REQUEST_METHOD'] == 'POST' )
{
// Kijken of er een geldige naam is ingevoerd
if( !preg_match( '#^[\w\d]+$#', $_POST['naam'] ) )
{
// Array vullen
$aErrors[ ] = '...';
}
// Kijken of er een geldig bericht is ingevoerd
if( empty( $_POST['bericht'] ) && strlen( $_POST['bericht'] ) < 10 )
{
// Array vullen
$aErrors[ ] = '...';
}
// Kijken of er foutmeldingen zijn opgetreden, dit kan ook met count of sizeof
if( empty( $aErrors ) )
{
// Query die uitgevoerd dient te worden
$insertQuery =
"
INSERT INTO
blog
(
blog_name,
blog_message,
user_id,
blog_date
)
VALUES
(
'" .mysql_real_escape_string( $_POST['naam'] ). "',
'" .mysql_real_escape_string( $_POST['bericht'] ). "',
'" .mysql_insert_id( ). "',
NOW()
)
";
// Kijken of Query gelukt is
if( !$result = mysql_query( $insertQuery ) )
{
$aErrors[ ] = '..';
}
// Etc..
}
}
?>
Nog een paar dingen:
- Let op de naamgeving: Gebruik het liefst engels
- Overzichtelijker programmeren
- Meer documentatie
- Misschien gebruik maken van OOP?
- Misschien gebruik maken van MySQLi of PDO?
- Foutenafhandeling kan beter
- Formulier controles kunnen beter
En kijk eens naar de Query. Ik heb de veldnamen wat aangepast.. Het is niet alleen naam en bericht wat je moet opslaan. Nee veel meer.
Toch vind ik niet dat elke regel becommentarieerd (leuk woord trouwens ;) ) hoeft te worden.
Volgens mij vangt REQUEST_METHOD dat toch niet af, heren?
En waar is mysql_insert_id( ) goed voor?
@Pim Persoonlijk heb ik dat liever wel, Al drijf ik het vaak te ver door ben ik bang.
@Jordy inspringen is persoons gebonden, De manier waar jij het op doet is veels te veel op elkaar geduwd. Nu moet ik wel zeggen dat ik nogal veel witregel gebruik in mijn scripts. Ik zorg er altijd voor dat het blokkerig uitziet zullen we maar zeggen. zodat je makkelijker kunt zien wat bij elkaar hoort en wat niet.
Code (php)
Gewijzigd op 17/08/2010 16:08:31 door - Mark -
@pim..
Nee klopt
// Array vullen
Is natuurlijk overbodig.. Maar beter te veel documenteren dan te weinig..
"De controle van het bericht klopt niet echt of wel? Dat moet toch OR zijn en niet AND."
Jawel klopt wel. Empty laat een spatie ook door.. vandaar die controle met strlen
Gewijzigd op 17/08/2010 16:53:09 door Niels K