Avatar billede androidfan Nybegynder
28. februar 2012 - 22:57 Der er 2 kommentarer

PDO class problemer

Hej gutter ^__^


Jeg har siddet og leget lidt med noget PHP i nogle dage.

Målet var at skrive 2 classer til at starte med.

db.php
------
Skal indeholde selve connect delen

db_query.php
------------
skal indeholde query delen


Ved ikke engang om dette er den bedste måde at gøre det på, så hvis der er kommentare til forbedringer, så slå dig endelig løs.


Her er min kode:

db.php filen
----------------------------------------
----------------------------------------

class db {
   
    // host, username, password, database name variables
    private $db_host;
    private $db_username;
    private $db_password;
    private $db_database_name;
   
    // the connection variabel
    private $dbh;


    // constructor
    public function __construct($host, $user, $pass, $db_name) {
        // provide the connection data to the variables
        $this->db_host = $host;
        $this->db_username = $user;
        $this->db_password = $pass;
        $this->db_database_name = $db_name;
       
        // call the connection function
        $this->PDO_Connect();
       
        // return the connection
        return $this->dbh;
    }

    // destructor
    public function __destruct() {
        // close the connection
        $this->dbh = NULL;
    }

    // the connect function
    public function PDO_Connect() {
        try {
            // create the PDO object
            $this->dbh = new PDO("mysql:host=$this->db_host;dbname=$this->db_database_name", $this->db_username, $this->db_password);

            // set the error reporting attribute
            $this->dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); 

        } catch(PDOException $e) {
            // logs the error if there is one
            $this->PDO_log_error($e);
        }
    }
   
    // returns this functions to other classes
    public function PDO_query($sql) {
        return $this->dbh->query($sql);
    }

    // returns this functions to other classes
    public function PDO_prepare($sql) {
        return $this->dbh->prepare($sql);
    }       

    // en xtra close functions.  use it if needed.
    private function PDO_Close() {
        // close the connection
        $this->dbh = NULL;       
    }

    // error functions, logs errors in a standard txt file.
    private function PDO_log_error($e) {
        // change time zone to denmark   
        date_default_timezone_set('Europe/Copenhagen');
        // log the error
        file_put_contents('error_logs/PDOErrors.txt', "Connection error ### ".date("j-F-Y G:i:s"). " : ".$e->getMessage()."\r\n", FILE_APPEND);
    }
   
}


db_query.php filen
----------------------------------
----------------------------------

class db_query {

    // the connection variabel
    private static $dbh;
   
    // constructor
    public function __construct($connection) {
        $this->dbh = $connection;
    }

    // destructor
    public function __destruct() {

    }

    public function query($sql, array $variables = array()) {
        try {

            $statement = $this->dbh->PDO_prepare($sql);
           
            $statement->execute($variables);
           
            $data = $statement->fetchAll(PDO::FETCH_ASSOC);
           
            return $data;
       
        } catch(PDOException $e) {
            // logs the error if there is one
            $this->PDO_log_error($e);
        }
       
    }

    // error functions, logs errors in a standard txt file.
    private function PDO_log_error($e) {
        // change time zone to denmark   
        date_default_timezone_set('Europe/Copenhagen');
        // log the error
        file_put_contents('error_logs/PDOErrors.txt', "Query error ### ".date("j-F-Y G:i:s"). " : ".$e->getMessage()."\r\n", FILE_APPEND);
    }

}






Tests:
-----------

include("db.php");

$pdo = new db("localhost", "root", "", "contacts");
$query = new db_query($pdo);

$result = $query->query("SELECT * FROM persons WHERE id=?", array(1));
foreach($result as $row) {
    echo $row["fname"]. "<br />";
}




Ok, så det virker også.  ^__^

Men der er nogle ting som jeg er lidt forvirret over.  Det tog mig meget lang tid at finde af at jeg skulle oprette den funtion som jeg ville benytte i db.php.  F.eks.


$statement = $this->dbh->PDO_prepare($sql);

Denne PDO_prepare() er i db.php, og jeg gør helt sikkert noget forkert her.

Jeg prøvede på at instansere min db_query class og benytte allerede forbindelse fra db.php.


Giver det mening?
Gør jeg noget galt?
Er der nogle forslag til, idéer eller forbedringer?

har læst rigtigt meget og er med på at ændre hvad som helst.


tak alle sammen

^__^
Avatar billede olebole Juniormester
28. februar 2012 - 23:05 #1
<ole>

Er det ikke bøvlet og unødvendigt at lave to klasser?

/mvh
</bole>
Avatar billede androidfan Nybegynder
28. februar 2012 - 23:15 #2
^__^

Tænkte jeg nok at det var.  Men vil det sige at man normalt smider begge i 1 class?

Hvad siger du til min metode, er den helt ude i hampen?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester