Hoi,

Bij deze mijn eerste classe.
Zouden jullie hier tips voor willen geven?
Onderaan staat een klein voorbeeld.

<?php
class database{
private $db_server = "localhost";
private $db_user = "username";
private $db_pass = "*******";
private $db_database = "database";
public $connection;

public function connect(){
$this->connection = mysqli_connect($this->db_server, $this->db_user, $this->db_pass, $this->db_database);
}

public function userInfo($username, $columns=array()){
$items = '';
foreach($columns as $column){
$items .= $column.', ';
}
$items = substr($items, 0, -2);
$usersql = "SELECT $items FROM users WHERE username='".mysqli_real_escape_string($this->connection, $username)."'";
$usersel = mysqli_query($this->connection, $usersql);
return mysqli_fetch_assoc($usersel);
}
public function tryLogin($username, $wachtwoord){
$usersql = "SELECT id, username, password FROM users WHERE username='".mysqli_real_escape_string($this->connection, $username)."' AND password='".md5($wachtwoord)."'";
$usersel = mysqli_query($this->connection, $usersql);
$info = mysqli_fetch_assoc($usersel);
if($info['id'] == null){
return 1; // verkeerde inloggegevens
}else{
return 2; // ingelogd
}
}

private function sqlError($sql, $error){
echo '<span style="color: #FF0000; font-weight: bold;">Er is iets fout gegaan. Onze excuses hiervoor.<br>De foutmelding is automatisch verzonden en zal zo snel mogelijk worden opgelost.</span>';
mail("[email protected]", "sql error", 'SQL = '.$sql.'
mysqli_error = '.$error);
return true;
}

public function query($sql, $type=null){
if($type==null){
$query = @mysqli_query($this->connection, $sql);
if($query){
return $query;
}else{
return $this->sqlError($sql, mysqli_error($this->connection));
}
}elseif($type == "object"){
$query = @mysqli_query($this->connection, $sql);
if($query){
return mysqli_fetch_object($query);
}else{
return $this->sqlError($sql, mysqli_error($this->connection));
}
}elseif($type == "array"){
$query = @mysqli_query($this->connection, $sql);
if($query){
return mysqli_fetch_array($query);
}else{
return $this->sqlError($sql, mysqli_error($this->connection));
}
}elseif($type == "assoc"){
$query = @mysqli_query($this->connection, $sql);
if($query){
return mysql_fetch_assoc($query);
}else{
return $this->sqlError($sql, mysqli_error($this->connection));
}
}elseif($type == "rows"){
$query = @mysqli_query($this->connection, $sql);
if($query){
return mysqli_num_rows($query);
}else{
return $this->sqlError($sql, mysqli_error($this->connection));
}
}
}

public function closeConnection(){
mysqli_close($this->connection);
}
}






$oDb = new database();
$oDb->connect();

if($oDb->tryLogin("Tom", "******") == 1){
echo 'Je hebt een verkeerd gebruikersnaam of wachtwoord ingevoerd!';
}else{
echo 'Je bent ingelogd!';
}

$rob = $oDb->userInfo("Rob", array("username, bedrag"));
echo '<br>'.$rob['username'].' zijn bedrag is '.$rob['bedrag'];

$oDb->query("UPDATE users SET bedrag='100' WHERE username='".$rob['username']."'");

echo '<br>Er zijn '.$oDb->query("SELECT id FROM users WHERE bedrag='100'", 'rows').' gebruikers met een bedrag van 100<br>';

$oDb->query("SELECT id FROM users WHEREhfghfghfg bedrag='25'", 'rows'); // Moet error geven
$oDb->closeConnection();
?>
Je hebt een public $connection die je met de procedurele versie van MySQLi instelt:


<?php
class database{
    private $db_server = "localhost";
    private $db_user = "username";
    private $db_pass = "*******";
    private $db_database = "database";
    public $connection;
    
    public function connect(){
        $this->connection = mysqli_connect($this->db_server, $this->db_user, $this->db_pass, $this->db_database);
    }
}
?>


Dat kan alvast een stuk netter:


<?php
class Database
{
    const DB_SERVER   = 'localhost';
    const DB_USER     = 'username';
    const DB_PASS     = '*******';
    const DB_DATABASE = 'database';

    private $Connection;
    
    public function connect()
    {
        $this->Connection = new mysqli(self::DB_SERVER, self::DB_USER, self::DB_PASS, self::DB_DATABASE);
    }
}
?>


Hetzelfde geldt voor andere methoden. Je class is nu een OOP-versie van de procedurele versie van MySQLi. Bijvoorbeeld:


<?php
// Geen procedureel MySQLi ...
public function closeConnection(){
    mysqli_close($this->connection);
}

// ... maar objectgeoriënteerd MySQLi
public function closeConnection()
{
    $this->Connection->close();
}
?>


Verder zou ik in jouw geval overwegen om MySQLi te extenden:


<?php
class Database extends mysqli
{
    const DB_SERVER   = 'localhost';
    const DB_USER     = 'username';
    const DB_PASS     = '*******';
    const DB_DATABASE = 'database';

    public function __construct()
    {
        parent::__construct(self::DB_SERVER, self::DB_USER, self::DB_PASS, self::DB_DATABASE);
    }
}

// Database is complete OOP-kloon van MySQLi en ondersteunt bijvoorbeeld:
$db = new Database();
$db->close();
?>

Reageren