Hallo iedereen!

Zoals de titel een beetje aantoont maak ik een reservatie systeem in HTML/PHP.
Er wordt een HTML form ingevuld en die waarden worden doorgegeven naar de eerste .php file (reservation-send.php).
Die .php file maakt een emailbericht waarin enkele waarden van de form inkomen en de url link om te bevestigen (incl. hash code).
De mail en link wordt verstuurd naar iemand van het restaurant om te bevestigen (klikken op de url link).
Wanneer die link wordt geklikt, wordt er een 2de .php file aangesproken (bevestiging.php).
Die file controleert of de hash code en email correct zijn, indien dit zo is wordt er opnieuw een mail verzonden naar degene die de reservatie maakte met de bevestiging van de reservatie.

Output URL

Volgens mij loopt het mis door een fout in het aanmaken van de url link.
Ik krijg steeds "fout!" als er wordt op geklikt.
Zie output link voor de output van de mail.

Alvast bedankt!

Voor verdere vragen shoot maar eh!

reservation-send.php

<?php 
require_once 'inc/securimage/securimage.php'; 

///////////////////////////////////// 
// Change this email address //////// 
$email = "[email protected]"; //dit express zo gemaakt voor deze post 

///////////////////////////////////// 

$required = array('day', 'month', 'year', 'hour', 'minutes', 'ampm', 'name', 'email', 'captcha', 'phone', 'amount'); 
$response = array('status' => 'failed', 'errors'=>array()); 

if(isset($_POST['reservation'])) { 
    foreach($_POST['reservation'] as $field => $value) { 
        //check required field if empty 
        if($value == '' && in_array($field, $required)) { 
            $response['errors'][$field] = $field; 
        } 
    } 

    //validate email 
    if(!isset($response['errors']['email'])) { 
        if(!filter_var($_POST['reservation']['email'], FILTER_VALIDATE_EMAIL)) { 
            $response['errors']['email'] = 'email'; 
        } 
    } 

    //validate captcha 
    if(!isset($response['errors']['captcha'])) { 
        $securimage = new Securimage(); 
        if ($securimage->check($_POST['reservation']['captcha']) == false) { 
            $response['errors']['captcha'] = 'captcha'; 
        } 
    } 

} 

if(empty($response['errors'])) { 
    $response['status'] = 'success'; 

    $data = $_POST['reservation']; 

    //Generate email link 

        //save mail of who made the reservation - get from form 
        $email_reservering =$data['email']; 

        //generate hash code 
        $hash = md5($email_reservering); 

        //generate link with hash code 
        $link = "http://mijndomein.be/bevestiging.php?email=”.urlencode($email_reservering).”&hash=$hash"; 

    $headers = ""; 
    $message .= "Dag Lode en Eva, via de website kregen jullie een nieuwe reservatie, gelieve de persoon zo snel mogelijk een bevestigingsmail te sturen!"; 
    $message .= "\n\n"; 
    $message = $data['message']; 
    $message .= "\n\n"; 

    $message .= " Telefoon: " . $data['phone']; 
    $message .= "\n\n"; 
    $message .= " Lunch/Diner: " . $data['booking-type']; 
    $message .= "\n\n"; 
    $message .= " Aantal personen: " . $data['amount']; 
    $message .= "\n\n"; 
    $message .= " Email: " . $data['email']; 

    $message .= "\n\n"; 
    $message .= " Datum: " . $data['day']; 
    $message .= "\n\n"; 
    $message .= " Maand: " . $data['month']; 
    $message .= " " . $data['year']; 
    $message .= "\n\n"; 
    $message .= " Tijdstip: " . $data['hour'] . " " . $data['minutes'] . " " . $data['ampm']; 
    $message .= "\n\n\n\n"; 
    $message .= "<a href='".$link."'>Bevestig</a>"; 

    $subject = 'Nieuwe reservatie via de website'; 
    $headers = 'From: '. $data['email']. "\r\n" .'Reply-To: '. $data['email']. "\r\n" .'X-Mailer: PHP/' . phpversion(); 

    if (mail($email, $subject, $message, $headers)) { 

    } else { 
        $response['status'] = 'failed'; 
    } 
} 

echo json_encode($response);
?>


------------------------------------------------------------------

Bevestiging.php

<?php 

//retrieve email and hash code from link 
$email_reservering = urldecode($_GET['email_reservering']); 
$hash = $_GET['hash']; 

//check if hash code matches 

if (md5($email_reservering) == $hash) 
{ 
    //succes     
    $headers = ""; 
    $message .= "reservering bevestigd!"; 
    $message .= "\n\n"; 

    $subject = 'Bevestiging reservering'; 

    if (mail($email, $subject, $message, $headers)) { 

    } else { 
        $response['status'] = 'failed'; 
    } 
} 
else 
{ 
    //error 
    echo "error!"; 
} 

?>

Waar komt de foutmelding "Fout!" dan vandaan?
Sorry, bedoelde "error!" ipv "Fout!" maar komt op hetzelfde neer :)
Voor debuggen niet, je zoekt naar een bepaalde foutmelding die je krijgt in de code, en als die afwijkt of niet bestaat kan je erg lang zoeken.

Anyway, het komt er op neer dat md5($email_reservering) en $hash niet opeens komen.
Echo beiden eens, en kijk eens waar de verschillen zijn?
ik heb geen debug mogelijkheid omdat ik het automatisch upload op het domein om de mail functie te laten werken, via localhost is dat veel moeilijker om werkende te krijgen.

Ik denk dat het ligt aan de url die moet geklikt worden.
Als je de afbeelding eens bekijkt, zie je dat die niet correct wordt getoond.
Denk dat hij daarom "error!" geeft en zoals jij zegt, dat dat ervoor zorgt dat $hash & md5($email_reservering) niet overeenkomt.

$link = "http://mijndomein.be/bevestiging.php?email=”.urlencode($email_reservering).”&hash=$hash";

$message .= "<a href='".$link."'>Bevestig</a>";

één van deze 2 lijnen moet iets niet goed staan, denk ik.
Maar vindt het niet.. :/
Tom De Boeck op 18/09/2015 12:53:15

ik heb geen debug mogelijkheid omdat ik het automatisch upload op het domein om de mail functie te laten werken, via localhost is dat veel moeilijker om werkende te krijgen.

Live werken is nooit het beste idee. Zorg er liever voor dat je een afgeschermde testomgeving hebt op een speciaal (sub)domein op je server, waar je je bezoekers niet kan hinderen met debug- en testmomenten. Of anders een compleet geïsoleerde lokale server zoals XAMPP.
Weet dat wel allemaal en ik gebruik XAMPP...
Maar voor dit en de mailing te kunnen testen, gaat dit niet zomaar met XAMPP tenzij je mij kan vertellen hoe?
Ik probeer het onmiddellijk dan.
Maar zou graag eerst mijn fout vinden :).
Tom De Boeck op 18/09/2015 13:07:48

Weet dat wel allemaal en ik gebruik XAMPP...
Maar voor dit en de mailing te kunnen testen, gaat dit niet zomaar met XAMPP tenzij je mij kan vertellen hoe?
Ik probeer het onmiddellijk dan.
Maar zou graag eerst mijn fout vinden :).


Heb je al eens gegoogled op mail via xampp? staat namelijk genoeg over online ^^
En anders echo je de link (/mail) toch naar het scherm en klik je dan op de link?
Ja kan desnoods via Mercury je eigen mailserver lokaal(!) kunnen gebruiken, of anders de SMTP van je ISP kunnen gebruiken.
Kijk eens goed naar die dubbele quotes om ”.urlencode($email_reservering).”

$_GET['email'] bevat waarschijnlijk letterlijk de volgende karakters teveel:
”. <-- aan het begin
.” <-- aan het einde

(urlencode() wordt waarschijnlijk niet eens uitgevoerd maar letterlijk afgedrukt?)

Daarnaast is een urldecode() op $_GET niet nodig, urldecode() wordt al automatisch toegepast op superglobals als $_GET en $_POST.

Reageren