Eigene MySQL-Klasse

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Eigene MySQL-Klasse

    Hallo!!

    Ich hab lange Zeit im Netz nach ner vernünftigen MySQL- Klasse gesucht, aber nichts gefunden. Darum dachte ich mir, ich entwerf meine eigene.

    Hierfür würde ich mir gerne ein paar Ratschläge von anderen (erfahreneren) Programmierern einholen.

    Ich habe mal ein paar Funktionen geschrieben, die in meine Klasse sollen:

    PHP-Code:
    //SELECT- Funktion
    function select($sql) {

     
    $query mysql_query($sql) OR die(mysql_error());

     
    $result = array();

     while(
    $row mysql_fetch_assoc($query)) {

      
    $result[] = $row;

     }
     return 
    $result;


    Da ich mir ein eigenes CMS schreibe, sind für mich UPDATE und INSERT- Queries besonders wichtig.

    PHP-Code:
    function write($sql) {

     
    $query mysql_query($sql);

     if(
    $query) {

      if(
    preg_match("/^UPDATE/i",$sql)) {
       echo 
    "Daten erfolgreich aktualisiert!";
      } elseif (
    preg_match("/^INSERT/i",$sql)) {
       echo 
    "Daten erfolgreich eingetragen!";
      } else {
       echo 
    "Query ist kein Insert-/Update- Query";
      }  

     } else {
      echo 
    "Es ist ein Fehler aufgetreten. MySQL lieferte folgende Fehlermeldung:<br/><br />\n";
      echo 
    "<b>".mysql_error()."</b>";
     }


    Das sind bisher die Kernfunktionen meiner Klasse. Sachen wie Verbindung zur Datenbank öffnen/schließen spare ich mir an dieser Stelle.

    Also:

    a) Was haltet ihr davon?
    b) Welche wichtigen Funktionen sollten noch mit rein?

    Freue mich auf Feedback
    Zuletzt geändert von koschda; 12.06.2005, 15:43.

  • #2
    Was ich ungünstig finde ist die Selectfunktion, da du erst ausliest und in ein Array speicherst, d.h. du musst, wenn du was mit den Daten anfangen willst, nochmal mit nem foreach ran. Es ist sicher schneller / effektiver gleich beim while die Daten zu verarbeiten.

    Kommentar


    • #3
      Das habe ich zuerst auch gedacht. Aber dann kriege ich von smarty (ja, der Template- Klasse) eins auf die Mütze. und bevor die wieder zicken macht, nehm ich foreach gerne in kauf.

      edit:

      Ja, ich kenne mich kaum mit smarty aus^^

      Kommentar


      • #4
        Sorry, wenn ichs jetzt nicht ganz gelesen habe.

        Aber ich würde die klasse nicht direkt an smarty anpassen. mach sie lieber universell. Dann kannst du sie auch vernünftig(!) einsetzen, wenn du smarty mal nicht brauchst. (bei kleineren sachen oder vielleicht hast du irgendwann deine eigene tpl-klasse).

        Für die Projekte, in denen du Smarty verwendest, kannst du dann immer noch eine zusätzliche Methode einbauen, die die Daten für Smarty vorbereitet. (gerne mittels class extends).

        Kommentar


        • #5
          kannst dir ja für das select im prinzip zwei methoden basteln.

          eine, die dir das gesamte Resultset in 'nem Array liefert (die du ja schon hast)

          und eine, die dir lediglich das Handle auf's resultset liefert.
          Dann noch ne weitere, die dir Zeilenweise die daten aus'm resultset zupft.

          ausserdem:

          'ne connect methode

          'ne disconnect methode

          'ne property für die Verbindungskennung

          was sich bei bedarf noch so ergibt, und für 'ne erweiterung der Klasse lohnen würde

          Kommentar


          • #6
            Wozu braucht man eine Disconnect-Methode, reicht da nicht ein einfaches mysql_close(); ?

            Kommentar


            • #7
              wenn schon OOP, dann auch richtig. Mischmasch ist gar nichts!

              Außerdem kannst du in der Methode in einem wieder Speicher freigeben.

              Kommentar


              • #8
                Ich glaube, ihr habt recht. Die Klasse wird nicht nur zusammen mit Smarty zum Einsatz kommen. Werd mich gleich darum kümmern.

                Connect und Disconnect Methode habe ich absichtlich weggelassen, steht auch oben. Dass ich sie brauche, ist mir klar. Mir kommt es hier nur auf weitere Features an, die man einbinden könnte.

                Kommentar


                • #9
                  Original geschrieben von Milian
                  Wozu braucht man eine Disconnect-Methode, reicht da nicht ein einfaches mysql_close(); ?
                  wozu braucht man Hochsprachen?
                  gibt doch Assembler....

                  Kommentar


                  • #10
                    Das war wirklich nur ne Frage, da ich es selber nicht weiß, das war keine Verbesserung o.ä.

                    Benutzt ihr mysql_free_result nach jeder Qry? Weil im Manual steht:

                    Die Funktion muss nur dann aufgerufen werden, wenn Sie sich bei Anfragen, die große Ergebnismengen liefern, Sorgen über den Speicherverbrauch zur Laufzeit des PHP-Skripts machen. Nach Ablauf des Skripts wird der Speicher ohnehin freigegeben.
                    Sollte man trotzdem nach jeder Qry mysql_free_result benutzen?

                    Edit: Ich meine natürlich nach jeder SELECT / SHOW / EXPLAIN / DESCRIBE Qry

                    Kommentar


                    • #11
                      Du hast das Manual doch gelesen. Da ist deine Frage doch vernünftig beantwortet, oder worauf willst du genau hinaus.

                      Wenn ich ne Query mit 1000 Datensätzen absende, dann die 1000 DS ausgeben und das wars, dann verwende ich free_result ganz sicher nicht.

                      Wenn ich aber 1000 Datensätze hole, jeden einzelnen vergleiche (ACHTUNG! NUR EIN BEISPIEL) und danach erst mit der Handlung anfange, dann natürlich schon.

                      Kommentar


                      • #12
                        Hi...

                        Also ich würde eigentlich überhaupt keine Select funktion da mit reinbauen. Eher eine Query funktion in die Klasse und eine passende Ausgabe im Script selbst machen. (So hab ich das in meiner Klasse)

                        PHP-Code:
                        function query($sql) {
                            if (
                        $sql == "")
                              return 
                        0;

                            if (!
                        $this->connect()) {
                              return 
                        0;
                            };

                            if (
                        $this->debug)
                              
                        printf("Debug: query = %s<br>\n"$sql);

                            
                        $this->query_id = @mysql_query($sql,$this->link_id);
                            
                        $this->row   0;
                            
                        $this->errno mysql_errno();
                            
                        $this->errno mysql_error();
                            if (!
                        $this->query_id) {
                              
                        $this->error("Error in SQL: ".$sql);
                            }

                            return 
                        $this->query_id;
                          } 
                        Dazu gehört dann noch folgendes

                        PHP-Code:
                        function next_record($type=MYSQL_ASSOC) {
                            if (!
                        $this->query_id) {
                              
                        $this->halt("no query pending");
                              return 
                        0;
                            }

                            
                        $this->record = @mysql_fetch_array($this->query_id$type);
                            
                        $this->row   += 1;
                            
                        $this->errno  mysql_errno();
                            
                        $this->error  mysql_error();

                            
                        $stat is_array($this->Record);
                            if (!
                        $stat) {
                              
                        $this->free();
                            }
                            return 
                        $stat;
                          } 
                        Dann gibts halt noch die passende error funktion (ausgabe in einer Tabelle in ätzendem Rot

                        Im script

                        PHP-Code:
                        $db->query($sql);
                        while (
                        $this->next_record())
                        {
                          ...
                        Ausgabe...


                        Vorschläge für weitere Funktionen die man reinpacken KANN ...
                        (Da teilen sich wieder die Meinungen obs sinn macht oder nicht)
                        Ich hab allmöglichen humbug in meiner DB Klasse.
                        gruss Chris

                        [color=blue]Derjenige, der sagt: "Es geht nicht", soll den nicht stoeren, der's gerade tut."[/color]

                        Kommentar


                        • #13
                          Nur falls dus nicht gesehn hast, kleiner Fehler in deiner Query Funktion
                          PHP-Code:
                          $this->errno mysql_errno();
                          $this->errno mysql_error(); 

                          Kommentar


                          • #14
                            Ah LOL danke.
                            Ich hab so selten fehler das ich das noch gar nicht gesehen habe
                            gruss Chris

                            [color=blue]Derjenige, der sagt: "Es geht nicht", soll den nicht stoeren, der's gerade tut."[/color]

                            Kommentar


                            • #15
                              Original geschrieben von hhcm
                              Ah LOL danke.
                              Ich hab so selten fehler das ich das noch gar nicht gesehen habe
                              OffTopic:
                              das war jetzt aber mit dem Boris Becker Nutella Gedächtnis Messer aufgetragen...

                              Kommentar

                              Lädt...
                              X