Beste PHPer's,

Ik doe ergens iets fout op regel 26.
Maar ik kom er maar niet uit wat ik fout doe.
Kan iemand mij verder helpen.

<?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);
}
}
}
}

?>

[size=xsmall]Toevoeging op 19/08/2012 21:20:45:[/size]

Het moet zijn regel 23
Ik wete ook niet niet wat je fout doet. Jij weet beter dan ons wat er mis gaat......
<?php
if(mysql_num_rows($res) == 0)
?>
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.
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.
Met random bedoel je hopelijk uniek, anders kan je mogelijk rare dingen krijgen op regel 37/38.

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.


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:

$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();


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 :

$inhoud_mail = file_get_contents('mail.html');

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.
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.
@Ger: Ik heb me misschien wat ongenuanceerd uitgedrukt.
Dit van mysqli:

$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name);

$stmt->execute();


is equivalent aan dit van pdo_mysql;

$stmt = $pdo->prepare('SELECT * FROM employees WHERE 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?
]Omdar parameter binding altijd in combinatie moet met prepared statements, en dat laatste vind ik overbodig op één enkele query.

[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]

Reageren