php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
  #1 (permalink)  
Alt 06-09-2007, 00:27
hiro
 Newbie
Links : Onlinestatus : hiro ist offline
Registriert seit: Aug 2007
Beiträge: 27
hiro ist zur Zeit noch ein unbeschriebenes Blatt
Standard MySQL-Klasse kritisieren

Hallo,
ich schreibe zurzeit in PHP5 eine MySQL-Klasse, hab mir dafür Kopffs's Tutorial etwas durchgelesen und daraus schnellsten versucht eine eigene Klasse zu schreiben.

Es ist noch nicht ganz fertig, aber wollt ma bisschen Kritik hören.

Die Klasse "DatabaseException" ist noch in bearbeitung.

Database.class.php:

PHP-Code:
<?php class Database {

    protected 
$linkID;
    protected 
$queryID;
    protected 
$charset;
    
    protected 
$host;
    protected 
$user;
    protected 
$password;
    protected 
$database;
    
    protected 
$autoSelect;
    
     public function 
__construct($host$user$password$database$charset 'utf8'$autoSelect true) {
    
$this->host         $host;
    
$this->user         $user;
    
$this->password     $password;
    
$this->database     $database;
    
$this->charset      $charset;
    
$this->autoSelect   $autoSelect;
    
    
//connect
    
$this->connect();
    
    
//Select Database 
    //createDatabase ist currently not avaiable!
    
if($autoSelect === true) {
      
$this->selectDatabase();
    } else {
      
$this->createDatabase();
      
$this->selectDatabase();
    }
    
     }
     
    
/**
     * Execute MySQL Connection!
     */
     
public function __destruct () {
    if (
is_resource ($this -> linkID)) {
      
mysql_close ($this -> linkID);
     }
     
  }
}
?>
MySQLDatabase.class.php

PHP-Code:
<?php
 
class MySQLDatabase extends Database {

    
/**
     * Connects to MySQL Server
     */
    
protected function connect() {
    
    
$this->linkID mysql_connect($this->host$this->user$this->password);
    
    if(
$this->linkID === false) {
      
#throw new DatabaseException('Link-ID == false, connect failed', $this);
      
echo "connect failed".$this->linkID;
    } else {
      echo 
"OK";
    }
    }
    
    
/**
     * Select MySQL-Database
     */
    
protected function selectDatabase() {
        if (@
mysql_select_db($this->database$this->linkID) === false) {
            
#throw new DatabaseException("Cannot use database ".$this->database, $this);
      
echo "Cannot use database ".$this->database;
        }
    }


 } 
?>
test.php
PHP-Code:
<?php

    define
('DIR'dirname(__FILE__).'/');
    
    function 
__autoload($class) {
      require_once(
DIR.'/lib/'.$class.'.class.php');
    }

    
$db = new MySQLDatabase ('localhost','root','pwd','test');
   
?>
Welche Funktionen könnte ich noch hinzufügen?! Bzw. besser machen?!

Geändert von hiro (06-09-2007 um 00:33 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 06-09-2007, 08:34
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Naja, Methoden hat deine Klasse ja noch nichts! Da kann man nicht wirklich etwas zu sagen!
Mit Zitat antworten
  #3 (permalink)  
Alt 06-09-2007, 12:40
hiro
 Newbie
Links : Onlinestatus : hiro ist offline
Registriert seit: Aug 2007
Beiträge: 27
hiro ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Die Methoden schreibe ich erst heut Abend wenn ich wieder zaus bin.

Also ich hab bis jetzt immer nur mysql_fetch_array benützt die anderen funktionen hab ich bis dato nicht gebraucht bzw. hab nicht verstanden was die genau machen. *doof*
Mit Zitat antworten
  #4 (permalink)  
Alt 06-09-2007, 12:55
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Den Ansatz der Fehlerbehandlung durch Exception finde ich gut, typisch für OOP.
Die Query-Methode würde ich einfügen ^^
Du solltest dir überlegen, wie du mit Ergebnissen von Select-Statements umgehst. Etwas in der Richtung mysql_fetch_assoc(), also ein Array je Datensatz, oder du überlegst dir etwas mit einem ResultSet-Objekt.
Wichtige Funktionen sind auch:
Anzahl Zeilen (mysql_num_rows())
Anzahl veränderter Zeilen bei Delete etc. (mysql_affected_rows())
Letzter erzeugter auto_increment (mysql_last_insert_id())

Die Oberklasse Database solltest du als abstract deklarieren!

Nicht hineinnehmen in die Mysql-Klasse würde ich solche Funktionen wie mysql_list_tables. Du gehst schon den Weg über eine Oberklasse, da würde ich solch datenbankspezifische Abfragen nicht mit in die Connector-Klasse packen. Wenn du diese Methoden benötigst, würde ich eher eine separate Klasse MysqlInfo oder so anlegen.

PHP-Code:
  if($autoSelect === true) {
      
$this->selectDatabase();
    } else {
      
$this->createDatabase();
      
$this->selectDatabase();
    } 
Das finde ich überflüssig. Das Anlegen einer Datenbank sollte unabhängig von deiner Klasse geschehen!
Mit Zitat antworten
  #5 (permalink)  
Alt 06-09-2007, 13:25
hiro
 Newbie
Links : Onlinestatus : hiro ist offline
Registriert seit: Aug 2007
Beiträge: 27
hiro ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo,
also ich werd mir die einzelen Funktionen anschauen, weil ich bis dato nicht check was das Manual z.b mit "mysql_num_rows — Liefert die Anzahl der Datensätze im Ergebnis" meint. WTF?!^^

Einige Methoden habe ich schom im Kopf die ich rein packen werden, und due Exception-Klasse werde ich so schreiben das die Fehler auf einer schönen Seite angezeigt werden.

Was sind die Vorteile von einer abstrakten Klasse? Bzw. wozu dient das genau?!

Das mit $autoSelect war eigentlich für ein Script gedacht den ich basteln wollte...aber werd ich wohl raushauen müssen.

Ist mein Code bis jetzt gut leserlich?
Ist mein Code bis jetzt halbwegs sicher? (Sichtbarkeit der Variablen, Funktionen richtig gesetzt?)

Entschuldigt mich wenn ich ein paar Begriffe falsch verwende, bin aber relativ neu was PHP&MySQL angeht.

mfg
hiRo
Mit Zitat antworten
  #6 (permalink)  
Alt 06-09-2007, 13:31
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von hiro
also ich werd mir die einzelen Funktionen anschauen, weil ich bis dato nicht check was das Manual z.b mit "mysql_num_rows — Liefert die Anzahl der Datensätze im Ergebnis" meint. WTF?!^^
Vielleicht solltest du erstmal generell mit Datenbanken umzugehen wissen, bevor du wild drauf los eine Klasse codest oo

Zitat:
Was sind die Vorteile von einer abstrakten Klasse? Bzw. wozu dient das genau?!
http://de.wikipedia.org/wiki/Abstrakte_Klasse

Zitat:
Ist mein Code bis jetzt gut leserlich?
Ist mein Code bis jetzt halbwegs sicher? (Sichtbarkeit der Variablen, Funktionen richtig gesetzt?)
Ähm... bei 70 Code-Zeilen erübrigt sich die Frage fast ^^;
Da ist ja kaum was, was man bewerten könnte
Mit Zitat antworten
  #7 (permalink)  
Alt 06-09-2007, 22:50
BugBite
 Member
Links : Onlinestatus : BugBite ist offline
Registriert seit: May 2006
Beiträge: 299
BugBite ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Vielleicht solltest du auch erstmal ein UML Anlegen, wenn du so ein Monsterprojekt wie ne Database klasse anfängst...
Andererseits versteh ich nich ganz den Sinn dahinter - welchen zweck
soll die Klasse denn im produktiven Einsatz verfolgen?
Viel interessanter
fänd ich jetz ne ordentliche Klasse zur Datenabstraktion, in die man
Queries absetzen kann ohne auf SQL zugreifen zu müssen

Oder ich raff das jetz einfach nich - dann helf mir auf die Sprünge

@edit Warum hat deine Klasse Database ein Attribut Database??

Geändert von BugBite (06-09-2007 um 22:52 Uhr)
Mit Zitat antworten
  #8 (permalink)  
Alt 07-09-2007, 09:45
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Vielleicht solltest du auch erstmal ein UML Anlegen, wenn du so ein Monsterprojekt wie ne Database klasse anfängst...
Jetzt mal ehrlich, eine DB-Klasse ist schon eher einer der Grundsteine eines Projektes!

Zitat:
Andererseits versteh ich nich ganz den Sinn dahinter - welchen zweck soll die Klasse denn im produktiven Einsatz verfolgen?
Das loswerden der mysql_*-Funktionen und ein OOP-Ansatz! Stell dir vor, du willst irgendwann, warum auch immer, auf andere Datenbankfunktionen umsteigen. Dann viel Spaß beim Umschreiben deines Projektes. So tauscht du einfach die Klasse aus. Aber was erzähle ich da, er macht halt OOP!

Zitat:
Viel interessanter fänd ich jetz ne ordentliche Klasse zur Datenabstraktion, in die man Queries absetzen kann ohne auf SQL zugreifen zu müssen
Fände ich auch interessant, scheint mir aber wohl eher unmöglich, den kompletten SQL-Umfang mit allen Joins etc durch Methoden zu umfassen.
Mit Zitat antworten
  #9 (permalink)  
Alt 07-09-2007, 10:07
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von PHP-Desaster
Das loswerden der mysql_*-Funktionen und ein OOP-Ansatz! Stell dir vor, du willst irgendwann, warum auch immer, auf andere Datenbankfunktionen umsteigen. Dann viel Spaß beim Umschreiben deines Projektes. So tauscht du einfach die Klasse aus. Aber was erzähle ich da, er macht halt OOP!
Nachdem aber praktisch kaum ein Projekt ohne Anpassung der SQL-Queries auch mit einem anderen DBMS nutzbar ist, verliert das ganze dadurch doch enorm an Abstraktion...


Zitat:
Fände ich auch interessant, scheint mir aber wohl eher unmöglich, den kompletten SQL-Umfang mit allen Joins etc durch Methoden zu umfassen.
Methoden, die OOP-Gebilde der Daten zurück geben - fertig.
Ob die Daten dann aus der Datenbank per SQL-Query kommen, oder aus einer Datei ausgelesen werden, oder das ganze ein
PHP-Code:
$return = array();
for (
$i 0$i <= 10; ++$i) {
  
$return[] = new object($i);
}
return 
$return 
ist, ist dann für die darüber liegende Applikation vollkommen irrelevant~
Mit Zitat antworten
  #10 (permalink)  
Alt 07-09-2007, 11:01
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Eine Abfrage wie
Code:
select x, y from irgendwas where x=123
ist ja kein Ding.
Ich meinte eher, wie setzt du eine query ala
Code:
select a.*, b.*, c.datefield
from irgendwas a
inner join (select max(id) as max from bla) as b
 on( a.x=b.max )
left join nocheine as c
 on( a.y=c.id and a.datefield<( c.datefield + interval 3 hour ) )
where a.sowieso='bla'
order by c.sort desc
vernünftig auf Methoden um?

Die Query ist natürlich jetzt komplett aus der Luft gegriffen, aber nur mal als Beispiel.
Mit Zitat antworten
  #11 (permalink)  
Alt 07-09-2007, 11:26
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

PHP-Code:
<?php

interface ein_ding {
    public function 
Zeugs_holen_der_next_drei_stunden();
}

class 
das_ding implements ein_ding {
    public function 
Zeugs_holen_der_next_drei_stunden() {
        
$db die_db::get_instance();
        
        
$result $db->query("select a.id, b.title, c.datefield
            from irgendwas a
            inner join (select max(id) as max from bla) as b
             on( a.x=b.max )
            left join nocheine as c
             on( a.y=c.id and a.datefield<( c.datefield + interval 3 hour ) )
            where a.sowieso='bla'
            order by c.sort desc"
);
        
$return = array();
        while (
$row $result->fetch_assoc()) {
            
$return[] = $row;
        }
    }
}

class 
ein_anderes_ding implements ein_ding {
    public function 
Zeugs_holen_der_next_drei_stunden() {
        
$return = array(
            array(
'id' => 1'title' => "test"'datefield' => "2007-09-07 11:17:00"),
            array(
'id' => 2'title' => "blubb"'datefield' => "2007-09-07 11:18:00"),
        );
        
        return 
$return;
    }
}

$ding = new ein_anderes_ding();
var_dump($ding->Zeugs_holen_der_next_drei_stunden());
Mit Zitat antworten
  #12 (permalink)  
Alt 07-09-2007, 12:43
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Ja lol! Sowas habe ich natürlich nicht gemeint!
Ich dachte da eher, und so habe ich BugBite auch verstanden, an Methoden wie beispielsweise:
PHP-Code:
class DB {
  public function 
select$fields$table$where /*, ...*/ ) {
    
// ...
  
}
  public function 
insert$data$table ) {
    
// ...
  
}

Allerdings wäre dann halt die Frage, wie du ein solch komplexes Query vernünftig auf Methoden etc. abbilden willst, um halt kein SQL nutzen zu müssen!
Mit Zitat antworten
  #13 (permalink)  
Alt 07-09-2007, 12:50
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von PHP-Desaster
Ja lol! Sowas habe ich natürlich nicht gemeint!
Ich dachte da eher, und so habe ich BugBite auch verstanden, an Methoden wie beispielsweise:
Wozu wurde denn SQL erfunden? Damit ich das alles noch mit Funktionen abbilde? Oo
Mit Zitat antworten
  #14 (permalink)  
Alt 07-09-2007, 13:32
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Richtig, im Grunde ist es Käse! ^^
Mit Zitat antworten
  #15 (permalink)  
Alt 07-09-2007, 14:04
BugBite
 Member
Links : Onlinestatus : BugBite ist offline
Registriert seit: May 2006
Beiträge: 299
BugBite ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Dass er OOP macht is mir klar, aber da finde ich die modellierung irgendwie komisch...
ich finds auch schöner wenn man daten kapselt und nicht unbedingt
die queries mit mysql_ absetzt
aber alleine schon dass die klasse database das attribut database hat bringt mich total aus dem konzept

anstatt database würde ich ehersowas wie ein dataset modellieren, welches man mittels eines adapters füllen kann

mir erscheint es einfach nich logisch, dass eine datenbank auf eine datenbank connected...
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

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