Portal > Foren > PHP > PHP-Programmierung > Problem mit meiner mysql class
Antwort
 
Themen-Optionen
Alt 12.09.2007, 18:41 Nach oben    #1
Neuer Benutzer
 
Registriert seit: 15.07.2007
Beiträge: 5
Standard Problem mit meiner mysql class

Hallo bin gerade etwas am verzweifeln ..
wieso klappt diese tolle klasse denn nicht also das verbinden an sich klappt schon nicht..


PHP-Code:
<?php
class DB_MySQL {
  var 
$connection NULL;
  var 
$result NULL;
 
   function 
connect($host$database$user$pass) {
    
$this->connection mysql_connect(
      
$host,
      
$user,
      
$pass,
      
TRUE
    
);
 
    
mysql_select_db($database$this->connection);
  }
 
   function 
disconnect() {
    if (
is_resource($this->connection)) {
      
mysql_close($this->connection);
    }
  }
 
   function 
query($query) {
    if (
is_resource($this->connection)) {
      if (
is_resource($this->result)) {
        
mysql_free_result($this->result);
      }
 
      
$this->result mysql_query(
        
$query,
        
$this->connection
      
);
    }
  }
 
   function 
fetchRow() {
    if (
is_resource($this->result)) {
      
$row mysql_fetch_assoc($this->result);
 
      if (
is_array($row)) {
        return 
$row;
      } else {
        return 
FALSE;
      }
    }
  }
}
?>
mit dem folgenden code versuche ich eine verbindung herzustellen...

PHP-Code:
require_once 'class.mysql.php';
 
$mysql = new DB_MySQL;
if(!
$mysql->connect('localhost''usr_web120_3''web120''pass'))
    {
        echo 
'Error: Mysql Verbindung konnte nicht aufgebaut werden. Überprüfen sie ihre angaben in der Datei: include/mysql.php<br>';
        exit;
    } 

Geändert von Stefan125 (12.09.2007 um 18:44 Uhr).
Stefan125 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.09.2007, 18:55 Nach oben    #2
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.642
Standard

deine Methode connect() liefert ja nichts zurück, dementsprechend ist deine IF-Abfrage immer false.

Vielleicht eher so?
PHP-Code:
error_reporting(E_ALL); // ganz wichtig um Fehler zu finden!
require_once 'class.mysql.php';
 
$mysql = new DB_MySQL(); // bitte die Klammern nicht vergessen :-)
$mysql->connect('localhost''usr_web120_3''web120''pass');
if(
mysql->connection == null) {
   echo 
'Error: Mysql Verbindung konnte nicht aufgebaut werden. Überprüfen sie ihre angaben in der Datei: include/mysql.php<br>';
   exit;

[/quote]
__________________
I did it my way - Senseless-Blog

Geändert von WarrenFaith (12.09.2007 um 19:00 Uhr).
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.09.2007, 20:24 Nach oben    #3
Gabriel
 
Registriert seit: 27.09.2006
Ort: Radebeul
Beiträge: 407
Standard

oder du überprüfst schon in der klasse und gibst dann true/false zurück!
__________________
kampfgnom ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.09.2007, 08:53 Nach oben    #4
Jann Hendrik Bekaan
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.213
Standard

Die von mir benutzte Klasse benötigt keinen expliziten connect-Aufruf.
Dies wird bei einem query der an die db geschickt werden soll asutomatisch nachgehohlt, sofern noch keine Verbindung vorhanden ist.
Dann wird versucht eine solche zu erstellen.
Wenn das nicht gelingt, dann gibt es einen entsprechenden Abbruch.

Der Vorteil, den ich darin sehe ist der, dass man nicht explizit connecten muss. Der Nachteil liegt darin, dass bei jedem query geprüft werden muss, ob die Verbindung noch/schon besteht.
Jann Hendrik ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.09.2007, 09:36 Nach oben    #5
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 826
Standard

Hi.

Warum übergibst du die Verbindungsdaten nicht einfach im Konstruktor und wirfst eine Exception, falls die Verbindung fehlschlägt. Eine Verbindung on-the-fly würde ich nicht umsetzen, da du die Exception dann bei jeder Abfrage erwarten musst. Eher würde ich das Objekt eben erst bei Bedarf bauen lassen.

Weiter macht es Sinn, ein Ergebnis-Objekt einer Anfrage zurückzugeben, anstatt eine Methode fetchRow() ohne Parameter anzubieten. Funktioniert natürlich, kann aber auch zu Konflikten führen und ist eben keine in sich wirklich stimmige API.

Methoden wie numRows() oder fetchRow() kannst dann in dieses Ergebnis-Objekt verschieben.

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.09.2007, 20:53 Nach oben    #6
Christian W. Achatz
 
Benutzerbild von dr.e.
 
Registriert seit: 05.02.2007
Ort: München
Beiträge: 132
Standard

Soetwas finde ich grundsätzlich kontraproduktiv, da sich die Anwendung um die Zugangsdaten zur Applikation kümmern muss und man Quellcode ändern muss um eine Applikation z.B. auf einer neuen Umgebung online bringen zu können. Da das variable Daten sind, sollten Verbindungsdaten in ein Config-File. Hier ist es ratsam, der MySQL-Klasse eine Möglichkeit zu geben, ihre Verbindungsdaten an Hand der aktuell eingesetzten Umgebung und der aktuellen Applikation einzulesen. Ich erwarte das so:

PHP-Code:
require_once 'class.mysql.php';
 
$mysql = new DB_MySQL();
$mysql->executeQuery('SELECT bla FROM blub WHERE name = 'hannes);

... 
Alles andere ist jedes Mal so viel Schreibarbeit, dass das eine Applikation / Modul zu sehr aufbläht. Denkt man in Abstraktions-Schichten, so ist alles andere auch Käse.
__________________
Grüße,
Dr.E.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Have a look at http://www.adventure-php-framework.org!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.09.2007, 11:13 Nach oben    #7
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 826
Standard

Zitat:
Zitat von dr.e. Beitrag anzeigen
Alles andere ist jedes Mal so viel Schreibarbeit, dass das eine Applikation / Modul zu sehr aufbläht. Denkt man in Abstraktions-Schichten, so ist alles andere auch Käse.

Kann ich nicht nachvollziehen. Zum einen macht es eine Klasse unabhängiger, wenn die Daten im Konstruktor übergeben werden und nicht aus einem Config-Singleton mit definierter API gezogen werden müssen und zum anderen hab ich z.B. meine MySQL-Klasse schon seit Monaten nicht mehr angefasst, oder irgendwo Verbindungsdaten übergeben, obwohl meine Anwendung natürlich auf mehreren Servern mit je mehreren Datenbanken läuft. Das steht also in keinem Widerspruch. Ich arbeite z.B. mit einer DAO-Factory, die einmal die Verbindung baut, sich dazu die Daten aus einem Config-Objekt zieht und diese Verbindung eben bei dem Bau jedes DAO diesem mitgibt.

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.09.2007, 19:46 Nach oben    #8
Christian W. Achatz
 
Benutzerbild von dr.e.
 
Registriert seit: 05.02.2007
Ort: München
Beiträge: 132
Standard

Zitat:
Ich arbeite z.B. mit einer DAO-Factory, die einmal die Verbindung baut, sich dazu die Daten aus einem Config-Objekt zieht und diese Verbindung eben bei dem Bau jedes DAO diesem mitgibt.
Und wo ist nun der Unterschied zu meiner Beschreibung (ausser natürlich die Begriffe Klasse vs. Factory)?
__________________
Grüße,
Dr.E.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Have a look at http://www.adventure-php-framework.org!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 19.09.2007, 23:17 Nach oben    #9
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 826
Standard

Zitat:
Zitat von dr.e. Beitrag anzeigen
Zitat:
Ich arbeite z.B. mit einer DAO-Factory, die einmal die Verbindung baut, sich dazu die Daten aus einem Config-Objekt zieht und diese Verbindung eben bei dem Bau jedes DAO diesem mitgibt.
Und wo ist nun der Unterschied zu meiner Beschreibung (ausser natürlich die Begriffe Klasse vs. Factory)?
Na eben darin, dass meine MySql-Klasse ganz leicht wiederverwendbar ist und diese engere Verwurzelung (Abhängigkeit von einem speziellen Config-Interface) erst die DAO-Factory trifft. Ich komm selten in die Verlegenheit, andere Datenbankanwendungen zu programmieren, als mein "Hauptprodukt", aber da finde ich es angenehm, die MySql-Klasse einfach benutzen zu können.

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.09.2007, 14:03 Nach oben    #10
Neuer Benutzer
 
Benutzerbild von Griecherus
 
Registriert seit: 18.09.2007
Ort: Berlin
Beiträge: 1
Standard

Hallo allerseits. Damit sich niemand wundert, wer sich da zu Wort meldet: Ich bin neu hier, auch wenn ich das Geschehen in dem Forum schon eine kleine Weile mitverfolge.

@dr.e.: Meinst du das im Prinzip so? Oder bin ich auf dem falschen Dampfer?
PHP-Code:
class Database
{
    public function 
__construct()
    {
        
$host     Configuration::get('database.host');
        
$port     Configuration::get('database.port');
        
$username Configuration::get('database.username');
        
$password Configuration::get('database.password');

        
$this->_connect($host$port$username$password);
    }

Denn in dem Fall müsste ich mich Bastis Meinung anschließen. Die Wiederverwendbarkeit der Klasse Database ist - wenn überhaupt - nur eingeschränkt vorhanden. In einer fremden Umgebung müsstest du entweder dafür sorgen, dass eine entsprechende Configurations-Klasse mit genau diesem Interface gegeben ist, oder die Datenbank-Klasse selbst umschreiben.

Grüße,

Jean
Griecherus ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.09.2007, 15:01 Nach oben    #11
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 826
Standard

Das hier wäre schonmal ein guter Schritt, um die Abhängigkeit transparent zu machen:

PHP-Code:
class Database
{
    public function 
__construct(IConfig $Configuration)
    {
        
$host     Configuration->get('database.host');
        
$port     Configuration->get('database.port');
        
$username Configuration->get('database.username');
        
$password Configuration->get('database.password');

        
$this->_connect($host$port$username$password);
    }

Aber auch so sehe ich keinen wirklichen Vorteil darin gegenüber er Übergabe der Werte als Zeichenketten.

Es sei denn natürlich, die Klasse soll eh nur in der einen Anwendung verwendet werden. Dann wiederum fände ich diese Variante gut, weil die Abhängigkeit zum Konfigurations-Objekt sichtbar ist.

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.09.2007, 20:35 Nach oben    #12
Christian W. Achatz
 
Benutzerbild von dr.e.
 
Registriert seit: 05.02.2007
Ort: München
Beiträge: 132
Standard

Hallo ihr beiden,

die Transparenz und die Wiederverwendbarkeit schaffe ich anders. Ich erzeuge meine Objekte, die stets von einem zentralen Basis-Objekt erben, mit einigen Informationen zur aktuell ausgeführten Applikation. Jedes Objekt kennt seinen Namespace (Ordner, in dem es abgelegt ist), den Context der Applikation und einige andere Kenner wie z.B. Sprache und Umgebung (Live, Stage, ...). Für genau den Fall der jeweiligen Applikation muss ein Config-File angelegt werden und die Klasse zieht sich mit diesen Kennern per Standard-Config-Interface seine Konfiguration. Das kann ich innerhalb jeder Klasse über die Methode $this->__getConfiguration() machen. Diese zieht sich den ConfigurationManager und bestückt diesen mit den oben genannten Attributen und bekommt dann die jeweilige Config oder null, wenn diese nicht existiert (siehe http://www.adventure-php-framework.o...73fa4bbc767c87).
Diesen Mechanismus kann ich in allen Klassen verwenden und Transparenz und Wiederverwendbarkeit sind ohne Probleme gegeben.
__________________
Grüße,
Dr.E.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Have a look at http://www.adventure-php-framework.org!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.09.2007, 21:38 Nach oben    #13
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 826
Standard

Es geht doch nicht um die Wiederverwertbarkeit innerhalb eines Frameworks. Da kannst du das doch zusammenbacken wie du lustig bist.

Auch geht es nicht um Transparenz im laufenden System, sondern in UML-Diagrammen und API-Dokumentationen ist doch klar.

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.09.2007, 22:45 Nach oben    #14
Christian W. Achatz
 
Benutzerbild von dr.e.
 
Registriert seit: 05.02.2007
Ort: München
Beiträge: 132
Standard

Zitat:
Auch geht es nicht um Transparenz im laufenden System, sondern in UML-Diagrammen und API-Dokumentationen ist doch klar.
Warum sollte diese Methode nicht transparent sein? Im Konstruktor der Klasse beschreibe ich die Funktion doch. Mit einer geegneten API-Dokumentations-Software (z.B. doxygen) bekommt man sogar einen "call tree" gezeichnet, der dem Benutzer exakt aufzeigt, wo welche Funktion/Methode/Klasse benutzt wird. Nebenbei ist mir nicht bewusst gewesen, dass wir zuvor von UML-Diagrammen sprachen...
__________________
Grüße,
Dr.E.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Have a look at http://www.adventure-php-framework.org!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


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

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 aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
MySQL 5.1 kommt in die Beta-Phase Ben Nachrichten 1 02.03.2006 14:31
Problem bei Verwendung von IF bei MySQL Ben Datenbanken 2 22.12.2005 16:00
Problem mit class Garnele PHP-Programmierung 12 12.10.2005 17:05
Progress Class - Problem mit Flush Chr!s PHP-Programmierung 0 27.09.2005 21:59
Problem mit Zugriff von externer class auf Panel Treter_Peter Desktop-Applikationen und Grafik 2 24.12.2004 13:22


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


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44