TalkPHP

TalkPHP (http://www.talkphp.com/forums.php)
-   Advanced PHP Programming (http://www.talkphp.com/advanced-php-programming/)
-   -   Classes and MySQLi (http://www.talkphp.com/advanced-php-programming/4068-classes-mysqli.html)

Andrial12 03-23-2009 01:13 PM

Classes and MySQLi
 
I think its me missing a one of the major crux's of Object Orientated programming, but I've been looking for an answer to this problem for years now, and I've never been able to get a clear cut answer.

Here's a class that i've written:

PHP Code:

class model_element {
    
    var 
$id         0;
    var 
$name         NULL;
    var 
$xml         NULL;
    var 
$date         NULL;
    var 
$type         NULL;
    var 
$priority    0;

    function 
__construct($elements_id) {
    
        if(!empty(
$elements_id)) {
            
$object_database = new mysqli(CONFIG_DATABASE_SERVERCONFIG_DATABASE_USERCONFIG_DATABASE_PASSCONFIG_DATABASE_NAME_DEFAULT);
            
            
$object_result $object_database->query("
                SELECT
                    le.`elements_id`,
                    le.`elements_name`,
                    le.`elements_xml`,
                    le.`elements_date`,
                    le.`elements_type`,
                    le.`elements_priority`
                FROM
                    `lib_elements` AS le
                WHERE
                    le.`elements_id` = " 
$elements_id "
                ;
            "
);
            
            
$object_row $object_result->fetch_object();
            
            
$this->id             $object_row->elements_id;
            
$this->name         $object_row->elements_name;
            
$this->xml            $object_row->elements_xml;
            
$this->date         $object_row->elements_date;
            
$this->type         $object_row->elements_type;
            
$this->priority     $object_row->elements_priority;
        }
        
    }
    


Now this class will need to be called a few (5 - 20) times of the course of loading one page.

Now everytime this class is initiated the database connection is restarted.
PHP Code:

$object_database = new mysqli(CONFIG_DATABASE_SERVERCONFIG_DATABASE_USERCONFIG_DATABASE_PASSCONFIG_DATABASE_NAME_DEFAULT); 

Which i'm sure in not the best way to got about things.

So what am i missing about using a database in an Object Orientated fashion should model_element extend mysqli? Or is that wrong aswell.

Thanks for any help in advance.

Oli.

Andrial12 03-23-2009 03:48 PM

It was actually pretty easy once I really thought about it. What i needed to do was call initiate MySQLi via a child class which uses the singleton pattern.

Somebody will Probably find this quite useful.

database.php
PHP Code:

class database extends mysqli 
    
    private static 
$instance null
    
    private function 
__construct($database_server$database_user$database_pass$database_name) { 
        @
parent::__construct
            
$database_server
            
$database_user
            
$database_pass
            
$database_name
        
); 
        if(
mysqli_connect_errno()) { 
            die(
'Could not Connect to database');
        } 
    } 
        
    public function 
getInstance($database_server$database_user$database_pass$database_name) { 
        if(
self::$instance === null) { 
            
$c __CLASS__
            
self::$instance = new $c($database_server$database_user$database_pass$database_name); 
        } 
        return 
self::$instance
    } 
    
    public function 
__clone() {
        die(
"Cannot clone ".__CLASS__." class"); 
    } 



model_element.php
PHP Code:

class mdl_element {
        
    var 
$id         0;
    var 
$name         NULL;
    var 
$xml         NULL;
    var 
$date         NULL;
    var 
$type         NULL;
    var 
$priority    0;

    function 
__construct($elements_id) {
    
        if(!empty(
$elements_id)) {
                
            
$object_result database::getInstance(CONFIG_DATABASE_SERVERCONFIG_DATABASE_USERCONFIG_DATABASE_PASSCONFIG_DATABASE_NAME_DEFAULT)->query("
                SELECT
                    le.`elements_id`,
                    le.`elements_name`,
                    le.`elements_xml`,
                    le.`elements_date`,
                    le.`elements_type`,
                    le.`elements_priority`
                FROM
                    `lib_elements` AS le
                WHERE
                    le.`elements_id` = " 
$elements_id "
                ;
            "
);
                
            
$object_row $object_result->fetch_object();
                
            
$this->id             $object_row->elements_id;
            
$this->name         $object_row->elements_name;
            
$this->xml            $object_row->elements_xml;
            
$this->date         $object_row->elements_date;
            
$this->type         $object_row->elements_type;
            
$this->priority     $object_row->elements_priority;
        }
        
    }
        


controller_element.php
PHP Code:

class ctl_element {

    var $element = array();
        
    function __construct($elements_id) {
        $this->element[] = new mdl_element($elements_id);
    }
        
    function display($xslt) {
        $xml =  "";
        $xml_temp = '<element language="en-GB"><id>0</id>' . $this->element[0]->xml;
        $xml_temp .= '<children>';
        for($i=0;$i<count($this->element[0]->children->children);$i++) {
            
            $xml_temp .= "<child>";
            $xml_temp .= $this->element[0]->children->children[$i]['xml'];
            $xml_temp .= "</child>";
            
        }
        $xml_temp .= '</children>';
        $xml_temp .= '</element>';
        $xml = '<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE exams SYSTEM "*DEAD LINK*"><exams>' . $xml_temp . '</exams>';
        
        return vw_createhtml($xml, $xslt);
    }
    
}



All times are GMT. The time now is 03:56 AM.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.1.0