php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2006

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 25.07.2006, 20:00  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Der Name DatabaseConnector ist von mir gewählt.
Es soll eine Klasse darstellen, die über eine Fabrikmethode eine den Parametern entsprechendes Objekt erzeugt.

PHP-Code:
<?php
////////////////////////////////////////////////////////////////////////////////////////////////////
require_once S_INCLUDE 'functions/parseDSN.php';
////////////////////////////////////////////////////////////////////////////////////////////////////
define('DATABASECONNECTOR_FETCHTYPE_ASSOC',  1);
define('DATABASECONNECTOR_FETCHTYPE_ARRAY',  2);
define('DATABASECONNECTOR_FETCHTYPE_OBJECT'3);
////////////////////////////////////////////////////////////////////////////////////////////////////
class DatabaseConnector
{
    protected 
$hostname;
    protected 
$username;
    protected 
$password;
    protected 
$connected false;
    
    protected 
$database;
    protected 
$selected false;
    
    protected 
$fetchType DATABASECONNECTOR_FETCHTYPE_OBJECT;
    
    protected 
$queries = array();
    
    
    public static function 
factory($dsn)
    {
        
$config parseDSN($dsn);
        switch (
$config['phptype']) {
        case 
'mysql':
            require_once 
sprintf('%s/DatabaseConnector_MySQL.php'dirname(__FILE__));
            
$db = new DatabaseConnector_MySQL();
            
$db->connect($config['hostspec'], $config['username'], $config['password']);
            
$db->selectDB($config['database']);
            return 
$db;
        default:
        }
        
        return 
false
    }
    
    public function 
isConnected()
    {
        return (bool)
$this->connected;
    }
    
    public function 
debug()
    {
        echo 
"\n\nDatabase Debug: <pre>"print_r($thistrue), "</pre>\n\n";
    }   
    
    public function 
__destruct()
    {
        
$this->close();
    }
}
////////////////////////////////////////////////////////////////////////////////////////////////////
?>
(parseDSN() ist übrigens von PEAR_DB kopiert, ich hoffe das ist erlaubt)

Momentan macht sie wenig Sinn, da es nur eine Möglichkeit gibt: MySQL.
Theoretisch könnten hier aber auch andere Datenbanken angesprochen werden, PostgreSQL, DB2 und was es noch so alles gibt.

DatabaseConnector_MySQL() kann nichts, außer die mysql_*() Funktionen zur Verfügung stellen und die Queries loggen. Aber das ist ja schonmal etwas, zum Debuggen zB ganz hilfreich.

Ob du das ganze so übernehmen möchtest musst du entscheiden. Mit nur einer Datenbank-Klasse MySQL bringt es zunächst keinen Vorteil, wäre aber erweiterbar. Die Vorteile müssen aber verstanden sein, sonst macht es wenig Sinn.

Meine DatabaseConnector_MySQL.php sieht dann so aus:
PHP-Code:
<?php
////////////////////////////////////////////////////////////////////////////////////////////////////
require_once sprintf('%s/DatabaseConnector.php'dirname(__FILE__));
////////////////////////////////////////////////////////////////////////////////////////////////////
class DatabaseConnector_MySQL extends DatabaseConnector
{
    public function 
connect($hostname$username$password)
    {
        
// set variables
        
$this->hostname $hostname;
        
$this->username $username;
        
$this->password $password;
        
        
// connect..
        
$this->connected = @mysql_connect($this->hostname$this->username$this->password);
        
        
// log & error
        // ..
        
        // return
        
return $this->connected;
    }
    
    public function 
selectDB($database)
    {
        
// set variable
        
$this->database $database;
        
        
// select database
        
$this->selected = @mysql_select_db($this->database);
        
        
// log & error
        // ..
        
        // return
        
return $this->selected;
    }
    
    public function 
query($sql)
    {
        
// validate arguments
        
if (func_num_args() > 1) {
            
$args func_get_args();
            
array_shift($args);
            
$sql vsprintf($sqlarray_map(array($this'escape'), $args));
        }
        
        
// do your job
        
$res = @mysql_query($sql$this->connected);
        
        
// log & error
        
$this->queries[] = $sql;
        
        
// return
        
return $res;
    }
    
    public function 
fetch($res$type null)
    {
        
// validate type
        
if (!isset($type) || !$this->isFetchType($type))
            
$type $this->fetchType;
            
        
// log & error
        // ..
        
        // do your job
        
$row false;
        switch (
$type) {
        case 
DATABASEMANAGER_FETCHTYPE_ASSOC:
            
$row $this->fetchAssoc($res);
            break;
        case 
DATABASEMANAGER_FETCHTYPE_ARRAY:
            
$row $this->fetchArray($res);
            break;
        case 
DATABASEMANAGER_FETCHTYPE_OBJECT:
            
$row $this->fetchObject($res);
            break;
        }
        
        
// return
        
return $row;           
    }
    
    public function 
fetchAssoc($res)
    {
        
// do your job
        
$row = @mysql_fetch_assoc($res);
        
        
// log & error
        // ..
        
        // return
        
return $row;
    }
    
    public function 
fetchArray($res)
    {
        
// do your job
        
$row = @mysql_fetch_array($res);
        
        
// log & error
        // ..
        
        // return
        
return $row;
    }
    
    public function 
fetchObject($res)
    {
        
// do your job
        
$row = @mysql_fetch_object($res);
        
        
// log & error
        // ..
        
        // return
        
return $row;
    }
    
    public function 
close()
    {
        
// do your job
        
if (@mysql_close($this->connected))
            
$this->connected false;
        
        
// log & error
        // ..
        
        // return
        
return $this->connected;
    }
    
    private function 
escape($string)
    {
        if (!
get_magic_quotes_gpc())
            
$input mysql_real_escape_string($string);
        
        return 
$string;
    }
    
    private function 
isFetchType($type)
    {
        switch (
$type) {
        case 
DATABASEMANAGER_FETCHTYPE_ASSOC:
        case 
DATABASEMANAGER_FETCHTYPE_ARRAY:
        case 
DATABASEMANAGER_FETCHTYPE_OBJECT:
            return 
true;
        }
        
        return 
false;
    }     
}
////////////////////////////////////////////////////////////////////////////////////////////////////
?>
Wie du siehst existiert hier auch nichteinmal log & error. Ich wollte schnell vorankommen und an einem anderen Problem arbeiten.


Zu deiner 2. Frage: Was ist eine Referenz:
PHP-Code:
<?php
function manipuliere1(&$x) { // beachte das &
  
$x++;
  print 
"manipuliere1: $x
\n"
;
}
function 
manipuliere2($x) {
  
$x++;
  print 
"manipuliere2: $x
\n"
;
}
$x 5;
print 
"vorher: $x
\n"
;
manipuliere1($x); // Ausgabe 6, $x wurde "global" um 1 ($x++) erhöht
manipuliere2($x); // Ausgabe 7, $x wurde nur in der Funktion erhöht
print "nachher: $x"// Ausgabe 6, denn manipuliere2() hat nur mit einer Kopie hantiert
?>
http://de3.php.net/references
Zergling-new ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 28.07.2006, 22:55  
Erfahrener Benutzer
 
Registriert seit: 14.01.2006
Beiträge: 111
moose
Standard

Hab nur noch ne kleine ja-nein frage:
kann man objekte mit return in funktionen als rückgabewert zurückgeben?
(das übergeben geht, also müsste dass ja auch gehen)
__________________
http://www.martin-thoma.de
moose ist offline  
Alt 29.07.2006, 08:17  
Erfahrener Benutzer
 
Registriert seit: 13.11.2005
Beiträge: 2.583
xabbuh
Standard

Ja.
xabbuh ist offline  
Alt 29.07.2006, 16:18  
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von moose
kann man objekte mit return in funktionen als rückgabewert zurückgeben?
Man kann es zumindest schnell ausprobieren.
 
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Referenzen auf Objekte innerhalb eines Arrays PHP-Fortgeschrittene 6 31.08.2009 17:06
[Erledigt] objekte mit bilddaten serialisieren lumo PHP Tipps 2008 1 17.07.2008 12:25
[Erledigt] Objekte übergeben Felix PHP Tipps 2008 23 18.06.2008 12:21
Sortierbare Objekte Zergling-new PHP-Fortgeschrittene 5 27.11.2007 23:19
Objekte zur Laufzeit Vererbung anhängen Zergling-new PHP-Fortgeschrittene 8 17.11.2007 17:31
2 AJAX Objekte GSJLink HTML, Usability und Barrierefreiheit 6 15.08.2007 16:05
Rekursives durchlaufen meiner Objekte GELight PHP Tipps 2006 2 01.07.2006 23:21
Objekte sortieren Fatal Error PHP Tipps 2006 4 13.04.2006 14:24
[Erledigt] Objekte vergleichen PHP-Fortgeschrittene 4 08.12.2005 16:20
objekte und klassen notyyy PHP Tipps 2005-2 2 24.10.2005 17:44
Objekte PHP Tipps 2005-2 12 09.10.2005 18:20
[Erledigt] Verständnisfrage OOP - Objekte in MySQL Datenbank schreiben? PHP Tipps 2005 2 19.05.2005 21:40
Ganze Objekte an Script weitergeben dreamingof8a PHP Tipps 2004-2 6 23.11.2004 12:17
[Erledigt] Referenzen auf Objekte PHP-Fortgeschrittene 2 17.08.2004 11:08
Anonyme Objekte? PHP-Fortgeschrittene 18 25.07.2004 22:19


Alle Zeitangaben in WEZ +2. Es ist jetzt 18:13 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.