Database klasse

Status
Niet open voor verdere reacties.

raymond88

Gebruiker
Lid geworden
24 feb 2010
Berichten
287
PHP:
Nou ben ik al een tijdje op zoek naar een goede database klasse. Zelf heb ik een login systeempje, her en der aangepast wat ik op internet gevonden heb, en wou eigenlijk dezelfde database klasse gebruiken ook voor de rest van de site. Echter, ik snap niet wat ik precies fout doe. Ik wil namelijk bij het aanmaken van een nieuwe klasse, de server gebruikersnaam wachtwoord en database meesturen (voor eventuele meerdere connecties). Om dit te bereiken heb ik dus in de construct gezorgd dat deze opgenomen en ingevuld worden. Echter zo werkt het niet, met deze construct. Als ik de private vars zelf invul, doet hij het wel... Ter verduidelijking;

Aaanmaken van klasse in de index.php file:
PHP:
$database = new database('server', 'gebruiker', 'paswoord', 'database');

De klasse in database.php file:
PHP:
class database {
protected $dbh;
    protected $query;
    public $last_id;
    public $error;
    private $debug = false;
    private $username = '';
    private $password = '';
    private $database = '';
    private $hostname = '';
    private $pre      = "";
    private $affectedRows;
function  __construct($server, $user, $pass, $database, $pre='') {
        $this->hostname = $server;
        $this->username = $user;
        $this->password = $pass;
        $this->database = $database;
        $this->pre = $pre;
    }
etc. etc.

Ik weet niet wat ik verkeerd doe... De foutmeldingen die ik krijg zijn als volgt;

Warning: mysql_connect() [function.mysql-connect]: Access denied for user 'SYSTEM'@'localhost' (using password: NO) on line 28

Warning: mysql_query() expects parameter 2 to be resource, boolean given on line 39

Warning: mysql_close() expects parameter 1 to be resource, boolean given on line 35

Regel 28:
PHP:
$this->dbh = mysql_connect($this->hostname,$this->username,$this->password);
Regel 39:
PHP:
if($this->query = mysql_query($sql, $this->dbh)) {
Regel 35:
PHP:
mysql_close($this->dbh);
 
Wordt je __construct wel aangeroepen? Als je er iets van een echo inzet, krijg je dan respons? Werk je met overerving voor deze class?

En als je in de connect functie de variabelen die gebruikt worden var_dump()t wat krijg je dan te zien?
 
Ja, echo'en werkt binnen de construct. Hij geeft ook hetgeen weer wat ik er naar toe stuur. Tevens doe ik meerdere extends binnen mijn login "module".

var_dump($this->dbh); in mijn connect functie geeft;

esource(12) of type (mysql link) resource(12) of type (mysql link) resource(12) of type (mysql link) resource(12) of type (mysql link) resource(12) of type (mysql link)

De complete database functie ter verduidelijking misschien;

PHP:
<?php
class database {
    protected $dbh;
    protected $query;
    public $last_id;
    public $error;
    private $debug = false;
    private $username = '';
    private $password = '';
    private $database = '';
    private $hostname = '';
    private $pre      = "";
    private $affectedRows;

    function  __construct($server, $user, $pass, $database, $pre='') {
        $this->hostname = $server;
        $this->username = $user;
        $this->password = $pass;
        $this->database = $database;
        $this->pre = $pre;
    }

    public function debugmode($status) {
        $this->debug = $status;
    }

    private function connect() {
        $this->dbh = mysql_connect($this->hostname,$this->username,$this->password);
        
        if(($this->dbh)) {
            mysql_select_db($this->database) or die(mysql_error());
        }
        var_dump($this->dbh);
    }

    private function close() {
        mysql_close($this->dbh);
    }

    private function query($sql) {
        if($this->query = mysql_query($sql, $this->dbh)) {
            $this->affectedRows = mysql_affected_rows($this->dbh);
            $this->last_id = mysql_insert_id();
            $this->throwError();
            return $this->query;
        }
        else {
            return false;
        }
    }

    public function fetch() {
        return mysql_fetch_assoc($this->query);
    }

    public function doQuery($sql) {
        $this->connect();
        if($test = $this->query($sql)) {
            return $sql;
        }
        else {
            false;
        }
        $this->close();
    }

    // Gebruik hiervan voornamelijk binnen safelogin
    public function secure($value) {
        if(!ctype_digit($value)) {
            $this->connect();
            return mysql_real_escape_string($value);
            $this->close();
        }
        else {
            return $value;
        }
    }

    public function last_id() {
        $this->connect();
        return mysql_insert_id();
        $this->close();
    }

    public function numRows() {
        $this->connect();
        return mysql_num_rows($this->query);
        $this->close();
    }

    public function fetchRow() {
        return mysql_fetch_row($this->query);
    }

    public function affectedRows() {
        return $this->affectedRows;
    }

    private function escape($string) {
        if(get_magic_quotes_runtime()) {
            $string = stripslashes($string);
        }
        return @mysql_real_escape_string($string);
    }

    public function insertQuery($table, $data) {
        $q="INSERT INTO `".$this->pre.$table."` ";
        $v='';
        $n='';
        foreach($data as $key=>$val) {
            $n.="`$key`, ";
            if(strtolower($val)=='null') $v.="NULL, ";
            elseif(strtolower($val)=='now()') $v.="NOW(), ";
            else $v.= "'".$this->escape($val)."', ";
        }
        $q .= "(". rtrim($n, ', ') .") VALUES (". rtrim($v, ', ') .");";
        return $this->doQuery($q);
    }

    public function updateQuery($val, $table, $con) {
        if(is_array($con)) {
            $where = "where ";
            $lastitem = end($con);
            foreach ($con AS $key => $value) {
                $where .= $key."='".$value."' ";
                $where .= ($value != $lastitem) ? ('&& ') : (NULL);
            }
        }
        else {
            $where = "";
        }
        $query = 'update ' . $table . ' set ';
        $lastvalue = end($val);
        foreach ($val as $key => $value) {
            $query .= $key . "='" . $value . "'";
            $query .= ($value != $lastvalue) ? (', ') : (' ');
        }
        $query = $query . $where;
        return $this->doQuery($query);
    }

    private function throwError() {
        if(mysql_error()) {
            $this->error = mysql_error();
            if ($this->debug) {
                echo $this->error;
            }
        }
    }
} ?>
 
Ik zie zo niks vreemds... weet je zeker dat ie niet moeilijk doet over een andere aanroep naar deze class? Heb je het in een test script geprobeerd?
 
Hmmz, me is nu verteld geworden dat deze code zo lek als een mandje is. Is er misschien een database klasse ergens die alles al voor me doet, zonder compleet framework (dus echt alleen de klasse zelf)?
 
Wat moet een databaseklasse doen?
 
Zelf ben ik ook bezig geweest met Classes in PHP en merkte ik dat de "__constructor" niet altijd zo goed werkt.

Hiervoor kan je ook gebruik maken van de classe naam als functie naam. Deze wordt dan gebruikt als constructor. Althans bij mij.

Een voorbeeld:
PHP:
class database
{
...
  // Constructor van de class database i.p.v. __constructor
  function database($server, $user, $pass, $database, $pre='')
  {
     ...
  }
...
}

Hoop dat dit helpt
groeten vreugde
 
Zelf ben ik ook bezig geweest met Classes in PHP en merkte ik dat de "__constructor" niet altijd zo goed werkt.

Hiervoor kan je ook gebruik maken van de classe naam als functie naam. Deze wordt dan gebruikt als constructor. Althans bij mij.

Een voorbeeld:
PHP:
class database
{
...
  // Constructor van de class database i.p.v. __constructor
  function database($server, $user, $pass, $database, $pre='')
  {
     ...
  }
...
}

Hoop dat dit helpt
groeten vreugde


Misschien omdat de functie __construct() heet? 'Niet altijd even goed werken' is natuurlijk onzin, de __construct() werkt per definitie altijd. Jouw methode komt voort uit PHP4 en is dus verouderd.
 
Ik zei ook niet dat mijn optie perfect is, en dat dat de ultieme oplossing is. Ik zeg alleen dat die manier bij mij niet altijd gewerkt heeft. En misschien is dat vanwege de PHP versie of gewoon omdat ik het verkeerd implementeerde

Ik wist niet dat jij mijn mening/ervaring direct zou samen brengen met de term "onzin".
 
Zelf doe ik idd ook liever __constuct, en PHP versie is 5.3.0 dus daar kom ik niet mee in de knoei.

Wat de klasse moet doen? Simpel, je kan wachtwoord, user, server, databasetabel en event. prefix meesturen naar de construct, insert queries opvragen a.d.h. data, update queries, errors goed outputten en natuurlijk veilig :P vrij standaard allemaal denk ik. Heb wel iets gevonden en dat is de volgende;

http://www.ricocheting.com/static/code/php/mysql-v3/Database.singleton.phps

Zelf zie ik niet helemaal in wat veilig is en wat weer niet, aangezien de ene me verteld dit is wel veilig en de andere zegt van zo lek als een mandje. Nou zal dit misschien altijd 'relatief' blijven, maar ik denk dat bijv. een framework (Zend, CodeIgnitor) toch wel gebruikt maakt van goede en veilige databaseklasses (maar ik nou even niet vast wil zitten aan een framework wil ik geen framework gaan gebruiken).

Hoop dat het een beetje duidelijk is :)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan