OOP leren

Overzicht Reageren

Pagina: « vorige 1 2 3 4 volgende »

22/08/2009 11:57:00
Quote
Met een krachtige computer maakt het vrijwel niets uit of je MD5, SHA1 of SHA256 gebruikt..
Je moet een andere manier van hashen zien te vinden die uniek is. Dus dan ga je werken met Salt's :)
 
PHP hulp

PHP hulp

09/02/2012 05:27:18
Gesponsorde koppelingen:
BHosted Hosting al vanaf € 1,- per maand

Controleer nu gratis jouw domeinnaam:

  
 
Jelmer rrrr

Jelmer rrrr

22/08/2009 12:01:00
Quote
Je kan geen try/catch gebruiken bij de definitie, simpelweg omdat PHP dan nog niet gestart is met het uitvoeren van je code (maar nog bezig is met het omzetten van programmacode naar bytecode die de PHP engine kan uitvoeren)

Je kan niet zelf een PDOException gooien. Een PDOException bevat allemaal extra info zoals de db foutmelding, en die heb je niet wanneer je een exception wilt gooien voor een niet-database fout.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?

class UserSessionController
{
    protected $db;
    
    public function __construct()
    {

        $this->db = new PDO('mysql:host=localhost;dbname=users','user','password');
        $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }

    
    public function login($inputUser,$inputPass)
    {

        $sql = "SELECT
                    id, username
                FROM
                    users
                WHERE
                    username = :username
                AND
                    password = MD5(:password)"
;
        $stmt = $this->db->prepare($sql);
        
        $stmt->bindParam(':username', $inputUser);
        $stmt->bindParam(':password', $inputPass);
        
        $stmt->execute();
        
        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        
        if(!$row)
        {

            throw new Exception('Combinatie van Gebruikersnaam en wachtwoord niet bekend');
        }

        
        $_SESSION['id'] = $row['id'];
        $_SESSION['user'] = $row['username'];
    }
}

?>
Gewijzigd op 01/01/1970 01:00:00 door Jelmer rrrr
 
Jelmer rrrr

Jelmer rrrr

22/08/2009 12:42:00
Quote
Over exceptions, het voordeel van exceptions is dat alles stopt wat er bezig was, totdat de exception wordt opgevangen. Hierdoor hoef je niet overal meer met if-statements te controleren of iets wel gelukt is, je kan er gewoon van uitgaan dat iets is gelukt. Zo niet, dan wordt er wel een exception gegooid, en wordt de code die ervan uitging dat het was gelukt niet uitgevoerd.

Voorbeeldje. Alle code die eruit-gecomment is (geel?) wordt niet uitgevoerd dankzij de exception die vanuit pak_water() gegooid wordt. Want zodra de exception gegooid wordt springt PHP naar een bijpassend catch-blok. Of als dat er niet is, krijg je zo'n Uncaught Exception error.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php

function was_auto()
{

    $auto = parkeer_auto();
    
    /*$water = */ pak_water();
    
    // het resultaat van pak_water aan $water toekennen gebeurt al niet meer
    // omdat pak_water faalde, en een exception gooide. Alles stopt, totdat
    // de exception wordt opgevagen.
    
    /* wassen($auto, $water); */

}

function
parkeer_auto()
{

    if(!is_er_een_auto())
    {

        /* throw new Exception('Er is geen auto'); */
    }
    
    return new Auto();
}

function
pak_water()
{

    throw new Exception('Geen kraan beschikbaar');
}


/*function wassen($auto, $water)
{
    echo "Auto $auto is weer schoon dankzij $water";
}
*/


try
{
    was_auto();
    
    /* krijg_geld() */
}
catch(Exception $e)
{

    echo "Kuuuuut: " . $e->getMessage();
}


// uiteindelijke uitvoer is dus: "Kuuuuuut: Geen kraan beschikbaar"
?>


Verder is het mogelijk om exceptions te filteren. Dat is het nut van verschillende exception-classes hebben:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php

try
{
    $session_controller = new UserSessionController();
    
    $session_controller->login($_POST['username'], $_POST['password']);
    
    echo "Succesvol ingelogd";
}

catch(UserSessionControllerException $e) // ervan uitgaande dat deze gegooid wordt wanneer inloggen niet wil
{
    echo "Je kon niet inloggen vanwege " . $e->getMessage();
    
    toon_loginformulier_opnieuw();
}

catch(PDOException $e)
{

    echo "Door een database fout kon je niet inloggen. Sorry voor het ongemak, probeer het later nog eens";
    
    mail_systeembeheer($e);
}

catch(Exception $e)
{

    echo "Er is een onbekende fout opgetreden";
    
    mail_programmeur($e);
}


?>

Zie? Aan de hand van het soort exception kan je een goeie volgende stap programmeren. Misschien wil je Exception hier wel helemaal niet opvangen, omdat je die op een niveau lager beter kan afhandelen. (verderop hier een voorbeeldje van)

Je moet wel even opletten op de volgorde. PDOException is namelijk een uitbreiding van Exception (PDOException erft van Exception) Hetzelfde geldt voor UserSessionControllerException. Omdat alle exceptions van Exception moeten overerven vangt dat laatste blok altijd je exception op. Of in een voorbeeldje:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php

try
{
    $session_controller = new UserSessionController();
    
    $session_controller->login($_POST['username'], $_POST['password']);
    
    echo "Succesvol ingelogd";
}

catch(Exception $e)
{

    echo "Er is een onbekende fout opgetreden";
    
    mail_programmeur($e);
}

catch(PDOException $e)
{

    /* echo "Door een database fout kon je niet inloggen. Sorry voor het ongemak, probeer het later nog eens";
    
    mail_systeembeheer($e); */

}

?>

De code die ik hier eruit-gecomment heb zal ook nooit worden uitgevoerd, omdat alle PDOExceptions ook Exceptions zijn, en alle Exceptions door het eerste blok worden opgevangen. Alle PDOExceptions ook dus, en daarom zal het tweede blok nooit door die exceptions bereikt worden.

Dat filteren kan je ook in delen doen. Stel dat je een database, een backup-database en een tekstbestand hebt om je berichten in op te slaan:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php

function maak_db_verbinding()
{

    if(is_site_in_offline_modus())
        throw new Exception("Site is in offline modus");
    
    try
    {
        return new PDO('main-database');
    }

    catch(PDOException $e)
    {

        return new PDO('backup-database');
    }
    
}

function
sla_op($bericht)
{

    try
    {
        $db = maak_db_verbinding();
        
        $db->insert($bericht);
        
        return true;
    }

    catch(PDOException $e) // alle db-acties zijn mislukt
    {
        $tekstbestand = fopen('...', 'a');
        
        if(!$tekstbestand)
            throw new Exception("Aahw, tekstbestand openen wil niet");
        
        fwrite($tekstbestand, $bericht);
        
        fclose($tekstbestand);
        
        return true;
    }
}


try
{
    $bericht = array('Jelmer', 'Paashazen zijn rood, Kabouters zijn blauw...');

    sla_op($bericht);
}

catch(Exception $e)
{

    echo "Helaas, bericht opslaan is mislukt :(";
}


?>


Het is wat ingewikkelder misschien, exceptions, maar zie je hoe weinig if/else statements ik in totaal gebruikt heb? Amper eentje, puur omdat je tijdens het programmeren niet constant hoeft na te denken over "wat moet ik doen wanneer dit mislukt, of wanneer dat mislukt". Dat deel van je code groepeer je in catch-blokken.
Gewijzigd op 01/01/1970 01:00:00 door Jelmer rrrr
 
Roeltje M

Roeltje M

22/08/2009 16:22:00
Quote
Erg bedankt weer Jelmer! Je zou echt zo een boek kunnen schrijven. Ik wist namelijk niet dat na een Exeption het script direct afsluit.

Even over mijn stukje:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?
    public function __construct()
    {

        $this->db = new PDO('mysql:host=localhost;dbname=users','user','password');
        $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }

?>

moet hier geen PDOExeption in? Of kan ik als er een error in zit 'm al direct opvangen? Standaard ingebouwd?

En dit stukje:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?     try
    {
        return new PDO('main-database');
    }

    catch(PDOException $e)
    {

        return new PDO('backup-database');
    }
?>


gaat dus eerst naar main-database, lukt dat niet (door storing ofzo) dan gaat ie verder met backup database? Zo ja, dan begrijp ik het stuk.

En moeten al deze gegevens in de __construct?:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    <?php     private $_id;
    private $_username;
    private $_pass;
    private $_naam;
    private $_adres;
    
    public function __construct($inputId,$inputUsername,$inputPassword,$inputNaam,$inputAdres)
    {

        $this->_id = $inputId;
        $this->_username = $inputUsername;
        $this->_pass = $inputPassword;
        $this->_naam = $inputNaam;
        $this->_adres = $inputAdres;                        
    }
?>

Dit worden er namelijk nog veel meer. En hierbij krijg ik de error "Could not find driver":
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
    try
    {
        $log = new UserSessionController();
        $log->login($_POST['user'],$_POST['pass']);    
    }
    catch(Exception $e)
    {
        echo "Kuuuuut: " . $e->getMessage();
    }
}
wat bedoelt ie daarmee?
Gewijzigd op 01/01/1970 01:00:00 door Roeltje M
 
Flip van Rijn

Flip van Rijn

22/08/2009 16:34:00
Quote
Je moet wel een instantie aanmaken naar je class.
 
Afra ca

Afra ca

22/08/2009 20:13:00
Quote
PDO drivers moeten in php.ini natuurlijk wel enabled zijn.
 
Jelmer rrrr

Jelmer rrrr

22/08/2009 20:41:00
Quote
Er hoeft geen PDOException in omdat als je hem opvangt, het je niet verder helpt. Een UserSessionController zonder goed-werkende PDO is niet nuttig, dus dat het gooien van de exception het aanmaken van de instantie verhindert is alleen maar goed. En wat wil je met de exception doen als je hem opvangt? UserSessionController kan weinig goeds doen wanneer zo'n exception optreedt, dus niet opvangen lijkt mij het allerbeste.

Over die main- en backup-database, jep, dat heb je goed gezien :)

En of al die argumenten aan de constructor meegegeven moeten worden... Ik zou aan de constructor alleen de informatie meegeven welke nodig is bij het maken van een instantie van UserSessionController. Informatie welke direct vanaf het begin en altijd nodig is. Bijvoorbeeld een instantie van PDO (maar die maak je al aan in de constructor, dat kan ook) Zonder je instantie van PDO heb je gewoon niets aan je UserSessionController, dus die meegeven/aanmaken in de constructor is logisch.

Maar bijvoorbeeld gebruikersnaam en wachtwoord zijn alleen nodig voor de login-method van UserSessionController. Het heeft niet veel nut om die mee te geven aan de constructor. Stel dat je je UserSessionController juist wilt gebruiken om de sessie te beëindigen, dan zijn username & password niet erg nuttig.
 
Roeltje M

Roeltje M

22/08/2009 20:51:00
Quote
Ok, en als ik een class maak met AddUser (waarin adresgegevens etc staan), moet ik dan ALLE gegevens in construct zetten, of alleen het ID (zag ik bij iemand anders)?

En wat betreft de PDO.Drivers? Hoe zet ik die aan? (http://www.design-xtr.nl/phpinfo.php)?
Gewijzigd op 01/01/1970 01:00:00 door Roeltje M
 
Jelmer rrrr

Jelmer rrrr

22/08/2009 21:15:00
Quote
Je maakt geen class voor AddUser. AddUser is een actie, een class is altijd een enkelvoudig zelfstandig naamwoord. :)

Je hebt dus iets nodig wat de actie addUser uit kan voeren. Wat voegt users toe (waaraan toe?) Iets dat de users beheert. Dus dan maak je een UserController/Store/Provider o.i.d. welke je kan gebruiken voor het opslaan en ophalen van gebruikers. En dan zie je weer dat je aan zo'n object ook alleen iets a la PDO aan de constructor zou meegeven, want adresgegevens e.d. zijn alleen nodig voor die ene addUser actie, en daarom geef je ze als argumenten mee aan een method, en niet aan de constructor.

Misschien dat je het op een andere manier makkelijker kan onthouden: Als je de gegevens maar eenmalig nodig hebt, horen ze over het algemeen niet in de constructor thuis (tenzij de constructor ze gebruikt om een ander object te starten wat hij langer nodig heeft) Dus stel dat je 5 gebruikers zou willen toevoegen, dan heb je bij alle 5 de gebruikers dezelfde database-gegevens nodig. PDO gaat dus in de constructor. Maar je hebt voor iedere gebruiker andere adresgegevens nodig, dus die gaan niet in de constructor, maar als argumenten mee aan de method die de individuele gebruikers aanmaakt.


PDO drivers moet je soms aanzetten door
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
extension=pdo_mysql.so (of dll als je webserver op een widows-doos draait)

in je PHP.ini te zetten. Vergeet niet de webserver (apache, IIS) te herstarten daarna. Als je bij een hostingprovider zit, en niet je eigen php.ini kan aanpassen, dan moet je even een lief mailtje sturen :)
Gewijzigd op 01/01/1970 01:00:00 door Jelmer rrrr
 
Roeltje M

Roeltje M

22/08/2009 23:07:00
Quote
Jelmer, nogmaals bedankt!
Dus mijn constructor ziet er over het algemeen zo uit (met db acties):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php     public function __construct()
    {

        $this->db = new PDO('mysql:host=localhost;dbname=houtenladen','lade','houten');
        $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
?>


of

<?php
    public function __construct()
    {

         db_connect(); // niet in een class toch?
    }
?>


en nog iets: id is wel een constructor bij user? Eigenlijk gebruik je die toch maar 1x (gegevens opvragen)? En is het ook een constructor bij de class UserStore (inserten, updaten, deleten)? Lijkt me wel toch?
 
Jelmer rrrr

Jelmer rrrr

23/08/2009 11:29:00
Quote
Inderdaad, bij classes waar je een database nodig hebt is het meestal zo dat je in de constructor al voor de database-verbinding zorgt. Een class die voornamelijk als doel heeft data in/uit de database te halen... zonder database-verbinding is die vrij nutteloos ;)

Het is dan wel weer redelijk normaal om niet de verbinding zelf in de constructor te maken, maar er gewoon voor te zorgen dat je een verbinding hebt. Bijvoorbeeld zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
class UserController
{
    private $db;
    
    public function __construct(PDO $db)
    {

        $this->db = $db;
    }
}


class SessionController
{
    private $db;
    
    public function __construct(PDO $db)
    {

        $this->db = $db;
    }
}


$db = new PDO('...');

$user_controller = new UserController($db);

$session_controller = new SessionController($db);
?>

Zo maken beide objecten gebruik van dezelfde verbinding, hoef je niet voor ieder object een aparte verbinding te openen. Die "PDO $db" in de constructor-definitie zorgt ervoor dat het eerste argument dat je aan de constructor meegeeft hoe dan ook een instantie van PDO moet zijn. Je kan dan geen UserController aanmaken (instantiëren) zonder een goeie PDO-instantie mee te geven. Of anders gezegd: je weet zeker dat wanneer je een UserController object hebt, die ook een goeie verbinding heeft. Net als wanneer je de verbinding in de constructor zelf start.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
// zal niet werken, omdat 'paashaas' geen instantie van PDO is
$user_controller = new UserController('paashaas');
?>


Ander voordeel, ook niet onbelangrijk, is dat je je database-login-gegevens niet in de class-definitie zelf meer hoeft te zetten. Als je 30 classes hebt, en in ieder je je gebruikersnaam & wachtwoord moet zetten, ook geen pretje.

Nog een ander voordeel, waar ik zelf erg bij mee ben, is dat wanneer je maar één instantie van PDO in je hele website gebruikt, je die ook heel gemakkelijk kan afwisselen voor een iets uitgebreidere versie tijdens het oplossen van foutjes. En dat zonder dat ik al m'n classes hoef aan te passen.


Of id in de constructor bij een User class moet? Stel dat je een instantie van je User class hebt, zonder een id. Kan je er dan nog alles mee wat je er normaal ook mee zou kunnen? Ik denk dat een id toch wel echt nodig is, omdat het noodzakelijk is voor update- en delete acties. Voor het maken van user objecten (de inserts) zou ik geen user object gebruiken, maar gewoon een method UserController::createUser($nickname, $password, ..) met alleen de noodzakelijke velden. Die doet dan de INSERT query, en maakt vervolgens een instantie van User voor je aan, compleet met het id dat je nu dankzij die INSERT query hebt. Daarna vul je dan de niet-zo-noodzakelijke gegevens in, en dan gebruik je je update-method van je UserController om die gegevens dan alsnog op te slaan.
 
Roeltje M

Roeltje M

23/08/2009 13:04:00
Quote
dus eigenlijk heeft de class User (gegevens ophalen) geen constructor nodig en UserController id als constructor? En als ik createUser() heb, dan moet ik daar toch alle gegevens in, zoals adres etc? Of moet ik hierin alleen logingegevens en later 1 met gegevens?

Mijn database ziet er namelijk ongeveer zo uit:

-- gebruikers --
id
username
password

-- gegevens --
id
gebruiker_id
straat blablabla

en ik zet dus in het PHP bestand de connectie? Dus zeg maar:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$db1
= mysql:host=localhost;dbname='...','...','...';

$newuser = new UserController($db1);
$newuser->createUser($naam,$pass); // adresgegevens niet?
?>


Ik moet maandag maar even contact opnemen met mijn hosting om PDO drivers aan te zetten.
Gewijzigd op 01/01/1970 01:00:00 door Roeltje M
 
Jelmer rrrr

Jelmer rrrr

23/08/2009 14:31:00
Quote
De UserController heeft niet één en dezelfde id nodig om te werken, die heeft het id van de User nodig waarmee hij werkt. Dat kunnen meerderen zijn, dus welk id zou je dan aan de constructor meegeven? Geen :) (Ter vergelijking: de UserController kan alle acties met dezelfde databaseverbinding doen, en heeft voor alle acties een databaseverbinding nodig. Dus die gaat wel via de constructor)

Het User-object heeft echter ook voor vrijwel alle acties een id nodig, en hij heeft voor alle acties hetzelfde id nodig (namelijk zijn unieke id wat die ene user apart identificeert) Dus ik zou in de constructor van User wel een id vereisen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
99
100
<?php

class UserController
{
    protected $db;
    
    public function __construct(PDO $db)
    {

        $this->db = $db;
    }

    
    public function create($username, $password, $email)
    {

        if(mb_strlen($username) < 3)
            throw new InvalidArgumentException("Username has to be at least 3 characters long");
        
        if(mb_strlen($password) < 3)
            throw new InvalidArgumentException("Password has to be a little harder to guess");
        
        if(!is_valid_email($email))
            throw new InvalidArgumentException("Invalid email");
        
        $stmt = $this->db->prepare("INSERT INTO users (username, password, email) VALUES(:username, :password, :email)");
        
        $stmt->bindParam(':username', $username);
        $stmt->bindParam(':password', $password);
        $stmt->bindParam(':email', $email);
        
        $stmt->execute();
        
        $id = $this->db->lastInsertId;
        
        $user = new User($id);
        $user->set_username($username);
        $user->set_email($email);
        
        return $user;
    }

    
    public function update(User $user)
    {

        // nodige checks weer
        
        $stmt = $this->db->prepare("UPDATE users SET ... WHERE id = :id");
        
        $stmt->bindValue(':id', $user->id());
        
        $stmt->execute();
        
        return true;
    }

}


class User
{
    private $id;
    
    private $username;
    
    private $email;
    
    public function __construct($id)
    {

        $this->id = (int) $id;
    }

    
    public function username()
    {

        return $this->username;
    }

    
    public function set_username($username)
    {

        $this->username = $username;
    }

    
    public function email()
    {

        return $this->email;
    }

    
    public function set_email($email)
    {

        $this->email = $email;
    }
    
}


$db = new Debug_PDO('...');

$controller = new UserController($db);

$user = $controller->create('Jelmer', 'abcd', 'abcd@def.nl');

$user->set_email('toch_iets_anders@ghi.nl');

$controller->update($user);

?>


Hierin zie je ook even waarom je niet de string 'mysql:host...' moet meegeven aan je constructor van UserController, maar echt de instantie zelf. Een string kan vanalles zijn, een db-identifier zoals jij geeft, of een sinterklaasgedichtje. Dat kan je PHP niet laten controleren totdat het te laat is (verbinding maken mislukt) Daarnaast heb je dan alsnog meerdere instanties van PDO voor dezelfde database, meerdere verbindingen naar dezelfde database. En dat is niet wat je wilt (want het is niet nodig)

Als je de hele PDO instantie meegeeft (Debug_PDO is een uitbreiding op PDO die ikzelf veel gebruik zoals ik eerder al aangaf) heb je voor al je controllers maar één verbinding nodig, en kan je je PDO object makkelijk omwisselen. (Bijvoorbeeld met een PDO emulator, die in werkelijkheid gewoon mysql_ functies gebruikt, maar precies hetzelfde eruit ziet als PDO. Handig als je geen echte PDO hebt)
 
Roeltje M

Roeltje M

23/08/2009 14:54:00
Quote
Aah, ik begrijp het al beter, alleen die emulator niet (waar je het op het laatst over hebt), maar dat maakt niet echt veel uit.

Ik had dus :
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$db1 = mysql:host=localhost;dbname='...','...','...';
en dat moet worden:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<? $db = new (Debug_)PDO('mysql:host=localhost;dbname='...','...','...'); ?>


toch?

En wat is het verschil tussen new PDO en new Debug_PDO?
Gewijzigd op 01/01/1970 01:00:00 door Roeltje M
 
Jelmer rrrr

Jelmer rrrr

23/08/2009 15:29:00
Quote
Jep. Debug_PDO is een class die ik zelf gebruik, normaal zou je daar PDO neerzetten. Maar ik wou even laten zien dat deze manier als voordeel heeft dat je door alleen dat regeltje te veranderen, al je classes een andere manier van communiceren met de database kan laten doen.
 
Roeltje M

Roeltje M

23/08/2009 15:44:00
Quote
Ik ben nu aan het testen op een andere server, MET PDO driver. Nu is het zo dat als ik het goede wachtwoord intyp, met goede username erbij, dat ik toch de error krijg:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?
class UserSessionController
{
    private $db;
    
    public function __construct(PDO $db)
    {

        $this->db = $db;
    }

    
    public function login($inputUser,$inputPass)
    {

        $sql = "SELECT
                    id, user
                FROM
                    gebruikers
                WHERE
                    user = :username
                AND
                    pass = :password"
;
        $stmt = $this->db->prepare($sql);
        
        $stmt->bindParam(':username', $inputUser);
        $stmt->bindParam(':password', md5($inputPass));
        
        $stmt->execute();
        
        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        
        if(!$row)
        {

            throw new Exception('Combinatie van Gebruikersnaam en wachtwoord niet bekend');
        }

        
        $_SESSION['id'] = $row['id'];
        $_SESSION['user'] = $row['username'];
    }
}

?>


online: linkje (user: admin; pass: password)
 
PHP hulp

PHP hulp

09/02/2012 05:27:18
Gesponsorde koppelingen:
 
Roeltje M

Roeltje M

24/08/2009 15:10:00
Quote
Hosting kan nu PDO Drivers niet enablen zeggen ze, te veel werk .. Maar goed, ik heb het dus onder ander domein ondergebracht. Toch gaat het nog fout (zie bericht hierboven)
 
Jelmer rrrr

Jelmer rrrr

24/08/2009 15:25:00
Quote
Boven in je code ook even zetten:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
error_reporting(E_ALL);
ini_set('display_errors', true);
?>


Volgens mij gaat het fout op de regel
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$stmt->bindParam(':password', md5($inputPass));

PDOStatement::bindParam verwacht namelijk een reference (dus een variabele) als tweede argument. Probeer bindParam eens te vervangen door bindValue. Die werkt hetzelfde, behalve dat die geen reference gebruikt, maar gewoon de waarde zelf.
 
Roeltje M

Roeltje M

24/08/2009 15:51:00
Quote
Het werkt nog niet :(

En verschil tussen bindValue en bindParam snap ik nog niet, maar zoek ik nog wel uit.
Dit is nu de code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
// In & uitloggen
class UserSessionController
{
    private $db;
    
    public function __construct(PDO $db)
    {

        $this->db = $db;
    }

    
    public function login($inputUser,$inputPass)
    {

        $sql = "SELECT
                    id, user
                FROM
                    users
                WHERE
                    user = :username
                AND
                    pass = :password"
;
        $stmt = $this->db->prepare($sql);
        
        $stmt->bindParam(':username', $inputUser);
        $stmt->bindValue(':password', md5($inputPass));
        
        $stmt->execute();
        
        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        
        if(!$row)
        {

            throw new Exception('Combinatie van Gebruikersnaam en wachtwoord niet bekend');
        }

        
        $_SESSION['id'] = $row['id'];
        $_SESSION['user'] = $row['username'];
    }
}

?>


met bovenaan:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
?>
Gewijzigd op 01/01/1970 01:00:00 door Roeltje M
 
Jelmer rrrr

Jelmer rrrr

24/08/2009 19:52:00
Quote
Wat is de rest van je code, de code die de invoer van de veldjes neemt ($_POST neem ik aan?) en die een instantie van je class maakt? Misschien zit daar de fout in.
 

Pagina: « vorige 1 2 3 4 volgende »



Overzicht Reageren

Get Adobe Flash player