Versio

Eerste Poging ...

Overzicht Reageren

Alex L

Alex L

25/03/2011 01:14:38
Quote Anchor link
Ok, hieronder is mijn eerste poging.
Even wat informatie.

De $database connectie wordt in een andere file gemaakt.
De %s functie wordt ook daar aangeroepen, deze bevat mysql_real_escape_string functie.
De error functie bevat de die() functie nadat hij de error heeft weergegeven.
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
<?php

class Inloggen {
    global $database;
    
    function
check_inloggen () {
    $result=$db->get_row($db->prepare("SELECT gebruikersnaam,wachtwoord FROM logins WHERE gebruikersnaam=%s AND wachtwoord=%s",$gebruikersnaam,$wachtwoord)); // escape string zit in andere functie die hier wordt aangeroepen
    if(!$result)
        error("Onjuiste gebruikersnaam of wachtwoord.");
    }
    
    function
inloggen ($gebruikersnaam,$wachtwoord) {
    $inloggen = $this->check_inloggen ()
    
    if (!$inloggen)
        error("Onjuiste gebruikersnaam of wachtwoord.");
        
    session_regenerate_id (sha1($gebruikersnaam));
    $_SESSION['gebruikersnaam'];
    header (location : index.php);
    }
}

?>


Is het een begin of zit ik er compleet naast zover?
Gewijzigd op 25/03/2011 01:16:03 door Alex L
 
PHP hulp

PHP hulp

24/05/2012 13:35:44
Gesponsorde koppelingen:
BHosted Hosting al vanaf € 1,- per maand

Controleer nu gratis jouw domeinnaam:

  
 
- Aar -

- Aar -

25/03/2011 08:57:16
Quote Anchor link
Quote:
De error functie bevat de die() functie nadat hij de error heeft weergegeven.

Dood aan die(), lang leven execptions ;-)
 
Mar cel

Mar cel

25/03/2011 09:50:02
Quote Anchor link
Je objectnaam klopt al niet. Een naam van een object moet altijd een zelfstandig naamwoord zijn (een user, een auto, een huis etc etc) een inloggen klopt dus niet. Je zou iets van een class User moeten hebben met de actie login. EEN user KAN namelijk inloggen.

Voor de rest is het nog te weinig om er wat van te zeggen.
 
Wouter J

Wouter J

25/03/2011 11:04:23
Quote Anchor link
@marcel, dit klopt niet helemaal. Ik meen dat Jelmer RRR eens heeft gezegd dat een user niet echt kan inloggen, daarvoor heb je strict genomen weer een andere class voor nodig, maar ik kan die quote even niet vinden.
De quote:
Jelmer rrrr:
Heel heel heel strict genomen zou je inloggen en gebruikers moeten scheiden. Je hebt gebruikers, en je hebt een set classen die inloggen mogelijk maken. Die classen regelen dan het opslaan van de combinatie gebruiker – wachtwoord, (of gebruiker + openid, daarom zijn ze losgetrokken van de User class, zodat je verschillende manieren van inloggen kan maken) en die classen regelen het onthouden van de identiteit van iemand na het inloggen.
Gewijzigd op 25/03/2011 15:59:41 door Wouter J
 
Mar cel

Mar cel

25/03/2011 11:17:42
Quote Anchor link
Ja zo kan je ook zien ja, dat is wel heel strict genomen en zeker een stap verder. Je zou dan iets van een LoginSession object kunnen maken.
Gewijzigd op 25/03/2011 11:17:53 door Mar cel
 
Alex L

Alex L

25/03/2011 20:02:46
Quote Anchor link
Volgende poging, deze keer met PDO erin.
Het is een begin dus advies is zeker welkom.

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
<?php

class Gebruiker {
    global $database;
    
    function
Inloggen()
            
    {

    try {
        $query = "SELECT gebruikersnaam,wachtwoord WHERE gebruikersnaam='%::gebruikersnaam%' AND wachtwoord='%::wachtwoord%'";
        $stmt = $this->database->prepare($query);            
        $stmt->bindParam('::gebruikersnaam', $gebruikersnaam);  
        $stmt->bindParam('::wachtwoord', $wachtwoord);              
        $stmt->execute();        
        
        $result = $stmt->fetchAll();
        if(!$result)
            throw new Exception ('Onjuiste gebruikersnaam of wachtwoord');                
        
        session_regenerate_id (sha1($gebruikersnaam));
        $_SESSION['gebruikersnaam'];
        header (location : index.php);
    }

    catch(PDOException $e)
    {

    echo $e->getMessage(); }
}

?>
 
Noppes Homeland

Noppes Homeland

25/03/2011 20:39:41
Quote Anchor link
database transacties horen niet thuis in deze class

kill -9 global definities

en neem vooral ook eens een kijkje op:
http://php.net/manual/en/language.oop5.php

http://www.pfz.nl/wiki/object-oriented-programming/
http://www.pfz.nl/wiki/oop-toepassen/
 
Alex L

Alex L

25/03/2011 22:54:00
Quote Anchor link
Is global niet acceptabel in OOP? Of gewoon niet zo mooi maar toch gewoon bruikbaar?

Normaal PHP leren ging me zo goed af maar dit is toch ff een flinke tegenvaller kwa leersnelheid.

naja goed, volgende poging, zit er nu dichterbij of verder af? Trouwens let niet op de simpele en lage sessie veiligheid, is maar om te oefenen.

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
<?php

class Inloggen {

public $gebruikersnaam;
public $wachtwoord;

    global $database;
    
    function
controleren()
    {

    try {
        $query = "SELECT gebruikersnaam,wachtwoord WHERE gebruikersnaam='%::gebruikersnaam%' AND wachtwoord='%::wachtwoord%'";
        $stmt = $this->database->prepare($query);            
        $stmt->bindParam('::gebruikersnaam', $gebruikersnaam);  
        $stmt->bindParam('::wachtwoord', $wachtwoord);              
        $stmt->execute();        
        
        $result = $stmt->fetchAll();
        if(!$result)
            throw new Exception ('Onjuiste gebruikersnaam of wachtwoord');                
    }

    catch(PDOException $e)
    {

    echo $e->getMessage();
    }
    
    
    function
inloggen() {

         this->controleren();
        session_regenerate_id (sha1($gebruikersnaam));
        $_SESSION['gebruikersnaam'];
        header (location : index.php);
    }

    
    function
sessie_controleren {
    
        if (isset($_SESSION['gebruikersnaam'])
        $this->gebruikersnaam = $_SESSION['gebruikersnaam'];
        $check = $this->controleren();
        if ($check)
            return TRUE;
        }
}

?>
Gewijzigd op 25/03/2011 22:54:15 door Alex L
 
Wouter J

Wouter J

25/03/2011 22:59:11
Quote Anchor link
Je moet geen try catch systeem maken in je class, maar erbuiten:
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
<?php
class User()
{

  private $db;

  public function __construct(PDO $pdo)
  {

    $this->db = $pdo;
  }


  public function getName(id)
  {

    $query = "
      SELECT
         nickname
      FROM
         users
      WHERE
         id = :id
    "
;
    $stmt = $this->db->prepare($query);
    $stmt->bindParam(':id', $id, PDO::INT);
    $result = $stmt->execute();

    if(!$result)
    {

      throw new PDOException('De query is niet gelukt.');
    }
  }
}


try
{
  $pdo = new PDO('mysql:host=localhost;dbname=website', 'gebruiker', 'wachtwoord');
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  $user = new User($pdo);

  $wouter = $user->getName(5);
  $alex = $user->getName(7);
}

catch(PDOException $p)
{

  echo '[PDO] Er is een fout opgetreden op lijn '.$e->getLine().':';
  echo "<br />\n".$e->getMessage();
}

?>


Verder hoor je ook niks te echoën vanuit een methode, dit moet je returnen. Dit mag niet vanuit de constructor.


---Edit---
Deze code is wel heel brak die je nu hebt:
- Wachtwoord en Gebruikersnaam moet je private of protected maken, niet public. Zie mijn uitleg daarover hier.
- Elke functie heeft ook een public/private/protected
- echo niks vanuit een class
- Header(location : index.php), location : index.php is een string zet dit tussen quotes.
- Je vergeet de methode controleren af te sluiten
- Je vergeet de methode sessie_controleren af te sluiten
- Gebruik goede namen, class inloggen methode inloggen?
Gewijzigd op 25/03/2011 23:04:35 door Wouter J
 
Karl Karl

Karl Karl

25/03/2011 23:23:43
Quote Anchor link
Wouter J op 25/03/2011 22:59:11:
Je moet geen try catch systeem maken in je class, maar erbuiten:
(...)


Dit is niet per definitie zo. Exceptions kan je rethrowen, of gewoon weten dat iets niet goed ging.
Maar goed hier is het inderdaad niet de bedoeling. Hier is het volgens mij eigenlijk niet eens de bedoeling dat user die query doet...
 
Alex L

Alex L

25/03/2011 23:43:12
Quote Anchor link
Ik heb zover ik kon het aangepast maar kom niet verder, tips zijn welkom. Ondertussen ga ik de theorie maar weer lezen.

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
<?php

class Inloggen {

private $gebruikersnaam;
private $wachtwoord;

    private $database;
    
    public function getName(gebruikersnaam,wachtwoord)
    {

        $query = "SELECT gebruikersnaam,wachtwoord WHERE gebruikersnaam=':gebruikersnaam' AND wachtwoord=':wachtwoord'";
        $stmt = $this->database->prepare($query);            
        $stmt->bindParam(':gebruikersnaam', $gebruikersnaam);  
        $stmt->bindParam(':wachtwoord', $wachtwoord);              
        $result = $stmt->execute();        
        
        if(!$result)
            throw new Exception ('Onjuiste gebruikersnaam of wachtwoord');  
    }
            
    
    
    private function setSession() {

         this->getName();
        session_regenerate_id (sha1($gebruikersnaam));
        $_SESSION['gebruikersnaam'] = $gebruikersnaam;
        header ("location : index.php");
        }
    }


    
    public function getSession {
    
        if (isset($_SESSION['gebruikersnaam'])
        $this->gebruikersnaam = $_SESSION['gebruikersnaam'];
        $result = $this->getName();
        if ($result)
            return TRUE;
        }
    }
}

?>


Toevoeging op 26/03/2011 19:05:44:

Na verschillende tutorials nog een paar keer gelezen te hebben kom ik nog niet verder.

Waar zet je de fout afhandeling neer? In het procedure gedeelte met echo's of hoe? En stel je voor dat de gebruikersnaam en wachtwoord correct zijn, moet ik de sessie aanmaak dan in een object of in de procedure gedeelte zetten?

Heb rondgekeken op dit forum maar er is geen touw aan te knopen, ieder script is compleet anders ingedeelt.
 



Overzicht Reageren