Andreas: Funktion(en) für DB-Verbindung und Abfragen

Hallo!
Ich überlege, wie ich in Zukunft DB-Verbindungen etwas einfacher einbinden, und vor allem SQL-Abfragen einfacher verwenden kann, unter anderem auch automatisch die MySQL Fehler ausgebe.

Wollte nur mal hören, wie Ihr das macht, irgendwie bekomme ich keine vernünftige Methode zusammen:

<?

verbindung.php

--------------

$host= "xxx";
$usr= "xxx";
$pw= "xxx";

$db= "xxx";

$link=@mysql_connect($host,$usr,$pw)
or die ("die Verbindungsaufnahme dem MySQL-Server ist gescheitert(".mysql_errno().", ".mysql_error().")");

@mysql_select_db($db,$link)
or die ("die Verbindungsaufnahme mit der DB ".$db." ist gescheitert(".mysql_errno().", ".mysql_error().")");

--------------

?>

========================================================

<?

seite.php

---------

function db("$sql"){

// Kontrolle ob Verbinung besteht, geht das auch besser?
if(!mysql_ping()){
include "verbindung.php";}

// Abfrage an DB schicken
$res = mysql_query($sql, $link);
  if (!$res)
    die("Anfrage $sql scheitert.<br>\n
         (".mysql_errno().", ".mysql_error().")");

}

// so könnte ich das dann verwenden
db("INSERT INTO tabelle...");

---------

?>

Aber irgerndwie ist das so nicht optimal. OK, für Inserts schön und gut, aber was wenn es etwas individueller wird, und ich z.B. die  Mysql_insert_id möchte? Oder noch komplizierter, wenn ich SELECT verwende, Dann brauche ich ja $res außerhalb der Funktion(wie?), um die Daten letztendlich auch zu bekommen! Jetzt ist die Frage, ob ich die Funktion ausschmücke, sowas der Art

if (substr(0,6)=="SELECT"){
// noch ein bisschen mehr...}

oder ob ich evtl für alles einzelne Funktionen verwende, oder ob man sowas lieber ganz aus Funktionen herausläßt...

Mich interessiert mal Eure Meinung dazu, und wie Ihr sowas löst! Und überhaupt, was sagt Ihr zu meinem Versuch, auch mit den Fehlermeldungen und mit dem mysql_ping()...

Viele Grüße
Andreas

  1. Halihallo

    Ich überlege, wie ich in Zukunft DB-Verbindungen etwas einfacher einbinden, und vor allem SQL-Abfragen einfacher verwenden kann, unter anderem auch automatisch die MySQL Fehler ausgebe.

    Wollte nur mal hören, wie Ihr das macht, irgendwie bekomme ich keine vernünftige Methode zusammen:

    [...]

    Also ich hab das mal so gelöst:
    Bei vielen Programmen braucht man eh nur ein Connection-Objekt; dehalb hab ich einfach einige globale Variablen für den dbh - Handler und eventuelle statement-handler (die gibt's glaub in php nicht). Meine "verbindung.php" hat dann einige Funktionen, welche diese globalen Variablen "verwalten", diese sind:

    connect
    sql
    getRow (Datenbestand (beim SELECT) sequentiell auslesen)
    getLenght / getCount (Anzahl der Records bei Select, bzw. Anzahl geänderter Records bei UPDATE z. B.)
    disconnect

    andere Lösung:
    du bastelst dir eine eigene Klasse als Datenbank-Interface mit obengenannten Methoden. Jedesmal, wenn du eine DB-Connection brauchst, erstellst du eine neue Instanz der Klasse und kannst diese verwenden.

    Aber irgerndwie ist das so nicht optimal. OK, für Inserts schön und gut, aber was wenn es etwas individueller wird, und ich z.B. die  Mysql_insert_id möchte? Oder noch komplizierter, wenn ich SELECT verwende, Dann brauche ich ja $res außerhalb der Funktion(wie?), um die Daten letztendlich auch zu bekommen! Jetzt ist die Frage, ob ich die Funktion ausschmücke, sowas der Art

    if (substr(0,6)=="SELECT"){
    // noch ein bisschen mehr...}

    Ist das nötig??? - Mit den globalen Variablen, sollte dies auch ohne möglich sein. Zudem, was ist, wenn du vor dem SELECT noch einige Leerzeichen hast???

    Mich interessiert mal Eure Meinung dazu, und wie Ihr sowas löst! Und überhaupt, was sagt Ihr zu meinem Versuch, auch mit den Fehlermeldungen und mit dem mysql_ping()...

    Hm. Warum mysql_ping? - Geht das nicht einfacher, wenn du eine globale Variable hast, welche die Werte 0/1 annehmen kann und somit sagt, ob die connection bereits aufgebaut wurde, oder nicht? - mysql_ping braucht nämlich wesentlich mehr performance, weil es einen Ping übers Netzwerk sendet.
    Zu den Fehlermeldungen: Wenn ein Fehler auftaucht, sollte das Programm gleich abgebrochen werden.

    Viele Grüsse

    Philipp

    1. Hallo!

      Bei vielen Programmen braucht man eh nur ein Connection-Objekt; dehalb hab ich einfach einige globale Variablen für den dbh - Handler und eventuelle statement-handler (die gibt's glaub in php nicht). Meine "verbindung.php" hat dann einige Funktionen, welche diese globalen Variablen "verwalten", diese sind:

      connect
      sql
      getRow (Datenbestand (beim SELECT) sequentiell auslesen)
      getLenght / getCount (Anzahl der Records bei Select, bzw. Anzahl geänderter Records bei UPDATE z. B.)
      disconnect

      Hm, ne Idee, damit würde ich das meiste bekommen.

      andere Lösung:
      du bastelst dir eine eigene Klasse als Datenbank-Interface mit obengenannten Methoden. Jedesmal, wenn du eine DB-Connection brauchst, erstellst du eine neue Instanz der Klasse und kannst diese verwenden.

      Ja, sowas wie Andrés Vorschlag, oder? Ich muß mal gucken was mir mehr liegt, das mit den Funktionen sieht wie ich finde auf den ersten Blick etwas leichter und weniger zu schreiben aus. Ich weiß auch nicht, ob OOP für sowas so optimal ist, wenn ich nicht irre ist das auf alle Fälle langsamer und außerdem weiß ich nicht, was man von den ganzen Klasen.. usw. hat, wenn man eh immer nur ein Script hat, welches von vorne bis hinten für sich als eigenes Programm ausgeführt ausgeführt wird, das ist nunmal ein Job für eine Scriptsprache, wie der Name schon sagt, ich weiß nicht ob OOP das an so einer Stelle nur verkomplizieren.

      Genau wie z.B. eine Warenkorb Klasse, das ist ja in der Theorie wirklich ganz nett, aber in der Praxis? Ich gebe was in den Warenkorb... und dann? Wenn ich ein weiteres Produkt suche muß ich auf eine andere Datei wechseln, die Datei mit der Warenkorb-Klasse wird beendet, die Daten sind weg - wozu soll das dann gut sein? Mag sein das das in Java irgendwie funktioniert, aber man kann ja nicht eine Klasse wie eine Variable über mehrere Seiten hinweg mitschleppen, oder in einer Session speichern, oder? Mir ist bis jetzt noch kein Einsatzzweck bei einem Webobjekt wie einen DB-gestützen Online-Shop untergekommen, wo ich Klassen auch nur irgendwie für besonders nützlich oder vereinfachend empfunden habe.
      Aber vielleicht habe ich ja noch ein allgemeinerers Verständnis-Problem mit OOP ;-)

      Aber irgerndwie ist das so nicht optimal. OK, für Inserts schön und gut, aber was wenn es etwas individueller wird, und ich z.B. die  Mysql_insert_id möchte? Oder noch komplizierter, wenn ich SELECT verwende, Dann brauche ich ja $res außerhalb der Funktion(wie?), um die Daten letztendlich auch zu bekommen! Jetzt ist die Frage, ob ich die Funktion ausschmücke, sowas der Art

      Hm. Warum mysql_ping? - Geht das nicht einfacher, wenn du eine globale Variable hast, welche die Werte 0/1 annehmen kann und somit sagt, ob die connection bereits aufgebaut wurde, oder nicht? - mysql_ping braucht nämlich wesentlich mehr performance, weil es einen Ping übers Netzwerk sendet.

      Stimmt, ich muß bei meinem Ansatz einfach fragen if($link), das sagr ja dasselbe aus ;-)

      Zu den Fehlermeldungen: Wenn ein Fehler auftaucht, sollte das Programm gleich abgebrochen werden.

      Das mach ich ja durch die();

      Vielen Dank!

      Grüße
      Andreas

      1. Halihallo

        du bastelst dir eine eigene Klasse als Datenbank-Interface mit obengenannten Methoden. Jedesmal, wenn du eine DB-Connection brauchst, erstellst du eine neue Instanz der Klasse und kannst diese verwenden.

        Ja, sowas wie Andrés Vorschlag, oder?

        Ja, sogar genau das, nur hatte ich andere Methodennamen.

        Ich muß mal gucken was mir mehr liegt, das mit den Funktionen sieht wie ich finde auf den ersten Blick etwas leichter und weniger zu schreiben aus.

        Das stimmt, nur kannst du dann nur eine Instanz der Connection offen haben (oder nur mit ziemlichem Aufwand das Multiconnection-fähig machen). Wenn du verschachtelt SQL-queries schicken willst, geht das nicht mehr. Einfaches Beispiel:

        <pseudocode>
        SQL: SELECT * FROM Kunden
        foreach (Kunde) {
           SQL: SELECT * FROM Articles
        }
        </pseudocode>

        Ich weiß auch nicht, ob OOP für sowas so optimal ist, wenn ich nicht irre ist das auf alle Fälle langsamer und außerdem weiß ich nicht, was man von den ganzen Klasen.. usw. hat, wenn man eh immer nur ein Script hat, welches von vorne bis hinten für sich als eigenes Programm ausgeführt ausgeführt wird, das ist nunmal ein Job für eine Scriptsprache, wie der Name schon sagt, ich weiß nicht ob OOP das an so einer Stelle nur verkomplizieren.

        Auf jeden Fall langsamer? - OK, 1 Milisekunde, aber höchstens. Langsam wird's erst, wenn man's nicht richtig programmiert ;)
        Gut, ich weiss nicht, wie OOP in php implementiert ist und wie performant das gelöst ist, aber viel Prozessorzeit wird damit wohl nicht verbraten (gegenüber einer prozeduralen Lösung).

        Genau wie z.B. eine Warenkorb Klasse, das ist ja in der Theorie wirklich ganz nett, aber in der Praxis? Ich gebe was in den Warenkorb... und dann? Wenn ich ein weiteres Produkt suche muß ich auf eine andere Datei wechseln, die Datei mit der Warenkorb-Klasse wird beendet, die Daten sind weg - wozu soll das dann gut sein?

        Im Hauptprogramm musst du dich nicht mehr um SQL-queries kümmern, sondern kannst dich voll und ganz auf das Interface der Klasse beschränken. Falls dann künftig Änderungen am Datenbankschema kommen, musst du nur noch die Klasse ändern, alle GUI-Programme bleiben dieselben. D. h. Du trennst Output von der Funktionalität. Zudem kannst du eventuell eine ganze Klasse (was bei einer DB-Klasse sicher der Fall ist) in einem anderen Programm wiederverwerten => Wiederverwertbarkeit von Code und musst nicht alles kopieren.

        Mir ist bis jetzt noch kein Einsatzzweck bei einem Webobjekt wie einen DB-gestützen Online-Shop untergekommen, wo ich Klassen auch nur irgendwie für besonders nützlich oder vereinfachend empfunden habe.
        Aber vielleicht habe ich ja noch ein allgemeinerers Verständnis-Problem mit OOP ;-)

        Hm. Vielleicht können wir das ja beheben; ich liebe (und das musste ich auch zuerst lernen) nämlich OOP ;)

        Zu den Fehlermeldungen: Wenn ein Fehler auftaucht, sollte das Programm gleich abgebrochen werden.
        Das mach ich ja durch die();

        Upsa, das hab ich übersehen, 'tschuldige

        Viele Grüsse

        Philipp

        1. Hallo!

          Auf jeden Fall langsamer? - OK, 1 Milisekunde, aber höchstens. Langsam wird's erst, wenn man's nicht richtig programmiert ;)

          OK, hatt ich nnur mal gehört, vielleicht täusche ich mich.

          Genau wie z.B. eine Warenkorb Klasse, das ist ja in der Theorie wirklich ganz nett, aber in der Praxis? Ich gebe was in den Warenkorb... und dann? Wenn ich ein weiteres Produkt suche muß ich auf eine andere Datei wechseln, die Datei mit der Warenkorb-Klasse wird beendet, die Daten sind weg - wozu soll das dann gut sein?

          Im Hauptprogramm musst du dich nicht mehr um SQL-queries kümmern, sondern kannst dich voll und ganz auf das Interface der Klasse beschränken. Falls dann künftig Änderungen am Datenbankschema kommen, musst du nur noch die Klasse ändern, alle GUI-Programme bleiben dieselben. D. h. Du trennst Output von der Funktionalität. Zudem kannst du eventuell eine ganze Klasse (was bei einer DB-Klasse sicher der Fall ist) in einem anderen Programm wiederverwerten => Wiederverwertbarkeit von Code und musst nicht alles kopieren.

          Ach so! Also ich sage dann in auf der Warenkorbseite selbst nur Warenkorb=>hinzufügen(oder wie man das schreibt), und das bleibt dann natürlich immer gleich. Aber die Ausgabe ist immer noch dasselbe Problem! Wenn ich den Warenkorb anzeige, brauche ich ja eine SQl-Abfrage in der Warenorb Datei, ist eigentlich egal wo die steht, denn für das generieren einer Tabelle in einer Schleife brauche ich dann immer die speziellen Felder $warenkorb["preis"] und da kann ich Output und Funktionalität schon wieder nicht trennen, oder gibt es auch bei der html-Ausgabe eine Möglichkeit, das mit einer, vielleicht einer eigenen Klasse zu trennen? Aber wie?

          Aber vielleicht habe ich ja noch ein allgemeinerers Verständnis-Problem mit OOP ;-)
          Hm. Vielleicht können wir das ja beheben; ich liebe (und das musste ich auch zuerst lernen) nämlich OOP ;)

          Naja, anscheinend kannst Du immer genau das, was ich gerade können will, sehr lustig ;-) Aber vielen Dank für Deine Antworten, lese ich immer sehr gerne, und das kommt letzte Zeit sehr oft vor!

          Aber vielleicht nochma, zurück zu Eunsatzmöglichkeiten von Klassen, am Beispiel des Onlineshops, z.B. habe ich eine Produktseite, Wo bestimmte Daten zu einem Produkt ausgelesen und angezeigt werden, udn dazu eine Tabelle mit allen möglichen Varrianten, Preisen... ich würde jetzt einfach drauflos programmieren, hätte immer einzelnde Schleifen... im ode stehem für die Tabellen... siehst Du bei sowas auch irgendwie eine Möglichhkeit Klassen zu verwenden?  Wie ist das, Klassen zu kombinieren, hatte ich mal von gehört, aber nicht nicht wirklich verstanden :-)

          Viele Grüße
          Andreas

          1. Halihallo Andreas

            Auf jeden Fall langsamer? - OK, 1 Milisekunde, aber höchstens. Langsam wird's erst, wenn man's nicht richtig programmiert ;)

            OK, hatt ich nnur mal gehört, vielleicht täusche ich mich.

            Nö, es ist leider oftmals die Standard-Antwort auf die Frage "Warum OOP und wie schaut's mit der Performance aus". Aber ich muss sagen, dass das nicht die feinste Antwort ist. Besser wäre: "Ja, OOP ist vielleicht etwas langsamer, obwohl das meist auf eine falsche Implementation zurückzuführen ist; aber schliesslich überwiegen die Vorteile vom schönen OOP-Style"...

            Ach so! Also ich sage dann in auf der Warenkorbseite selbst nur Warenkorb=>hinzufügen(oder wie man das schreibt), und das bleibt dann natürlich immer gleich. Aber die Ausgabe ist immer noch dasselbe Problem! Wenn ich den Warenkorb anzeige, brauche ich ja eine SQl-Abfrage in der Warenorb Datei,

            eben nicht! - Das soll ja eben vermieden werden. Ich werde dir nachfolgend mal ein kleines pseudo-Beispiel dazu machen.

            ist eigentlich egal wo die steht, denn für das generieren einer Tabelle in einer Schleife brauche ich dann immer die speziellen Felder $warenkorb["preis"] und da kann ich Output und Funktionalität schon wieder nicht trennen, oder gibt es auch bei der html-Ausgabe eine Möglichkeit, das mit einer, vielleicht einer eigenen Klasse zu trennen? Aber wie?

            Wäre möglich, würd ich aber nicht empfehlen. Die Klassen-methoden würden sich etwa auf folgende beschränken:

            new
            output_start (z. B. titel oder links ausgeben)
            output_items (alle warenkorbinhalte ausgeben; ruft für jeden inhalt
            output_item auf)
            output_item (gibt den Inhalt eines Warenkorb-items aus z. B. "article_id: 15" oder "Anzahl: 17", "Preis: 30 EUR")
            output_end (z. B. "falls sie noch fragen haben: ...")

            Aber vielleicht habe ich ja noch ein allgemeinerers Verständnis-Problem mit OOP ;-)
            Hm. Vielleicht können wir das ja beheben; ich liebe (und das musste ich auch zuerst lernen) nämlich OOP ;)

            Naja, anscheinend kannst Du immer genau das, was ich gerade können will, sehr lustig ;-) Aber vielen Dank für Deine Antworten, lese ich immer sehr gerne, und das kommt letzte Zeit sehr oft vor!

            Wohl wahr. Ich muss zugeben, dass mich deine Probleme auch immer interessieren (weil ich immer eine Antwort darauf weiss???) ;)

            Aber vielleicht nochma, zurück zu Eunsatzmöglichkeiten von Klassen, am Beispiel des Onlineshops, z.B. habe ich eine Produktseite, Wo bestimmte Daten zu einem Produkt ausgelesen und angezeigt werden, udn dazu eine Tabelle mit allen möglichen Varrianten, Preisen... ich würde jetzt einfach drauflos programmieren, hätte immer einzelnde Schleifen... im ode stehem für die Tabellen... siehst Du bei sowas auch irgendwie eine Möglichhkeit Klassen zu verwenden?  Wie ist das, Klassen zu kombinieren, hatte ich mal von gehört, aber nicht nicht wirklich verstanden :-)

            so, jetzt rück ich mal mit einem Beispiel heraus:

            Klasse User:
             - new (das nennt man den Konstruktor)
             - getName
             - getCart (gibt eine Instanz der Klasse Cart zurück)

            Klasse Cart:
             - new
             - getCartItems (gibt eine Instanz der Klasse CartItems zurück)
             - getUser (gibt die Parent-Klasse (also User) zurück)
             - getTotalPrice (iteriert über alle CartItems und berechnet den gesamtpreis)

            Klasse CartItems:
             - new
             - getLength (wieviele Items haben wir denn im Warenkorb?)
             - item( $i ) (gibt die Instanz der Klasse CartItem zurück, welche auf CartItemID $i zeigt [wahrscheinlich hast du in der Datenbank eine ID für jedes Warenkorbelement (CartItem) ] )

            Klasse CartItem:
             - new
             - getArticle
             - getCount (Anzahl bestellter Artikel)
             - getPrice

            Klasse Article:
             - new
             - getArticleID (eg. 17-9845-03)
             - getName (eg. "Sony CD-R, 700MB, grün")

            So, nun zum Hauptprogramm:

            print "<h1> Ihr Warenkorb </h1>";

            $user = new User( $UserID );
            $cart = $user->getCart;
            $cartitems = $cart->getCartItems;
            for ( $i=0; $i < $cartitems->getLength; $i++ ) {
               $cartitem = $cartitems->item( $i );
               print "Artikelname: " . $cartitem->getArticle->getName;
               print "Bestellnummer: " . $cartitem->getArticle->getArticleID;
               print "Anzahl: " . $cartitem->getCount;
               print "Preis: " . $cartitem->getPrice;
            }

            print "Totalpreis: " . $cart->getTotalPrice;

            jetzt zur Methode getTotalPrice der Klasse Cart:

            sub getTotalPrice {
               my ($self) = @_;   # sorry, ist eben Perl, $self o. ä
               # gibt's auch in php (evtl. heisst das dort $this)

            $cartitems = $self->getCartItems;
               $tot_price = 0;
               for ( $i=0; $i < $cartitems->getLength; $i++ ) {
                  $item = $cartitems->item( $i );
                  $tot_price += $item->getPrice;
               }
               return $tot_price;
            }

            Und jetzt sag mir, wo du je einen SQL-query gesehen hast? - du brauchst ihn lediglich für die Methoden, welche irgendwelche Daten aus der Datenbank lesen (z. B. getPrice oder getArticleID). Alles andere ist vollständig über Klassen/Methoden gemacht. Vorteil??? - Nun, das Interface dieser Methoden ist sehr allgemein gehalten und wird wohl in jeder Warenkorb-Umsetzung etwa das selbe sein (und das wird's auch noch in 1000 Jahren), aber dein Datenbankschema könnte wechseln, ja, du könntest sogar entscheiden nun ganz auf eine mysql-Datenbank zu verzichten und lieber alles in XML zu speichern. Das ist keine Problem, du musst einfach einige Methoden ändern, alles andere (z. B. eben die Hauptdateien zum Anzeigen des Warenkorbes), gleibt _genau_ gleich. Du musst dich beim Umstieg auf XML _kein bisschen_ um die GUI Programme kümmern (da du alle Daten über die Klassen holst).
            Das meinte ich mit dem Trennen von Ausgabe und Funktionalität und hier liegt der Vorteil der OOP Programmierung...

            Ich hoffe, dass du verstanden hast, worum es mir geht und wo ich die Vorteile des schönen OOP-Programmierens sehe...

            Viele Grüsse

            Philipp

  2. Hallo!

    Ich überlege, wie ich in Zukunft DB-Verbindungen etwas einfacher einbinden, und vor allem SQL-Abfragen einfacher verwenden kann, unter anderem auch automatisch die MySQL Fehler ausgebe.

    Das hört sich nach einer Klasse an. Ich kann Dir gern meine zusenden. Herr Prof. Dr. php Koehntopp hatte mal einen guten Artikel im Linux Magzin, auf die beruht die.

    http://www.kombinat-laugks.de/selfhtml/mysql.inc.php.txt

    $db = new db_mysql;
    $sql = "SELECT spalte FROM tabelle";
    $db->query($sql);

    while($db->fkt_fetch())
      {
         echo $db->fetch["spalte"];
      }

    $db2 = new db_mysql;
    $sql2 = "INSERT INTO tabelle (spalte) VALUES ('xyz')";
    $db2->query($sql2);

    Du legst mit new Kopien an und kannst parallel auf verschiedene Connections zugreifen.

    mysql_close() fehlt in der Klasse.

    MfG, André Laugks

    1. Hallo!

      http://www.kombinat-laugks.de/selfhtml/mysql.inc.php.txt

      ja, das sieht nicht schlecht aus! Ich dachte halt erstmal an eine Funktion, um mal zu sehen, wie man das überhaupt vereinfachen  kan, was man in eine Funktion auslagern kann, und was man dann doch immer wieder selbst schreiben muß. Was mich an der Version etwas stört, Du mußt ja doch ne ganze Menge bei einer SQL-Query schreiben, oder?

      $db = new db_mysql;
      $sql = "SELECT spalte FROM tabelle";
      $db->query($sql);

      while($db->fkt_fetch())

      und das kann man so schreiben, ohne Argument in der Funktion?

      {
           echo $db->fetch["spalte"];
        }

      Das doofe ist, bei mir überschneiden sich so Abfragen manchmal, dann bekomme ich probleme, wenn ich das immer gleich nenne($db->fetch["spalte"];)!

      Könnte man das alles nicht noch in einer Funktion sql() packen, und das ganze auf sql("SELECT spalte FROM tabelle") beschränken?

      $db2 = new db_mysql;
      $sql2 = "INSERT INTO tabelle (spalte) VALUES ('xyz')";
      $db2->query($sql2);

      Du legst mit new Kopien an und kannst parallel auf verschiedene Connections zugreifen.

      mysql_close() fehlt in der Klasse.

      Braucht man das denn? Am Ende des Scriptes wird die doch eh gewschlossen, oder?

      Jedenfalls vielen Dank!

      Grüße
      Andreas

      1. Hallo!

        Was mich an der Version etwas stört, Du mußt ja doch ne ganze Menge bei einer SQL-Query schreiben, oder?

        Du kannst die Funktionen nach Deinem belieben umbauen.

        $db = new db_mysql;
        $sql = "SELECT spalte FROM tabelle";
        $db->query($sql);

        while($db->fkt_fetch())
        und das kann man so schreiben, ohne Argument in der Funktion?

        Ja!

        {
             echo $db->fetch["spalte"];
          }

        Das doofe ist, bei mir überschneiden sich so Abfragen manchmal, dann bekomme ich probleme, wenn ich das immer gleich nenne($db->fetch["spalte"];)!

        Siehst Du, und dazu ist die Klasse gut. Du macht immer eine "Kopie" der Klasse bzw. der Funktionen. Du verwendest immer die selben Funktionen und kannst paralell mit ihnen arbeiten, ohne das es Überschneidungen gibt.

        $db = new db_mysql;
        $nochwas = new db_mysql,
        $usw = new db_mysql;

        Auf die Kopie greifst Du mit der Variable zu.

        Könnte man das alles nicht noch in einer Funktion sql() packen, und das ganze auf sql("SELECT spalte FROM tabelle") beschränken?

        Du kannst query() gern sql() nennen, mußt es eben in der Klasse ändern. Du kannst Dir innerhalb der Klasse Dir die Funktionen nach belieben zusammen bauen.

        mysql_close() fehlt in der Klasse.
        Braucht man das denn? Am Ende des Scriptes wird die doch eh gewschlossen, oder?

        PHP schließt alle automatisch. Wollte es nur erwähnen.

        MfG, André Laugks

        1. Hallo!

          Was mich an der Version etwas stört, Du mußt ja doch ne ganze Menge bei einer SQL-Query schreiben, oder?

          Du kannst die Funktionen nach Deinem belieben umbauen.

          Naja, aber es bleibt ja dabei, dass ich erst die neue Klasse initialisieren muß, oder? Und das ist mir auch noch nicht ganz klar:

          $db = new db_mysql;

          brauche ich das nur einmal, wenn ich während der Gesamten Datei nur auf eine DSB zugreife, kann man das nicht irgendwie automatisieren? Ich brauche immer nur die eine DB. Aber bei der nächsten Abfrage auf diese DB brauche ich das nicht mehr zu machen, oder doch?

          $sql = "SELECT spalte FROM tabelle";

          OK, da komme ich wohl nicht drum rum ;-)

          $db->query($sql);

          Aber alles in allem ist das zusammen auch nicht so viel einfacher, als die MySQL Funktionen direkt, oder?

          Siehst Du, und dazu ist die Klasse gut. Du macht immer eine "Kopie" der Klasse bzw. der Funktionen. Du verwendest immer die selben Funktionen und kannst paralell mit ihnen arbeiten, ohne das es Überschneidungen gibt.

          OK, das sehe ich ein, aber IMHO der einzige Vorteil gegenüber einer eingebundenen Datei nur mit Funktionen, ohne Klasse drum herum, oder?

          $db = new db_mysql;
          $nochwas = new db_mysql,
          $usw = new db_mysql;

          Auf die Kopie greifst Du mit der Variable zu.

          Also doch nur die eine DB, und immer wenn ich in SQL eine neue MySQL-query() losschicken würde, brauche ich eine neue Klasse, oder Instanz, oder wie auch immer, richtig?

          Du kannst query() gern sql() nennen, mußt es eben in der Klasse ändern. Du kannst Dir innerhalb der Klasse Dir die Funktionen nach belieben zusammen bauen.

          Das ist mir klar ;-) Ich meinte, ob ich sowas wie:

          function sql($sql){
            $db = new db_mysql;
            $db->query($sql);
          }

          sql("SELECT spalte FROM tabelle");

          weißt Du was ich meine? Das dann nochmal so. Also dann aus dem Code die Funktion aufrufen, und daraus die Klasse. Oder ist das Quatsch?

          Viele Grüße
          Andreas

          1. Hallo!

            Naja, aber es bleibt ja dabei, dass ich erst die neue Klasse initialisieren muß, oder? Und das ist mir auch noch nicht ganz klar:

            Ein wenig Schreibarbeit bleibt immer.

            $db->query($sql);
            Aber alles in allem ist das zusammen auch nicht so viel einfacher, als die MySQL Funktionen direkt, oder?

            Sehe ich anders.

            Auf die Kopie greifst Du mit der Variable zu.
            Also doch nur die eine DB, und immer wenn ich in SQL eine neue MySQL-query() losschicken würde, brauche ich eine neue Klasse, oder Instanz, oder wie auch immer, richtig?

            Wenn Du was abarbeitest nicht. Möchtest Du aber parallel Ergebnisse verarbeiten, kommt Du mit einer Funktion in Schwierigkeiten.

            function sql($sql){
              $db = new db_mysql;
              $db->query($sql);
            }

            sql("SELECT spalte FROM tabelle");

            weißt Du was ich meine? Das dann nochmal so. Also dann aus dem Code die Funktion aufrufen, und daraus die Klasse. Oder ist das Quatsch?

            So überschreibst Du die Variable $db bei jedem Aufruf der Funktion und somit die Instanz/Kopie.

            MfG, André Laugks

            1. Hi!

              So überschreibst Du die Variable $db bei jedem Aufruf der Funktion und somit die Instanz/Kopie.

              Ah! ich glaube so langsam habe ich verstanden! Vor allem auch durch Philipps Beispiel. Ich mache einfach mal, so ganz in der Theorie ist das immer schwer vorzustellen zu bewerten!

              Grüße
                -- Andreas