Goedenavond,

Ik heb een klein vraagje over het onderwerp wat laatst is besproken: "http://www.phphulp.nl/php/forum/topic/oop-login/75926/1/".

Class Database
Class User

Nu wil ik mysqli gebruiken om de user in te loggen. Dit geeft (bij mij) alleen een probleem.

De class User kan niet bij de gegevens uit class Database, en dus geen query uitvoeren omdat ik een belangrijke parameter mis.

Voorbeeld class User (ik kan dus niet bij de variabele $link uit class Database):

<?php
$result = mysqli_query($link, "SELECT gebruikerid FROM gebruikers WHERE gebruikersnaam='" . $username . "' AND wachtwoord='" . $password . "'") or die(mysql_error());
?>

Dit maakt de class Database dus overbodig?

Het volledige script (class_lib.php):

<?php

class database{

public function connect(){

$link = mysqli_connect('localhost','root','','login');

}
}

class user{

public function connect(){

$link = database::connect(); //werkt niet

$username = $_POST['gebruikersnaam'];
$password = $_POST['wachtwoord'];

$result = mysqli_query($link, "SELECT gebruikerid FROM gebruikers WHERE gebruikersnaam='" . $username . "' AND wachtwoord='" . $password . "'") or die(mysql_error());

if (mysqli_num_rows($result) > 0){
echo "Succesvol ingelogd.";
}
else{
echo "Vul gebruikersnaam / wachtwoord in.";
}
}
}

?>
Geef je database object mee als parameter in je construct.

<?php

class database{

    public function connect(){
    
        $link = mysqli_connect('localhost','root','','login');
        
    }
}

$database = new Database;

$user = new User($database);

class user{

private $_database;

    public function connect(database $database){
    
     $this->_database = $database; //nu kan je gewoon alle functies gebruiken uit je db object via $this->_database->functie()


        $username = $_POST['gebruikersnaam'];
        $password = $_POST['wachtwoord'];

        $result = mysqli_query($link, "SELECT gebruikerid FROM gebruikers WHERE gebruikersnaam='" . $username . "' AND wachtwoord='" . $password . "'") or die(mysql_error());
        
        if (mysqli_num_rows($result) > 0){
            echo "Succesvol ingelogd.";
        }
        else{
            echo "Vul gebruikersnaam / wachtwoord in.";
        }
    }
}

?>
Gebruik objecten...
Dus ook het MySQLi object
Bedankt voor de hulp zover. Ik gebruik ook objecten in php, alleen niet in mysqli.
Zou je me een voorbeeld kunnen geven hoe ik dat hier zou kunnen gebruiken?
Je hebt nu mysqli_connect dat is gewoon een mysql interface. Wat je het best kunt gebruiken is de objecten interface van mysqli:
$sql = new mysqli('localhost', 'naam', 'pass', 'db');

Wat leesstof: http://phptuts.nl/view/26/
The Dutch Guy op 30/01/2011 17:57:16



Ik zal hier voortaan op letten. Helaas antwoordde niemand meer, vandaar.

De bovenstaande code heb ik wat aangepast, maar bij mij werkt het niet. Wat doe ik fout?

index.php

<?php

if ($_SERVER['REQUEST_METHOD'] == 'POST')

{

require('classes/class_lib.php');

$database = new database;

$user = new user($database);
$user->connect($database);
}

?>

<html>

<head>
<title>login</title>
</head>

<body>
<ul>
<form class="user" method="post" action="index.php">
<li>Naam: <input class="user" type="text" size="10" maxlength="40" name="gebruikersnaam"></li>
<li>Wachtwoord: <input class="user" type="password" size="10" maxlength="10" name="wachtwoord"></li>
<input class="submit_user" type="submit" value="Inloggen">
</form>
</ul>
</body>

</html>

class_lib.php

<?php

class database{

public function connect(){

$link = mysqli_connect('localhost','root','','login');

}
}

class user{

protected $_database;

public function connect($database){

$this->_database = $database;
$link = $this->_database->connect();

$username = $_POST['gebruikersnaam'];
$password = $_POST['wachtwoord'];

$result = mysqli_query($link, "SELECT gebruikerid FROM gebruikers WHERE gebruikersnaam='" . $username . "' AND wachtwoord='" . $password . "'") or die(mysql_error());

if (mysqli_num_rows($result) > 0){
echo "Succesvol ingelogd.";
}
else{
echo "Vul gebruikersnaam / wachtwoord in.";
}
}
}

?>

Warning: mysqli_query() expects parameter 1 to be mysqli, null given in...
- Gebruik de OOP interface van MySQLi
- Mysql_error is geen MySQLi.
- Gebruik geen or die in OOP, doe mooie foutafhandeling met exceptions
- Regel 21 en 22 onnodig variabele kopiëren
- Gebruik geen superglobals in OOP, laat de gebruik die invoeren.
- Functie connect geeft niet aan wat er gebeurd. Noem hem bijv. login.
- Regel 21 en 22 onnodig variabele kopiëren

Onzinnig...

Ik neem aan dat je de basale concepten van OOP kent. Een daarvan is 'Encapsulation', het scheiden van verantwoordelijkheden. Dit geldt voor objecten, maar helemaal voor methodes. De functie user::connect() mag dus niet de database laten verbinden EN de gebruiker in laten loggen.

Ook mag het object geen gegevens uit server data halen, deze moet je als argumenten invoeren en mag het geen data echoën, alleen teruggeven.
Nu begrijp ik er niks meer van :P

De user mag dus geen query bevatten en de database verbinding overnemen uit het database object?
Nee, dat kan wel, maar user::connect(), wat inderdaad beter user::login() kan heten, mag nooit Database::connect() aanroepen.

<?php
class user{

protected $_database;

public function setDatabas($database){

$this->_database = $database;

}

public function login($username, $password){

// Gebruik MySQLi's OOP interface
// Laat het database object bij fouten exceptions geven
// Gebruik prepared statements
$result = $this->_database->query("SELECT gebruikerid FROM gebruikers WHERE gebruikersnaam=? AND wachtwoord=?", $username, $password);

if ($result->num_rows > 0){
return true; // Hoe dat wordt weergegeven is niet de verantwoordelijkheid van dit object
}
else{
return false;
}
}
}

Reageren