Hallo,

Doelstelling van mijn code is:
- Validatie check of alle velden ingevuld zijn
- E-mail versturen naar admin
- Data toevoegen in Mysql database
- Gegevens tonen op Result.php

Ik heb problemen met mijn validatie en het tonen van gegevens op result.php

Iemand claimt mijn code gefixed te hebben, echter ik krijg de volgende foutmelding:
Fatal error: Call to a member function errors() on a non-object

Het gaat fout bij deze regel:
<span class="error"><?php echo $contact->errors('aanhef'); ?></span>


<?php
    
    require_once("php/db.php");                 /* Database Class */
    require_once('php/utils/is_email.php');     /* Email Validation Script */
    
    if(!empty($_POST['newcontact'])){
            $contact = new Contact();
    } else{
            //header('Location: result.php');
    }
    
    /* Class Contact */
    class Contact
    {
            private $db;                        /* the database obj */
    
            //we have to init $errors array, as otherwise form will produce errors on missing array entry
            private $errors = array(            /* holds error messages */
                    'aanhef' => '',
                    'contactpersoon' => '',
                    'bedrijfsnaam' => '',
                    'email' => '',
                    'telefoon' => '',
                    'vraag1_antwoorden' => '',
                    'vraag2_antwoorden' => ''
            );
    
            private $has_errors;                /* number of errors in submitted form */
    
            public function __construct()
            {
                    $this->db = new DB();
                    if (!empty($_POST['newcontact'])) {
                            $this->processNewMessage();
                    }
            }
            public function processNewMessage()
            {
                    $aanhef             = $_POST['aanhef'];
                    $contactpersoon     = $_POST['contactpersoon'];
                    $bedrijfsnaam       = $_POST['bedrijfsnaam'];
                    $telefoon           = $_POST['telefoon'];
                    $email              = $_POST['email'];
                    $vraag1_antwoorden  = $_POST['vraag1_antwoorden'];
                    $vraag2_antwoorden  = $_POST['vraag2_antwoorden'];
    
                    /* Server Side Data Validation */
                    if (empty($aanhef)) {
                            $this->setError('aanhef', 'Vul uw aanhef in');
                    }
    
                    if (empty($contactpersoon)) {
                            $this->setError('contactpersoon', 'Vul uw contactpersoon in');
                    }
    
                    if (empty($bedrijfsnaam)) {
                            $this->setError('bedrijfsnaam', 'Vul uw bedrijfsnaam in');
                    }
    
                    if (empty($telefoon)) {
                            $this->setError('telefoon', 'Vul uw telefoon in');
                    }
    
                    if (empty($vraag1_antwoorden)) {
                            $this->setError('vraag1_antwoorden', 'Selecteer een antwoord a.u.b.');
                    }
    
                    if (empty($vraag2_antwoorden)) {
                            $this->setError('vraag2_antwoorden', 'Selecteer een antwoord a.u.b.');
                    }
    
                    if (empty($email)) {
                            $this->setError('email', 'Vul uw e-mail in');
                    }
    
                    /* No errors, insert in db
                    else*/
    
                    if(!$this->has_errors) {
                            if(($ret = $this->db->dbNewMessage($aanhef, $contactpersoon, $bedrijfsnaam, $email, $telefoon, $vraag1_antwoorden, $vraag2_antwoorden)) > '') {
                                    //$json = array('result'         => 1);
                                    if (SEND_EMAIL) {
                                            $this->sendEmail($aanhef,$contactpersoon,$bedrijfsnaam,$email,$telefoon,$vraag1_antwoorden,$vraag2_antwoorden);
                                            //This is for relocating to successful result page
                                            header('Location: result.php');
                                            exit;
                                    } else {
                                            //This will need special treatment. You have to prepare an errorpage
                                            //for database-related issues.
    
                                            header("Location: database-error.html");
                                            exit;
                                    }
                            }
                    }
            }
    
            public function sendEmail($aanhef,$contactpersoon,$bedrijfsnaam,$email,$telefoon,$vraag1_antwoorden,$vraag2_antwoorden)
            {
            /* Just format the email text the way you want ... */
                    $message_body   = "<div style=\"font-size:12px; font-weight:normal;\">Hallo,<br><br>"
                    ."Het volgende bedrijf heeft zich zojuist aangemeld voor de Veiligheids Quiz:</div><br>"
                    ."<table cellpadding=\"1\" cellspacing=\"1\" width=\"550px\"><tr><td style=\"font-size:12px; color:#000000\">Bedrijfsnaam:</td><td style=\"font-size:12px; color:#000000\">".$bedrijfsnaam."</td></tr><tr><td style=\"font-size:12px; color:#000000\">Aanhef:</td><td style=\"font-size:12px; color:#000000\">".$aanhef."</td></tr><tr><td style=\"font-size:12px; color:#000000\">Contactpersoon:</td><td style=\"font-size:12px; color:#000000\">".$contactpersoon."</td></tr><tr><td style=\"font-size:12px; color:#000000\">Telefoonnummer:</td><td style=\"font-size:12px; color:#000000\">".$telefoon."</td></tr><tr><td style=\"font-size:12px; color:#000000\">E-mail:</td><td style=\"font-size:12px; color:#000000\">".$email."</td></tr><tr><td style=\"font-size:12px; color:#000000\">Antwoord vraag 1:</td><td style=\"font-size:12px; color:#000000\">".$vraag1_antwoorden."</td></tr><tr><td style=\"font-size:12px; color:#000000\">Antwoord vraag 2:</td><td style=\"font-size:12px; color:#000000\">".$vraag2_antwoorden."</td></tr></table><br>";
    
                    // Geef GELDIGE adressen op
                    // Een korte benaming voor jouw website
    
                    $website_naam = 'Aanmelding Quiz';
                    // Jouw eigen geldige emailadres
                    $eigen_emailadres = 'MY MAIL';
                    // Een geldig emailadres voor errors
                    $error_emailadres = 'MY MAIL';
                    // De naam van de verzender
                    $naam_verzender = ''.$bedrijfsnaam.'';
                    // Het geldige emailadres van de afzender
                    $email_verzender = ''.$email.'';
                    // Een geldig emailadres of helemaal leeg laten
                    $bcc_emailadres = '';
                    // HTML mail? True/False
                    $html = true;
    
                    // De headers samenstellen
                    $headers     = 'From: ' . $website_naam . ' <' . $eigen_emailadres . '>' . PHP_EOL;
                    $headers    .= 'Reply-To: ' . $naam_verzender . ' <' . $email_verzender . '>' . PHP_EOL;
                    $headers    .= 'Return-Path: Mail-Error <' . $error_emailadres . '>' . PHP_EOL;
                    $headers    .= ($bcc_emailadres != '') ? 'Bcc: ' . $bcc_emailadres . PHP_EOL : '';
                    $headers    .= 'X-Mailer: PHP/' . phpversion() . PHP_EOL;
                    $headers    .= 'X-Priority: Normal' . PHP_EOL;
                    $headers    .= ($html) ? 'MIME-Version: 1.0' . PHP_EOL : '';
                    $headers    .= ($html) ? 'Content-type: text/html; charset=iso-8859-1' . PHP_EOL : '';
    
                    mail(EMAIL_TO,MESSAGE_SUBJECT,$message_body,$headers);
            }
    
            public function setError($field, $errmsg)
            {
                    $this->has_errors     = true;
                    $this->errors[$field] = $errmsg;
            }
    
            public function errors($field)
            {
                    if (array_key_exists($field,$this->errors)){
                            return $this->errors[$field];
                    }
                  
                    return '';
            }
    };
    ?>
    
    <table width="675px" cellpadding="0" cellspacing="0">
    <form id="contact_form" method="post" action="">
    <label class="label_aanhef" for="aanhef_1"><input name="aanhef" id="aanhef_1" type="radio" value="Dhr." /> Dhr.</label><label class="label_aanhef" for="aanhef_2"><input name="aanhef" id="aanhef_2" type="radio"  value="Mevr." /> Mevr.</label>
    <span class="error"><?php echo $contact->errors('aanhef'); ?></span>
    
    <input id="contactpersoon" name="contactpersoon" maxlength="120" type="text" onFocus="window.scrollTo(0, 0);"/><span class="error"><?php echo $contact->errors('contactpersoon'); ?></span>
    <input id="bedrijfsnaam" name="bedrijfsnaam" maxlength="120" type="text" onFocus="window.scrollTo(0, 0);"/><span class="error"><?php echo $contact->errors('bedrijfsnaam'); ?></span>
    <input id="email" name="email" maxlength="120" type="text" onFocus="window.scrollTo(0, 0);"/><span class="error"><?php echo $contact->errors('email'); ?></span>
    <input id="telefoon" name="telefoon" maxlength="120" type="text" onFocus="window.scrollTo(0, 0);"/><span class="error"><?php echo $contact->errors('telefoon'); ?></span>
    
    
    <label class="label_radio" for="vraag1_A"><input name="vraag1_antwoorden" id="vraag1_A" value="A. Dat is helaas fout, het goede antwoord is: C) < 1 Ohm" type="radio" />A) Geen eis</label>
    <label class="label_radio" for="vraag1_B"><input name="vraag1_antwoorden" id="vraag1_B" value="B. Dat is helaas fout, het goede antwoord is: C) < 1 Ohm" type="radio"  />B) < 0,1 Ohm</label>
    <label class="label_radio" for="vraag1_C"><input name="vraag1_antwoorden" id="vraag1_C" value="C. Gefeliciteerd dat is het goede antwoord." type="radio"  />C) < 1 Ohm</label>
    <label class="label_radio" for="vraag1_D"><input name="vraag1_antwoorden" id="vraag1_D" value="D. Dat is helaas fout, het goede antwoord is: C) < 1 Ohm" type="radio" />D) < 10 Ohm</label>
    <span id="vraag1_antwoorden" class="foutmelding_quiz">
    <?php echo $contact->errors('vraag1_antwoorden'); ?>
    </span>
    
    <label class="label_radio" for="vraag2_A"><input name="vraag2_antwoorden" id="vraag2_A" value="A. Gefeliciteerd dat is het goede antwoord." type="radio" />A) Geen eis</label>
    <label class="label_radio" for="vraag2_B"><input name="vraag2_antwoorden" id="vraag2_B" value="B. Dat is helaas fout, het goede antwoord is: A)  Geen eis" type="radio" />B) < 0,1 Ohm</label>
    <label class="label_radio" for="vraag2_C"><input name="vraag2_antwoorden" id="vraag2_C" value="C. Dat is helaas fout, het goede antwoord is: A)  Geen eis" type="radio" />C) < 1 Ohm</label>
    <label class="label_radio" for="vraag2_D"><input name="vraag2_antwoorden" id="vraag2_D" value="D. Dat is helaas fout, het goede antwoord is: A)  Geen eis" type="radio" />D) < 10 Ohm</label>
    <span id="vraag2_antwoorden" class="foutmelding_quiz">
    <?php echo $contact->errors('vraag2_antwoorden'); ?>
    </span>
    <input class="button submit" type="submit" value="" /><input id="newcontact" name="newcontact" type="hidden" value="1"></input>
    </form>
Hi,

Dat komt door dat het object Contact niet kan worden gevonden bij een leeg form.
Plaats regel 7 ook op 9. Dat is waarschijnlijk niet wat je wilt ;).

Kan je onder ander oplossen door if om de error berichten in het form.




Hee Mark,

bedankt voor je bericht! Met dat erbij is het idd voor nu even opgelost. Heb je een idee hoe ik deze gegevens mee kan nemen naar result.php zodat ze daar getoond worden?


Aanhef: <?php echo $_POST["aanhef"]; ?><br />
Contactpersoon: <?php echo $_POST["contactpersoon"]; ?><br />
Bedrijfsnaam: <?php echo $_POST["bedrijfsnaam"]; ?><br />
Telefoon: <?php echo $_POST["telefoon"]; ?><br />
E-mail: <?php echo $_POST["email"]; ?><br /> 
Sebas,

als je header location wilt behouden kan je met een session gaan werken.
Of je geeft een ID mee Result.php?id=123 en trekt de gegevens uit de database op die pagina. of zet alle gegevens die je nodig hebt op resultaat in de url result.php?aanfef=11&bedrijfsnaam=phphulp$telefoon=0102 etc.

Echt mooie oplossingen zijn het niet.

Ik zou dat header location er helemaal uit gooien en alles op de zelfde pagina houden.
Na het resultaat stop je het script.

Of je zet een if else om je hele form.
if error > toon error, elseif resultaat oke > toon resultaat, else toon form.

Gaat het script te groot worden, werk dan eventueel met include.
Hee Mark, ik wil graag mn opzet behouden omdat ik hier al zo lang mee zit te struggelen. Ik heb gekeken naar deze tutorial om te werken met sessions, maar het lukt me maar niet om de data te tonen op result.php

Tutorial:
http://www.html-form-guide.com/php-form/php-order-form.html

Zou je me misschien een voorzet kunnen geven hoe dit te doen?

Zet op beide PHP bestanden eerst session_start(); bovenaan je PHP file

<?php
$_SESSION["aanhef"] = $_POST["aanhef"];
$_SESSION["contactpersoon"] = $_POST["contactpersoon"];
$_SESSION["bedrijfsnaam"] = $_POST["bedrijfsnaam"];
$_SESSION["telefoon"] = $_POST["telefoon"];
$_SESSION["email"] = $_POST["email"];
?>

Op je result kan je ze ophalen door:


Aanhef: <?php echo $_SESSION["aanhef"]; ?><br />
Contactpersoon: <?php echo $_SESSION["contactpersoon"]; ?><br />
Bedrijfsnaam: <?php echo $_SESSION["bedrijfsnaam"]; ?><br />
Telefoon: <?php echo $_SESSION["telefoon"]; ?><br />
E-mail: <?php echo $_SESSION["email"]; ?><br /> 
Hee Marvin,

waar dien ik dit te plaatsen:


<?php
$_SESSION["aanhef"] = $_POST["aanhef"];
$_SESSION["contactpersoon"] = $_POST["contactpersoon"];
$_SESSION["bedrijfsnaam"] = $_POST["bedrijfsnaam"];
$_SESSION["telefoon"] = $_POST["telefoon"];
$_SESSION["email"] = $_POST["email"];
?>
@Sebas:

na regel 79 "if(!$this->has_errors) {" lijkt me een mooie locatie...
Dit is na je check of alle velden zijn gevult

[size=xsmall]Toevoeging op 21/09/2012 15:21:14:[/size]

By the way, haal op je result.php pagina de sessies wel weer leeg, anders blijven deze bestaan... misschien is dit niet handig als de bezoeker opnieuw naar je formulier gaat...

Helemaal onderaan je result.php zet je dan het volgende neer, zodat de sessies leeg zijn na verwerken:

<?php
session_destroy();
?>

Let wel, dit verwijderd alle sessies die je heb opgebouwd...
@Marvin; Het werkt man, je ben m'n held. Proost
Sebas V op 21/09/2012 15:22:11

@Marvin; Het werkt man, je ben m'n held. Proost


your're welcome

Reageren