ADOdb erweitern?

  • Themenstarter Themenstarter Pallaadino
  • Beginndatum Beginndatum
P

Pallaadino

Hallo @ all,

ich habe bisher imer eine eigene Klasse benutzt um meine SQL-Abfragen an die datenbank zu senden.
Ich bin vor kurzem auf ADOdb gestoßen und würde nun gerne versuchen zu ADOdb zu wechseln....

Nun ist es so das ich einige Functions nutze die ADOdb natürlich anders umsetzt, also dachte ich mir ich schreibe meine Functions neu mit/in ADOdb und könnte dann halt sowas nutzen wie:

$DB->Execute($SQL);
aber auch sachen wie
$DB->MY_QUERY_FUNCTION($sql);

Leider darf ich aber von ADOdb nicht wirklich erben, die einzige klasse wo das sinn machen würde wäre 'ADOConnection' und da gibts dann ne Fehlermeldung....

Google habe ich schon befragt, hab da eine "Delegator" Class gefunden, aber die ist in singelton vom design her und passt nicht wirklich zu dem was ich gerne hätte....!

Hat das vielleicht irgendwer schonmal erweitert und kann mir nen ansatz geben?

Vielen Dank
 
Leider darf ich aber von ADOdb nicht wirklich erben, die einzige klasse wo das sinn machen würde wäre 'ADOConnection' und da gibts dann ne Fehlermeldung....

Ohne mir das jetzt detailierter angesehen zu haben: Heißt das, dass diese Adodb-Klasse final ist? Oder was heißt das genau? Entweder man kann abstrahieren oder nicht. Mit Sinn-machen hat das wenig zu tun.

Geht es dir nur darum, ein paar Klassen-Methoden anders zu benamsen?
 
Wenn ich versuche von der Klasse zu erben kommt die Fehlermeldung 'Virtual Class -- cannot instantiate' - habe mal versucht in der Klasse die Fehlermeldung und das dort gesetzte Die(); rauszunehmen, hat aber leider nichts gebracht da wohl kein Objekt present ist wenn man davon abstrahiert.

Was die functions angeht, ich will nicht nur zb Execute einfach in fetch umbenennen (wobei das auch eine der sachen ist die ich umsetzen wollte) - aber ich habe functions die mir datensätze vorbereiten und gerade wenn ich ADOdb bei vorhandenen Projekten einsetzen will würde ich da gerne eine gewisse Kompatibilität herstellen was ich halt nur über vererbung erreiche (oder das ich ne klasse mache, und dann jede funktion die ADOdb benutzt dort beschreibe und auf ADOdb verweisen lasse, ka ob man dann da mit __call arbeiten könnte...)
 
Kannst du bitte mal bisschen Code posten? Ich habe ein klein wenig das Gefühl, das hier ein paar Begriffe durcheinander gebracht werden, was dem ganzen den Sinn nimmt. ;-)
 
Ich versuche mal es ein wenig begreiflich zu machen:


alte klasse sieht ca so aus:
Code:
$db = new Database(host,server,user,pass);
$db->query($sql) //query
$db->fetchArray($sql) //fetcht ein Array
$db->getJSON($sql) //fetcht array und gibt JSON zurück

ADOdb:
Code:
include_once('adodb.inc.php');	//kann ich hier nicht Posten, ist 4400 Zeilen groß

$DB = NewADOConnection('mysql');
$DB->Connect("localhost","root","","datenbankname");
$DB->Execute("$sql");

Was ich gerne errreichen will:
Code:
$db = new MeineNeueTolleDB($serverdaten);
$db->Execute("$sql"); //function von ADOdb
$db->getJSON($sql); //eigene funktion die mir JSON zurückgibt aber die ich dann selbst über ADOdb implementiere

Lösungsansatz meinerseits:
Code:
 class DatabaseExtendedVersion extends ADOConnection{

 function DB($server, $user, $pwd, $db, $typ="mysql"){  
        $rec = &NewADOConnection('mysql');
        $rec->Connect($server, $user, $pwd, $db);
        return $rec;
   }   
 }  
$db = new DatabaseExtendedVersion("$serverdaten"); 
$db->Execute("$sql");
Ausgabe: Virtual Class -- cannot instantiate

Vielleicht bin ich auch zu Dumm und es gibt nen viel leichteren Ansatz, wenn ja bitte sagt es mir :)

andere Idee die mir kam war folgende: (ich bezweifele aber das es so einfach sein könnte!)

Code:
 class DatabaseExtendedVersion {
 var $ado;

 function DB($server, $user, $pwd, $db, $typ="mysql"){  
        $ado = &NewADOConnection('mysql');
        $ado->Connect($server, $user, $pwd, $db);
        $this_>ado = ado;
   }   

 function __call($function,$arguments){
        $this->ado->$function($arguments);
 }
 }

Hoffe es war alles ausfühlich genug, bitte hängt euch nicht an Variablen/Syntaxfehlern auf...
 
Du müsstest IMHO in deiner DatabaseExtendedVersion-Klasse einen Constructor definieren. Etwa in der Art:

PHP:
class DatabaseExtendedVersion extends ADOConnection{

 function DatabaseExtendedVersion()
 {
 }
 
 function DB($server, $user, $pwd, $db, $typ="mysql")
 {  
   $rec = &NewADOConnection('mysql');
   $rec->Connect($server, $user, $pwd, $db);
   return $rec;
 }   
}

Desweiteren wäre es vielleicht sinnvoll, ADODB_mysql anstatt direkt ADOConnection zu erweitern. Da du ja ohnehin nur MySQL supporten willst, wäre das meiner Meinung nach der einfachere Weg.
 
Nen Construktor habe ich (die DB function war ursprünglich mal der Construktor).
Nur MySQL zu abstrahieren würde dann ADOdb sinnfrei machen, denn meine änderungen würden nicht für die anderen Datenbanken übernommen werden - ziel von dem Umstieg auf ADOdb ist es eine größere Kompatibilität herzustellen und evtl auf sqLight oder eine andere DB ausweichen zu können.... - einen anderen grund gäbe es für mich nicht bei ADOdb.

Was bei ADO in der Docu steht weis ich bereits, aber auch da wird nur immer eine Datenbank erweitert, das mag für größere Hacks nützlich sein und ich finde es auch toll das sie es da anscheinend zulassen aber das hilft mir nicht ADOdb auf bereits geschriebene Anwendungen zu übernehmen (ausser alle Querys dann nach ADOdb muster neu aufzubauen)...
 
Das dürfte dann nicht so einfach zu bewerkstelligen sein. Du willst ADO erweitern, also ein abstrakte Klasse von ADO erstellen. Die restlichen Klassen arbeiten aber weiterhin ebenfalls als Abstraktion zu ADO oder benutzen es direkt. Diese Klassen (bspw. ADODB_mysql) müsstest du dann ebenfalls erweitern, um deine abstrakte Version von ADO zu verwenden.

Wie man es dreht und wendet, auf einfachem Wege ist das nicht zu erreichen. Dann bleibt dir eigentlich nur eine Möglichkeit: ADO zu contributen. Also dein Werk den Machern von ADO direkt zur Verfügung zu stellen. Dann kannst du ADO direkt anpassen. Oder du musst forken und dann ADO letzendlich selbst auch noch pflegen (nicht nur deine eigenen Änderungen).
 
hmmm, Okay.

Dann vielen Dank für die gegebene Hilfe und die Investierte Zeit! - werde mal sehen ob ich es anders löse aber evtl. lasse ich es dann auch...!

Vielen Dank :D
 
Zurück