Hallo allemaal,

Ik ben php aan het leren uit een boek.
In het hoofdstuk waar ik nu mee bezig ben wordt er contact gemaakt tussen een inlog script en de database.
het hele hoofdstuk liep voorspoedig tot het eind. Toen kreeg ik de volgende foutmelding:

Parse error: syntax error, unexpected '}' in C:\XAMPP\htdocs\inlog_pagina\login.php on line 99

Ik heb alle scripts nagegekeken en gecontroleerd of de code overeen kwam met de code uit het boek. Hier en daar heb ik wat kleine foutjes eruit kunnen halen maar de foutmelding blijft.

Ik heb het boek al enkele keren betrapt op codefoutjes. Ik vermoed dat er een fout in het boek staat die ik niet kan vinden. Ook heb ik mijn twijfels over bepaalde stukjes code uit het boek.
In de bijgevoegde code heb ik bij die stukjes code vraagtekens bijgezet.

Kan iemand de fout vinden? En kan iemand mij toelichting geven over de stukjes code waar ik vraagtekens bij heb staan? Wellicht kunnen die stukjes code ook de foutmelding veroorzaken.

Bij voorbaat dank

index.php

<?php
session_start();
// Identieficatie
if( !isset($_SESSION['sid']) || ($_COOKIE['PHPSESSID'] != $_SESSION['sid'])):
    header('location: ./login.php');
    return;
endif;

//view
//inlog index.php
include('html_kop.inc.php');
?>

<h1>Inlog script</h1>
<div>Gebruiker: <?php echo $_SESSION['naam'] ?></div>
<div id="afmeldformulier">
    <form name="signup" action="login.php" method="POST">
        <input type="submit" name="signout" value="Uitloggen">
    </form>
</div>
 
 
<?php 
include('html_staart.inc.php');
?>
[/quote]

login.php
[quote]
<?php
//controller
session_start();
$sessie = false;
$form = '';

include('config.inc.php');
include('dbklasse.inc.php');
$db = new dbklasse(DB_HOST, DB_NAME, DB_USER, DB_PASS);
$db->opendb();
    
if( isset($_POST['signout']) ):
    vernietig_sessie();
endif;

if( isset($_SESSION['sid']) && $_COOKIE['PHPSESSID'] == $_SESSION['sid']):
    header('location: ./index.php');
else:
    if( isset($_POST['in']) ):
        $controleer = signin($fouten);
        if( $controleer === false ):
            $form = form_in($fouten);
        else:
            maak_sessie($controleer);
            $sessie = true;
            header('location: ./index.php');
        endif;
    elseif( isset($_POST['up']) ):
        if( !signup($fouten) ):
            $form = form_up($fouten);
        else:
            maak_sessie($_POST['naam']);
            $sessie = true;
            header('location: ./index.php');
        endif;
    elseif( isset($_GET['signin']) ):
        $form = form_in();
    elseif( isset($_GET['signup']) ):
        $form = form_up();
    else:
        $form = form_inup();
    endif;
endif;

$db->sluitdb();

//view
include('html_kop.inc.php');


function signin(&$terug){
        $ok = true;
        if( $_POST['mail'] == '' ):
            $terug['error_mail'] = 'Vul uw e-mailadres in!';
            $ok &= false;
        endif;
        if( $_POST['pass'] == '' ):
            $terug['error_pass'] = 'Vul uw wachtwoord in!';
            $ok &= false;
        endif;
    
        if( $ok ):
            // controleer gegevens in database
            // haal NAAM uit database
            $sql = "            
                SELECT
                id, naam
                FROM
                gebruikers
                WHERE
                mail='".$_POST['mail']."' && pass='".$db->versleutel($_POST['pass'])."'
            ";
        $records = $db->rijendb($sql); 
        if( count($records) > 0 ): 
        
        // sessie_id in db stoppen
                $sql = "
                UPDATE
                gebruikers
                SET
                sid = '".session_id()."'
                WHERE
                id='".$records[0]['id']."'
                ";
        $db->querydb($sql);
        return $records[0]['naam'];

            if( true ):
                return "NAAM";
            else:
                $terug['error_mail'] = 'Gegevens niet correct!';
                return false;
            endif;
        else:
            return false;
        endif;
    }
    
function signup(&$terug){
        $ok = true;
        if( $_POST['naam'] == ''):
            $terug['error_naam'] = 'Vul uw naam in!';
            $ok &= false;
        endif;
        if( $_POST['mail'] == ''):
            $terug['error_mail'] = 'Vul uw e-mailadres in!';
            $ok &= false;
        endif;
        if( $_POST['pass1'] == '' || $_POST['pass1'] != $_POST['pass2'] ):
            $terug['error_pass'] = 'Vul uw tweemaal hetzelfde wachtwoord in';
            $ok &= false;
        endif;
    
        if( $ok ):
        // Controleer in database of email nog niet bestaat
        $sql = "
            SELECT
            id
            FROM
            gebruikers
            WHERE
            mail='".$_POST['mail']."'
        ";
        if( $db->aantaldb($sql) == 0 ):
        
                // maak nieuw record in database
                $ml = $db->schonestring($_POST['mail']);
                $nm = $db->schonestring($_POST['naam']);
                $sid = session_id();
                $pass = $db->versleutel($_POST['pass1']);
                $nu = $db->maaksqldate(time());
                $sql = "
                    INSERT TO
                    gebruikers
                    (mail, naam, pass, sid, aanmaak, login)
                    VALUES
                    ('$ml', '$nm', '$pass', '$sid', '$nu', '$nu')
                ";
                return $db->querydb($sql);
            else:
                $terug['error_mail'] = 'E-mail is al in gebruik!';
                return false;
            endif;
        else:
            return false;
        endif;
    }

function maak_sessie($naam){
    $_SESSION['sid'] = session_id();
    $_SESSION['naam'] = $naam;
}


function vernietig_sessie(){
    session_unset();
    session_destroy();
    setcookie('PHPSESSID', '', time()-3600, './');
}

function form_inup(){
    return '
        <h1>Aanmelden of inloggen</h1>
        wilt u
        <a href="'.$_SERVER["SCRIPT_NAME"].'?signin">Inloggen</a> of
        <a href="'.$_SERVER["SCRIPT_NAME"].'?signup">Annmelden</a>?<br>
    ';
}

function form_in($gegevens = array()){
    $regels = '<h1>Inloggen</h1>';
    $regels .= '<form name="signin" action="" method="POST">';
    if( isset($gegevens['error_mail']) ):
        $regels .= $gegevens['error_mail'].'<br>';
    endif;
    $regels .= '
        E-mailadres:
        <input type="text" name="mail" value="'.$_POST['mail'].'"><br>
        ';
    if( isset($gegevens['error_pass']) ):
        $regels .= $gegevens['error_pass'].'<br>';
    endif;
    $regels .= '
        Wachtwoord:
        <input type="password" name="pass" value=""><br>
        <input type="submit" name="in" value="Inloggen"><br>
    ';
    $regels .= '</form>';
    return $regels;
}

function form_up($gegevens = array()){
    $regels = '<h3>Sign up</h3>';
    $regels .= '
        <form name="signup" action="" method="POST">
        ';
    if( isset($gegevens['error_mail']) ):
        $regels .= $gegevens['error_mail'].'<br>';
    endif;
    $regels .= '
        E-mailadres:
        <input type="text" name="mail" value="'.$_POST['mail'].'"><br>
    ';
    if( isset($gegevens['error_naam']) ):
        $regels .= $gegevens['error_naam'].'<br>';
    endif;
    $regels .= '
        Naam:
        <input type="text" name="naam" value="'.$_POST['naam'].'"><br>
    ';
    if( isset($gegevens['error_pass']) ):
        $regels .= $gegevens['error_pass'].'<br>';
    endif;
    $regels .= '
        Wachtwoord:
        <input type="password" name="pass1" value=""><br>
        Herhaal wachtwoord:
        <input type="password" name="pass2" valeu=""><br>
        <input type="submit" name="up" value="Aanmelden"><br>
    ';
    $regels .= '</form>';
    return $regels;
}

include('html_staart.inc.php');

?>


config.inc.php

<?php
define('DB_HOST', 'localhost'); // meestal localhost
define('DB_USER', '#'); // naam van de gebruiker
define('DB_PASS', '#'); 
define('DB_NAME', 'inlog_pagina'); // naam van de database

include('config.inc.php');//???
include('dbklasse.inc.php');

$mail = '[email protected]';
$naam = 'marietje';
$sid = session_id();
$pass = 'geheim wachtwoord';

$db = new dbklasse(DB_HOST, DB_NAME, DB_USER, DB_PASS);
$db->opendb();

$sql = "
    INSERT INTO
    gebruikers
        (mail, naam, pass, sid, aanmaak, login)
    VALUES
        ('$mail', '$name', '"
        .$db->vesleutel($pass).
        "', '$sid', '"
        .$db->maaksqldate(time()).
        "', '"
        .$db->maaksqldate(time()).
        "')
    ";
    
if( $db->querydb($sql) ):
    echo "<p>Gebruiker $naam aangemaakt</p>";
endif;

$db->sluitdb();
?>
[/quote]

dbklasse.inc.php
[quote]
<?php

class dbklasse{
    var $dbhost;
    var $dbname;
    var $dbuser;
    var $dbpass;
    var $dblink;
    // aanmeld gegevens vastellen
    function _construct($h, $n, $u, $p){
        $this->dbhost = $h;
        $this->dbname = $n;
        $this->dbuser = $u;
        $this->dbpass = $p;
    }
    // db verbinding openen
    function opendb(){
        $this->dblink = mysql_connect(DB_HOST, DB_USER, DB_PASS)
            or die ('<p>fout: connect</p>');
        mysql_select_db(DB_NAME, $this->dblink)
            or die ('<p>fout: select</p>');//???
        return true;
    }
    
    function sluitdb(){
        mysql_close($this->dblink)
        or die ('<p>fout: close</P>'); //???
    return true;
    }
    
    function querydb($sql){
        return mysql_query($sql, $this->dblink)
            or die ("<p>fout: $sql</p>");//???
    }
    
    function aantaldb($sql){
        $reslutaat = mysql_query($sql, $this->dblink)
            or die ("fout: $sql");//???
        return mysql_num_rows($resultaat);
    }
    
    function rijendb($sql){
        $resultaat = mysql_query($sql, this->dblink)
            or die ("fout: $sql");//???
        $data = array();
        while( $d = mysql_fetch_array($resultaat, MYSQL_ASSOC)):
            $data[] = $d;
        endwhile;
        return $data;
    }
    
    function schonestring($string, $html=false){
        $string = trim($string);
        if ( !$html ):
            $string = strip_tags($string);
        endif;
        $string mysql_real_escape_string($string);
        return $string;
    }
    // maak een datum en tijdstip
    function maaksqldate($tijdstamp){
        return date('Y-m-d H:i:s', $tijdstamp);
    }
    // versleuteld wachtwoord
    function versleutel($pass){
        return md5($pass);
    }
}

?>

Er mist een endif; in de functie signin().

Als je een if(): schrijft moet er ook altijd een endif; volgen.
als je een if in een if schrijft eindig je ook met endif; endif;

<?php
if($a == 1):
if($b == 1):
// doe iets
endif;
endif;
?>

Goed inspringen zoals ik hierboven doe is hierbij ook belangrijk om je code leesbaar te houden. (Bij iedere if, while, for, foreach etc doe je een tab erbij en bij een endif of } doe je weer een tab minder)

Verder wil ik graag adviseren om accolades te gebruiken {}. Dit wordt door de meeste programmeurs zo gedaan en komt ook overeen met veel andere programmeertalen:
<?php
if($a == 1) {
if($b == 1) {
// doe iets
}
}
?>
Just curious, welk boek is dit (ISBN nummer)?

Want als je de code haast letterlijk hebt overgenomen weet ik niet of dit zo'n fantastisch boek is om PHP te leren :).
Een drukfoutje kan gebeuren. Daarvoor hoef je niet een heel boek voor af te schrijven.

- Aar - op 05/02/2015 09:15:30

Een drukfoutje kan gebeuren. Daarvoor hoef je niet een heel boek voor af te schrijven.




Is het uberhaupt wel slim om te leren uit een boek dat geen accolades in if-loops gebruikt? Ik ken niet anders dan accolade gebruik namelijk...

EDIT:
Henk de Vriep op 05/02/2015 09:54:39
Is het uberhaupt wel slim om te leren uit een boek dat geen accolades in if-loops gebruikt? Ik ken niet anders dan accolade gebruik namelijk...

Ik kan mij vergissen, maar volgens mij bedient WordPress zich hier nog wel eens van.


- Aar - op 05/02/2015 09:15:30
Een drukfoutje kan gebeuren. Daarvoor hoef je niet een heel boek voor af te schrijven.

Daar heb ik het dan ook niet over, het gaat mij meer om naamgeving en de algehele organisatie van de code.

Daarnaast is het niet belangrijk wat je precies doet, maar waarom je iets doet. Uit dat laatste spreekt namelijk motivatie wat een gedachtenproces impliceert, die gebaseerd is (of zou moeten zijn) op kennis.

Naar aanleiding van de codefragmenten werd ik nieuwsgierig naar het pad wat wordt gevolgd dat uitmondt in die code. Als ik de beweegredenen kan inzien, kan ik misschien beter begrijpen waarom de code er zo uitziet.
in het de index zoals jij die hier hebt staan moet regel 99 en 100 een regel zijn

WHERE mail='".$_POST['mail']."' && pass='".$db->versleutel($_POST['pass'])."'";
en daarin staat mail dat in de SELECT daar boven niet voorkomt Dus dat zou de fout melding wel eens kunnen zijn,
Pas op ik ben ook maar een leek, dus pin me daar niet op vast, ik probeer alleen maar te helpen.
Niek Kasius op 05/02/2015 15:29:16

in het de index zoals jij die hier hebt staan moet regel 99 en 100 een regel zijn

WHERE mail='".$_POST['mail']."' && pass='".$db->versleutel($_POST['pass'])."'";
en daarin staat mail dat in de SELECT daar boven niet voorkomt Dus dat zou de fout melding wel eens kunnen zijn,
Pas op ik ben ook maar een leek, dus pin me daar niet op vast, ik probeer alleen maar te helpen.


Nee dat is de fout niet. De SELECT clause heeft niks van doen met de WHERE clause in dit voorbeeld. In de select geef je alleen aan wat er verwacht wordt in het resultaat van de query.

Hoewel de error zegt dat het op regel 99 fout gaat is dat in dit geval niet de zelfde regel 99 als van de error.

"Parse error: syntax error, unexpected '}' in C:\XAMPP\htdocs\inlog_pagina\login.php on line 99"

Je geeft index.php en config.inc.php

S.v.p. login.php plaatsen

Als je een if(): schrijft moet er ook altijd een endif; volgen.
als je een if in een if schrijft eindig je ook met endif; endif;

Bedankt Frank!
Dit was idd de foutmelding.
Ik kan weer verder.

Een drukfoutje kan gebeuren. Daarvoor hoef je niet een heel boek voor af te schrijven.

Is het uberhaupt wel slim om te leren uit een boek dat geen accolades in if-loops gebruikt? Ik ken niet anders dan accolade gebruik namelijk...

Ik ben opzich best tevreden over het boek.
Het heeft me al mooi op weg geholpen.
Fouten kunnen idd voorkomen.
Ik denk zelfs dat er maar weinig programmeerboeken bestaan waar geen code fouten in staan.
Php En mysql voor beginners van Victor Peters? Ik heb dit boek ook. Veel foutjes, toch veel uit geleerd

Reageren