Michael Vogel: MySQL und PHP3, ist das wirklich so umstaendlich?

Moin!

Ich baue zur Zeit gerade eine MySQL-Datenbank auf, auf die ich mit Hilfe von PHP3 zugreifen moechte. Klappt auch eigentlich schon, aber gibt es wirklich keine bessere Moeglichkeit, als mit Hilfe der Funktionen auf die Felder zuzugreifen?

Kann man die nicht auch direkt abfragen? So in der Art "tabelle->feld"? Wie gross ist der Performance-Unterschied zwischen der Feldabfrage mit Feldnummer zu Feldname?

Wird eigentlich der Server stark belastet? Das ist ein 486DX4/100, 16mb HS, 700mb HD.

  1. hi!

    Ich baue zur Zeit gerade eine MySQL-Datenbank auf, auf die ich mit Hilfe von PHP3
    zugreifen moechte. Klappt auch eigentlich schon, aber gibt es wirklich keine bessere
    Moeglichkeit, als mit Hilfe der Funktionen auf die Felder zuzugreifen?

    Nein. Du musst nunmal die SQL-Schnittstelle verwenden, um mit der Datenbank zu kommunizieren, und das funktioniert, indem man eine SELECT-Anweisung abschickt und die Ergebnisse zurückgeliefert bekommt.
    Und genau das ist auch der beste Weg, um auf eine relationale Datenbank zuzugreifen, sonst hätte er sich ja nicht durchgesetzt.

    bye, Frank!

    1. hi!

      Ich baue zur Zeit gerade eine MySQL-Datenbank auf, auf die ich mit Hilfe von PHP3
      zugreifen moechte. Klappt auch eigentlich schon, aber gibt es wirklich keine bessere
      Moeglichkeit, als mit Hilfe der Funktionen auf die Felder zuzugreifen?

      Nein. Du musst nunmal die SQL-Schnittstelle verwenden, um mit der Datenbank zu kommunizieren, und das funktioniert, indem man eine SELECT-Anweisung abschickt und die Ergebnisse zurückgeliefert bekommt.
      Und genau das ist auch der beste Weg, um auf eine relationale Datenbank zuzugreifen, sonst hätte er sich ja nicht durchgesetzt.

      Neee, das meinte ich nicht. Ich meinte ja, wie ich am sinnvollsten auf die Ergebnismenge zugreife, _nachdem_ ich den Select gemacht habe. Da habe ich halt nur die Funktionen gefunden, nix anderes.

      Am schönsten wäre es halt, wenn die einzelnen Felder auf Variablen gemappt wären...

      1. hi!

        Am schönsten wäre es halt, wenn die einzelnen Felder auf Variablen gemappt wären...

        Dann verwende doch mysql_fetch_array. Damit erhälst du aus einer Zeile zwar nicht direkt Variablen, aber immerhin ein assoziatives Array...
        Falls du von einem zweidimensionalen Array sprichst, weiß ich zwar nicht, ob und wie das in PHP3 möglich ist, aber eine entsprechende Funktion sollte nicht mehr als ein paar wenige Zeilen haben.

        bye, Frank!

      2. Neee, das meinte ich nicht. Ich meinte ja, wie ich am sinnvollsten auf die Ergebnismenge zugreife, _nachdem_ ich den Select gemacht habe. Da habe ich halt nur die Funktionen gefunden, nix anderes.
        Am schönsten wäre es halt, wenn die einzelnen Felder auf Variablen gemappt wären...

        Werden sie ja auch - aber ggf. nicht so, wie Du Dir das vorstellst.

        Bei meiner Oracle-Datenbank -nur zum Vergleich - lese ich Daten mit einem C-Programm mit embedded SQL-Anweisungen.
        Das Zugriffskonzept dabei ist ein sogenannter cursor, aus dem man pro Zugriff mit einer "fetch"-Funktion einen oder mehrere Datensätze herausholen kann. Ist der cursor "skalar", dann holt man einzelne Datensätze, bis es nicht mehr geht; ist er vektoriell, dann holt man mit einem Zugriff gleich eine ganze Menge von Datensätzen (und erhält einen speziellen Fehlercode, wenn der letzte Cursor nicht mehr voll war, und die Angabe, wie voll er war), die man dann in einer Schleife abarbeiten kann.

        Syntaktisch sieht das (ungefähr, genaue Syntax habe ich nicht im Kopf) so aus:
        a) statisch definieren:
           define cursor testcursor as
           select a, b, c
           from table_name
           into :hostvar_a, :hostvar_b, :hostvar_c;
        b) abholen:
           fetch from testcursor;
        Danach stehen entsprechend viele Werte in den Variablen hostvar_a bis hostvar_c (den Doppelpunkt braucht nur der SQL-Präprozessor, um Client- und Servernamen zu unterscheiden), und die kann ich normal bearbeiten.

        Große Cursor brauchen natürlich mehr Speicherplatz, aber sie machen die Sache *viel* schneller, weil nicht für jeden Datensatz die ganze SQL-Interpretation durchlaufen werden muß.
        Ich hatte mal aus einer Tabelle mit 15 Mio. Datensätzen möglichst schnell viele Teilmengen zu je ca. 5000 Stück herauszuholen, und durch einen Cursor der Größe 500 Einträge wurde die Sache um Faktor 7 schneller.

        1. Syntaktisch sieht das (ungefähr, genaue Syntax habe ich nicht im Kopf) so aus:
          a) statisch definieren:

          »»    define cursor testcursor as
          »»    select a, b, c
          »»    from table_name
          »»    into :hostvar_a, :hostvar_b, :hostvar_c;

          b) abholen:

          »»    fetch from testcursor;

          Danach stehen entsprechend viele Werte in den Variablen hostvar_a bis hostvar_c (den Doppelpunkt braucht nur der SQL-Präprozessor, um Client- und Servernamen zu unterscheiden), und die kann ich normal bearbeiten.

          Bei C, aber doch wohl nicht bei PHP3, oder?

          1. Danach stehen entsprechend viele Werte in den Variablen hostvar_a bis hostvar_c (den Doppelpunkt braucht nur der SQL-Präprozessor, um Client- und Servernamen zu unterscheiden), und die kann ich normal bearbeiten.

            Bei C, aber doch wohl nicht bei PHP3, oder?

            Klar, bei Pro*C und Oracle.
            Ich wollte damit ja auch nur zeigen, wie man ein mapping zwischen einer 4GL-Sprache wie SQL und einer 3GL-Sprache wie C machen *kann*.

            Auch bei Oracle und C gibt es parallel dazu eine reine Funktions-API, mit der man irgendwie auf die Datenbank zugreifen könnte. Aber das Einbinden von SQL-Anweisungen (die durch den Pro*C-Präprozessor dann in irgendwelche Funktionsaufrufe konvertiert werden) liest sich natürlich wesentlich besser.

            Es gibt meistens mehr als einen Weg ... nicht nur in Perl ...