$_GET in SQL
Ik doe ergens iets fout op regel 26.
Maar ik kom er maar niet uit wat ik fout doe.
Kan iemand mij verder helpen.
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
<?php
/**
* @author Ben Janssen
* @copyright 2012
*/
ini_set('display_errors',1);
error_reporting(E_ALL);
//Database connectie
include'../cfg/cfg.php';
mysql_select_db($db,$con);
//GET waarden ophalen
$link = $_GET['confirm'];
if(!$link)
{
echo '<p>Er is een fout met de link.<br/>Neem contact op met de beheerder als u van mening bent dat dit niet klopt.<br/>[email protected]</p>';
}
else
{
$sql = "SELECT * FROM reservation WHERE confirm=".$link;
$res = mysql_query($sql,$con);
//Waarde controleren
if(mysql_num_rows($res) == 0)
{
echo '<p style="color:red">U heeft nog niet gereserveerd.</p>';
echo $link;
header('Refresh: 5; url=../index.html');
}
else
{
$row = mysql_fetch_array($res);
if($row['actief'] == 0)
{
$sql2 = "UPDATE reservation WHERE confirm=".$link." AND email=".$row['email']."SET actief=1";
$res2 = mysql_query($sql2,$con);
if($res2)
{
echo '<p>Uw reservering is geactiveerd.<br/>Een bevestiging is naar uw email adres gestuurd';
header('Refresh: 5; url=../index.html');
//Headers instellen
$headers = "From: NoReply@The_Timberwolves.nl\r\n";
$headers .= 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
//Mail opstellen
$inhoud_mail = ('
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>Reservering</title>
</head>
<body style="background:silver">
<p><a href="http://www.thetimberwolves.nl"><img alt="The Timberwolves" height="94" src="http://www.thetimberwolves.nl/img/TTWlogoTrans.gif" width="443" /></a></p>
<p>Uw reservering is in ons bestand opgenomen.<br/><a href="http://www.thetimberwolves.nl">The Timberwolves</a> zijn blij u op deze dag te mogen verwelkomen.</p>
<p>Reserverings details</p>
<table>
<tr><td style="width:200px">Gereserveerd voor datum</td><td>'.$row['speeldatum'].'</td></tr>
<tr><td style="width:200px">Reserveringsnummer</td><td>'.$row['ID'].'</td></tr>
<tr><td style="width:200px">Voornaam</td><td>'.$row['naam'].'</td></tr>
<tr><td style="width:200px">Achternaam</td><td>'.$row['anaam'].'</td></tr>
<tr><td style="width:200px">Team naam</td><td>'.$row['team'].'</td></tr>
<tr><td style="width:200px">Aantal dozen</td><td>'.$row['dozen'].'</td></tr>
<tr><td style="width:200px">Type paint</td><td>'.$row['paint'].'</td></tr>
<tr><td style="width:200px">Totaal incl. WOF</td><td>'.$row['prijs'].'</td></tr>
</table>
<p style="color:red">Print deze mail uit, het is uw ticket.</p>
<p style="color:red">Let op, er kan niet gepind worden</p>
<p><img alt="Euro Paintball Adventures" height="94" src="http://www.thetimberwolves.nl/img/EPA.png" width="443" /></p>
</body>
</html>');
mail($row['email'],'Uw reservering',$inhoud_mail,$headers);
//Mail voor organisatie opstellen
$ORsql = "SELECT teamnaam, paint, SUM(dozen) FROM reservation WHERE actief=1 GROUP BY teamnaam, paint";
$ORres = mysql_query($ORsql,$con);
$OR2sql = "SELECT COUNT(*) FROM `reservation` WHERE actief=1";
$OR2res = mysql_query($OR2sql,$con);
$ORrow = mysql_fetch_array($ORres);
$OR2row = mysql_fetch_array($OR2res);
$OR = '[email protected],[email protected]';
while ($ORrow = mysql_fetch_array($ORres))
{
$ORmail = "===================================================\n";
$ORmail .= "Totaal reserveringen ".$OR2row."\n";
$ORmail .= "===================================================\n";
$ORmail .= "Team * Paint * Totaal\n";
$ORmail .= $ORrow['teamnaam']." * ".$ORrow['paint']." * ".$ORrow['SUMdozen']."\n";
}
mail($OR,'Reservering is geüpdated',$ORmail,$headers);
}
}
}
}
?>
/**
* @author Ben Janssen
* @copyright 2012
*/
ini_set('display_errors',1);
error_reporting(E_ALL);
//Database connectie
include'../cfg/cfg.php';
mysql_select_db($db,$con);
//GET waarden ophalen
$link = $_GET['confirm'];
if(!$link)
{
echo '<p>Er is een fout met de link.<br/>Neem contact op met de beheerder als u van mening bent dat dit niet klopt.<br/>[email protected]</p>';
}
else
{
$sql = "SELECT * FROM reservation WHERE confirm=".$link;
$res = mysql_query($sql,$con);
//Waarde controleren
if(mysql_num_rows($res) == 0)
{
echo '<p style="color:red">U heeft nog niet gereserveerd.</p>';
echo $link;
header('Refresh: 5; url=../index.html');
}
else
{
$row = mysql_fetch_array($res);
if($row['actief'] == 0)
{
$sql2 = "UPDATE reservation WHERE confirm=".$link." AND email=".$row['email']."SET actief=1";
$res2 = mysql_query($sql2,$con);
if($res2)
{
echo '<p>Uw reservering is geactiveerd.<br/>Een bevestiging is naar uw email adres gestuurd';
header('Refresh: 5; url=../index.html');
//Headers instellen
$headers = "From: NoReply@The_Timberwolves.nl\r\n";
$headers .= 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
//Mail opstellen
$inhoud_mail = ('
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>Reservering</title>
</head>
<body style="background:silver">
<p><a href="http://www.thetimberwolves.nl"><img alt="The Timberwolves" height="94" src="http://www.thetimberwolves.nl/img/TTWlogoTrans.gif" width="443" /></a></p>
<p>Uw reservering is in ons bestand opgenomen.<br/><a href="http://www.thetimberwolves.nl">The Timberwolves</a> zijn blij u op deze dag te mogen verwelkomen.</p>
<p>Reserverings details</p>
<table>
<tr><td style="width:200px">Gereserveerd voor datum</td><td>'.$row['speeldatum'].'</td></tr>
<tr><td style="width:200px">Reserveringsnummer</td><td>'.$row['ID'].'</td></tr>
<tr><td style="width:200px">Voornaam</td><td>'.$row['naam'].'</td></tr>
<tr><td style="width:200px">Achternaam</td><td>'.$row['anaam'].'</td></tr>
<tr><td style="width:200px">Team naam</td><td>'.$row['team'].'</td></tr>
<tr><td style="width:200px">Aantal dozen</td><td>'.$row['dozen'].'</td></tr>
<tr><td style="width:200px">Type paint</td><td>'.$row['paint'].'</td></tr>
<tr><td style="width:200px">Totaal incl. WOF</td><td>'.$row['prijs'].'</td></tr>
</table>
<p style="color:red">Print deze mail uit, het is uw ticket.</p>
<p style="color:red">Let op, er kan niet gepind worden</p>
<p><img alt="Euro Paintball Adventures" height="94" src="http://www.thetimberwolves.nl/img/EPA.png" width="443" /></p>
</body>
</html>');
mail($row['email'],'Uw reservering',$inhoud_mail,$headers);
//Mail voor organisatie opstellen
$ORsql = "SELECT teamnaam, paint, SUM(dozen) FROM reservation WHERE actief=1 GROUP BY teamnaam, paint";
$ORres = mysql_query($ORsql,$con);
$OR2sql = "SELECT COUNT(*) FROM `reservation` WHERE actief=1";
$OR2res = mysql_query($OR2sql,$con);
$ORrow = mysql_fetch_array($ORres);
$OR2row = mysql_fetch_array($OR2res);
$OR = '[email protected],[email protected]';
while ($ORrow = mysql_fetch_array($ORres))
{
$ORmail = "===================================================\n";
$ORmail .= "Totaal reserveringen ".$OR2row."\n";
$ORmail .= "===================================================\n";
$ORmail .= "Team * Paint * Totaal\n";
$ORmail .= $ORrow['teamnaam']." * ".$ORrow['paint']." * ".$ORrow['SUMdozen']."\n";
}
mail($OR,'Reservering is geüpdated',$ORmail,$headers);
}
}
}
}
?>
Toevoeging op 19/08/2012 21:20:45:
Het moet zijn regel 23
Ik wete ook niet niet wat je fout doet. Jij weet beter dan ons wat er mis gaat......
Geeft een nul waarde, maar $link is wel gevuld.
Wat gaat hier dan fout?
Is 'confirm' een string veld in je database? Dan mis je quotes om de waarde in je query.
als ik in de browser invoer http://adresvanjouwsite?confirm=;DROP DATABASE .. ga je helemaal nat. Niet doen dit!
@John,
Hoe moet ik het dan doen?
Want de gebruiker krijgt een bevestigingsmail met link om zijn reservering definitief te maken.
Als het een getal is dan zou ik eens je sql statement echoen om te kijken of inderdaad het getal erin staat en dan checken via de MySQL command line tool of phpmyadmin of er inderdaad wel een record in je database staat met die waarde voor confirm. Het lijkt erop dat dat niet het geval is, vandaar dat 0 records worden opgehaald.
Ben Janssen op 20/08/2012 07:49:53:
De "confirm" is een random nummer die in de DB is opgeslagen.
@John,
Hoe moet ik het dan doen?
Want de gebruiker krijgt een bevestigingsmail met link om zijn reservering definitief te maken.
@John,
Hoe moet ik het dan doen?
Want de gebruiker krijgt een bevestigingsmail met link om zijn reservering definitief te maken.
Je gebruikt de msqli van php, dat is notoir onveilig. The way to go is om de pdo driver te gebruiken, en dan parameter binding te gebruiken:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
$link = $_GET['confirm'];
..
$db = new PDO("...");
$sql = "SELECT * FROM reservation WHERE confirm = :link"
$statement = $db->prepare($sql);
$statement->execute(array(':link' => $link));
$res = $statement->fetch();
..
$db = new PDO("...");
$sql = "SELECT * FROM reservation WHERE confirm = :link"
$statement = $db->prepare($sql);
$statement->execute(array(':link' => $link));
$res = $statement->fetch();
n.b. is het geen idee om php en sql te scheiden van de html opmaak. Zal de leesbaarheid en onderhoudbaarheid zeker ten goede komen?
Wat bijvoorbeeld al gaat helpen is dit: Zet de inhoud van de mail in een apart bestand en noem dat mail.html Verander regel 48 in :
Op die manier wordt de code leesbaarder, en als je de mail ooit wil veranderen hoef je alleen maar het mail.html bestand aan te passen. Bovendien kun je mail.html apart in je browser weergeven, zodat je kunt zien hoe de gebruiker de mail gaat zien.
Gewijzigd op 20/08/2012 09:41:42 door John Berg
John Berg op 20/08/2012 09:35:27:
Je gebruikt de msqli van php, dat is notoir onveilig. The way to go is om de pdo driver te gebruiken, en dan parameter binding te gebruiken:
Waarom zou mysqli onveilig zijn? TS gebruikt overigens de mysql extensie en in beide kun je escapen.
Dit van mysqli:
Code (php)
1
2
3
4
2
3
4
$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name);
$stmt->execute();
$stmt->bind_param('s', $name);
$stmt->execute();
is equivalent aan dit van pdo_mysql;
Code (php)
1
2
3
2
3
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute(array(':name' => $name));
$stmt->execute(array(':name' => $name));
Ik ben geen fan van escapen. Waarom zou je ook als je met parameter binding altijd safe bent?
[totopic]
@Ben
Je zegt dat confirm een random number is, maar ik meen in jou topic van eergisteren gezien te hebben dat je daar een MD5 hash overheen gooit.
Overigens is een rand(1000, 100000) niet uniek, dus kan je zoals Erwin al aangaf problemen krijgen met de bevestiging.
[/totopic]
Gewijzigd op 20/08/2012 16:55:41 door Ger van Steenderen
Ik weet wel dat er in &link de juiste waarde staat, deze had ik al gecontroleerd omdat ik een "0" waarde kreeg, sterker nog, hij staat zelfs in de DB.
Ik moet dus ergens een fout hebben in de SQL.
@Ger,
Zou dit een betere regel zijn voor een uniek nummer?
Toevoeging op 20/08/2012 19:35:20:
En de mail in een extern bestand zetten is ook de bedoeling, maar wil eerst zeker weten dat alles goed werkt.
Overigens is de manier waarop je je md5 maakt nog steeds niet erg veilig. Een random cijfer toevoegen is niet voldoende. Je kan beter een aantal random tekens toevoegen: @-4Hm$ó° . Overigens is sha1 een sterker algoritme.
Gewijzigd op 20/08/2012 19:41:35 door Write Down
Dat param binding is nieuw voor mij, zie ik hier voor het eerst.
Dus daar zal ik nog wat meer over moeten weten voor ik goed begrijp wat het doet.
Allicht het zelfde als wat ik wil.
De uniqid() geeft al een iets unieks, maar omdat ik altijd bang ben dat anderen ook deze functie gebruiken, SALT ik hem ietwat.
De resulterende string is met aan zekerheid grenzende waarschijnlijkheid uniek :-)
Gewijzigd op 20/08/2012 20:06:05 door John Berg
En beide parameters kun je naar eigen inzicht aanpassen?
Ben Janssen op 20/08/2012 20:08:30:
Oke, dat is wel handig om te weten.
En beide parameters kun je naar eigen inzicht aanpassen?
En beide parameters kun je naar eigen inzicht aanpassen?
Yep. Als je er maar voor zorgt dat de lengte van je SALT minimaal 8 tekens is, je hoofd- en kleine letters, cijfers en leestekens gebruikt.
Nu nog even uitvogelen wat er met de num_rows aan de hand is