#1 27. November 2009 Vorstellung: MySQL-Klasse Hi wer evtl noch meine anderen posts mit klassen kennt... ja ich bin momentan dabei mir mal nen cms zu basteln. Da ich das ding eh nicht verkaufen will hab ich auch kein stress damit den code offen zu legen Vorweg: 1. Klar gibt es 10000000 MySQL-Klassen aber ich denke ich habe mir hier was relativ feines ausgedacht, und zwar bassiert das ganze auf der Klasse PDO die ab PHP5.1 erhältlich ist und prepared satements erlaubt 2. Habe ich mir OOP selbst beigebracht und mir hat (außer in c++) bis jetzt noch nie jemand bei dem thema auf die finger gehauen, d.h. wenn jemand unschönheiten entdeckt, kann er sie mich gerne wissen lassen Die einzelnen methoden sind dabei nichts besonderes.. aber ich überlegte mir: Oftmals macht man fehler beim ausführen von Update und Insert befehlen bezüglich der datentypen und die schreibarbeit inkl. übersicht ist meist nur schwer zu halten finde ich persönlich.. Lange rede kurzer sinn - hier der code: PHP: <? php class MySQL { private $objDb = NULL ; // Datenbankobjekt private $strDbLocation = NULL ; // Datenbankadresse private $strDbUser = NULL ; // Datenbankuser private $strDbPassword = NULL ; // Datenbankpasswort private $dbPstmt = NULL ; // Ableger für Prepared Statement /*********************************************************** /* Konstruktor: __construct(String, String, String) /***********************************************************/ function __construct ( $_strDbLocation , $_strDbUser , $_strDbPassword ) { // Datenbankobjekt von PDO wird bei aufruf der Klasse erstellt $this -> strDbLocation = $_strDbLocation ; $this -> strDbUser = $_strDbUser ; $this -> strDbPassword = $_strDbPassword ; try { $this -> objDb = new PDO ( $this -> strDbLocation , $this -> strDbUser , $this -> strDbPassword ); } catch ( PDOException $e ) { echo 'Fehler beim Öffnen der Datenbank: ' . $e -> getMessage (); } } public function getResult ( $query ) { $dbResult = $this -> objDb -> query ( $query ); return $dbResult ; } public function insertStrings ( $db_table , $array ) { // Prüfen, ob die einzufügenden Datensätze in einem Array liegen if(! is_array ( $array )) { // Debug noch nicht vorhanden return false ; } // Querystring $strQuery = "INSERT INTO `" . PREFIX . $db_table . "` SET " ; while(list( $key , $val ) = each ( $array )) { // Auf Datentyp prüfen if( is_string ( $val )) { $strQuery .= "`" . $key . "` = '" . $val . "', " ; // Daten an Querystring hängen } elseif( is_numeric ( $val )) { $strQuery .= "`" . $key . "` = " . $val . ", " ; // Daten an Querystring hängen } elseif( is_bool ( $val )) { $strQuery .= "`" . $key . "` = " . $val . ", " ; // Daten an Querystring hängen } else { echo "Datentyp nicht korrekt!<br/>" ; } } $strQuery = substr ( $strQuery , 0 , - 2 ); // Das überhängende ", " abschneiden $this -> objDb -> query ( $strQuery ); // Query ausführen } public function updateStrings ( $db_table , $array ) { // Prüfen, ob die einzufügenden Datensätze in einem Array liegen if(! is_array ( $array )) { // Debug noch nicht vorhanden return false ; } // Querystring $strQuery = "UPDATE `" . PREFIX . $db_table . "` SET " ; while(list( $key , $val ) = each ( $array )) { if( is_string ( $val )) { $strQuery .= "`" . $key . "` = '" . $val . "', " ; // Daten an Querystring hängen } elseif( is_numeric ( $val )) { $strQuery .= "`" . $key . "` = " . $val . ", " ; // Daten an Querystring hängen } elseif( is_bool ( $val )) { $strQuery .= "`" . $key . "` = " . $val . ", " ; // Daten an Querystring hängen } else { echo "Datentyp nicht korrekt!<br/>" ; } } $strQuery = substr ( $strQuery , 0 , - 2 ); // Das überhängende ", " abschneiden $this -> objDb -> query ( $strQuery ); // Query ausführen } public function PrepareStatement ( $query ) { $this -> dbPstmt = $this -> objDb -> prepare ( $query ); } public function bindParam ( $replacement , $string ) { $this -> dbPstmt -> bindParam ( $replacement , $string ); } public function execute () { $this -> dbPstmt -> execute (); }} ?> Die Klasse ist noch stark ausbaufähig.. hatte mir z.b. mal überlegt eine dynamische Tabellenausgabe mit angegebenen Spalten zu basteln aber bin dabei auf ein paar Probleme gestoßen, müsste ich mich noch mal hinter setzen... Bin für Kritik, Lob und Vorschläge gerne offen Edit: Debugausgaben sind noch nicht vorhanden! + Multi-Zitat Zitieren
#2 27. November 2009 AW: Vorstellung: MySQL-Klasse PHP: class MySQL extends PDO und du könntest dir einiges an schreibarbneit sparen - wobei die klasse eh ned viel sinn macht, da pdo genau für deinen zweck gebaut wurde (viele verschiedene dbs mit selben interface ansprechbar) naja, sonst fällt mir noch auf das du alle klassen-variablen mit NULL definierst -> das muss ned sein ansonsten kann man das so stehen lassen, schöner style + Multi-Zitat Zitieren
#3 27. November 2009 AW: Vorstellung: MySQL-Klasse - public function getResult($query) - public function PrepareStatement($query) - public function bindParam($replacement, $string) - public function execute() können weg ist doch schon in der pdo-klasse drin. + Multi-Zitat Zitieren
#4 27. November 2009 AW: Vorstellung: MySQL-Klasse ich hab schon öfter mal versucht was mit extends zu machen.. aber irgendwie hatte ich depp versucht das ganze immer anders zu versuchen... letztenendes kann man dann wahrscheinlich die methoden von pdo einfach über mein objekt der klasse aufrufen , oder? Tjaja.. die kleine aber feine lücke im wissen ^^ edit: das mit dem null.. weiß nich, auch sone dumme angewohnheit aus C, wo mir zumindest beigebracht wurde immer schön zu initialisieren + Multi-Zitat Zitieren
#5 28. November 2009 AW: Vorstellung: MySQL-Klasse Mir fallen da nur ein paar "Schönheitsfehler" ein. Das ist natürlich geschmackssache: Einige der Methoden könntest du private setzen, so dass man von außen nurnoch sagen muss: Ich will einen Wert haben, einen ändern, etc. und nicht mit den Methoden der Klasse selbst hantieren muss. Dann würde ich an deiner Stelle Namen von private Variablen mit einem "_" beginnen und nicht anders rum (Parameter mit Unterstrich, private Variablen normal). Wird glaube ich in Zend auch so gemacht und Zend kommt ja direkt aus der PHP Schmiede ^^ Wie gesagt, nur Schönheitsfehler. Dann wurde es ja bereits gesagt, dass eine solche Klasse schon existiert. Ich hatte bei dem Thema jetzt gehofft auf was richtig cooles zu stoßen: In C#, .NET (weiß jetzt nicht genau, woher es kommt) gibts parametriesierte Query Funktionen, ich weiß nicht genau wie man es nennt und erklären kann... Aber man schreibt seine Query und hängt hinten die Parameter an. Ich kann das grad nicht richtig erklären. Vielleicht schaust dus dir mal an (die Express Edition von Visual Studio C# ist kostenlos). Das ist richtig gut! + Multi-Zitat Zitieren
#6 28. November 2009 AW: Vorstellung: MySQL-Klasse meinst du sowas: PHP: function query ( $sql ) { $args = func_get_args (); unset( $args [ 0 ]); $query = vsprintf ( $sql , $args ); return mysql_query ( $query );} query ( 'SELECT %s, %s, FROM %s WHERE %s = %d' , 'foo' , 'bar' , 'baz' , 'field' , 1 ); + Multi-Zitat Zitieren
#7 29. November 2009 AW: Vorstellung: MySQL-Klasse Genau, sowas. Dann noch ein paar schöne Methoden für select, update, insert usw. Also eine Klasse, die noch mehr kann und simpel zu bedienen ist. + Multi-Zitat Zitieren
#8 29. November 2009 AW: Vorstellung: MySQL-Klasse man kann auch einfach nachschauen was für eine abfrage es ist: PHP: function query ( $sql ){ $op = substr ( $sql , 0 , strpos ( ' ' , $sql )); switch( $op ) { case 'select' : break; case 'update' : $s -> machUpdate (); break; .... }} + Multi-Zitat Zitieren
#9 30. November 2009 AW: Vorstellung: MySQL-Klasse Die idee find ich echt cool wobei ich persönlich dann gleich ein prepared statement nutzen würde.. macht aber auch nicht immer sinn, hierbei ist aber auch nicht schlecht, das man sich direkt über die Datentypen im klaren ist und man keinen schreibfehler machen kann Die funktion errinert stark an C printf("Meine tolle Zahl %d", 10); + Multi-Zitat Zitieren