Linda: mysql_affected_rows oder mysql_num_rows

Hallo zusammen,

ich schreibe gerade eine Funktion in PHP5, die die Datenbankabfragen gegen MySQL5 ausführt. Wenn ich ein SELECT-Statement absetze, dann liefert diese mir das Ergebnis sowie Anzahl der gefundenen Datensätze. Wenn es allerdings UPDATE oder DELETE ist, dann brauche ich die Anzahl der betroffenen Datensätze.

Also muss ich abhängig von der Art der Abfrage entweder mysql_num_rows oder mysql_affected_rows verwenden. Bloß, wie erkenne ich in der Funktion um welche Art der Abfrage es sich handelt? Wenn ich es vorher nicht weiß, dann kriege ich ja zu recht den berühmten "invalid mysql resource" Fehler.

Gruß, Linda

--
2 hours of try and error can save 10 minutes of manual reading
  1. Hallo,

    ich schreibe gerade eine Funktion in PHP5, die die Datenbankabfragen gegen MySQL5 ausführt.
    [...]
    Bloß, wie erkenne ich in der Funktion um welche Art der Abfrage es sich handelt?

    Warum weißt Du nicht, welche Art von Abfrage Du absetzt?

    lg
    Martin Dunst

    --
    Do what I say, not what I do.
    --Tim Berners-Lee
    1. Hallo Martin,

      Warum weißt Du nicht, welche Art von Abfrage Du absetzt?

      Weil ich eine "perfekte" Funktion schreibe, die es selbst wissen muss :) Nein, im Ernst, ich möchte eine Funktion haben, die alle Abfragen händelt ohne dass ich vorher über Parameter oder ähnliches sagen muss, ob es sich um SELECT oder UPDATE handelt und daher die Frage.

      Gruß,
      Linda

      1. Warum weißt Du nicht, welche Art von Abfrage Du absetzt?

        Weil ich eine "perfekte" Funktion schreibe, die es selbst wissen muss :) Nein, im Ernst, ich möchte eine Funktion haben, die alle Abfragen händelt ohne dass ich vorher über Parameter oder ähnliches sagen muss, ob es sich um SELECT oder UPDATE handelt und daher die Frage.

        Eine Funktion, die etwas macht, von dem man nicht weiss was sie macht ist keine perfekte Funktion im Sinne der IT.

        Ist es vielleicht so, dass irgendwo SQL-Code erfasst wird, der einfach nur ausgeführt wird und dass man gerne Rückgabewerte vom Datenserver hätte?

        1. Hallo _King,

          Eine Funktion, die etwas macht, von dem man nicht weiss was sie macht ist keine perfekte Funktion im Sinne der IT.

          Nein. So nicht. Ich schreibe eine Funktion, die das macht, was ich von ihr erwarte. Ich weiß sehr wohl, was ich machen müsste, jetzt will es ihr auch beibringen. Es soll halt eine intelligente Funktion werden.

          Ist es vielleicht so, dass irgendwo SQL-Code erfasst wird, der einfach nur ausgeführt wird und dass man gerne Rückgabewerte vom Datenserver hätte?

          So ist es. Die SQL-Abfrage wird grundsätzlich an diese Funktion übergeben. Und natürlich erwarte ich die Rückgabewerte, ansonsten wüsste ich nicht warum ich es machen sollte :)

          Gruß, Linda

          --
          2 hours of try and error can save 10 minutes of manual reading
          1. OK, Du machst Dein mysql_query() und siehe hier:

            http://de3.php.net/manual/de/function.mysql-query.php

            "Nur für SELECT, EXPLAIN, SHOW oder DESCRIBE Anweisungen liefert mysql_query() eine Ressourcen-Kennung oder FALSE, falls die Anfrage nicht korrekt ausgeführt wurde. Für alle anderen SQL Anweisungen ist der Rückgabewert von mysql_query() im Erfolgsfall TRUE, im Fehlerfall FALSE. Ein Rückgabewert ungleich FALSE bedeutet, dass die Anfrage gültig war und vom Server ausgeführt werden konnte."

            machst eine kleine Fallunterscheidung:
            FALSE => Error
            TRUE => war kein SELECT
            "Ressourcen-Kennung" = war SELECT

            1. Hallo _King,

              super, genau das. Vielen lieben Dank und gute Nacht!

              Gruß, Linda

              --
              2 hours of try and error can save 10 minutes of manual reading
              1. yo,

                super, genau das. Vielen lieben Dank und gute Nacht!

                ich würde eher nach dem ersten Schlüsselwort deiner übergegeben sql anweisung in der funktion suchen lassen, anstelle erst eine datenbank operation durchzuführen und dann zu entscheiden. das erzeugt unnötigen traffic.

                Ilja

                1. echo $begrüßung;

                  ich würde eher nach dem ersten Schlüsselwort deiner übergegeben sql anweisung in der funktion suchen lassen, anstelle erst eine datenbank operation durchzuführen und dann zu entscheiden. das erzeugt unnötigen traffic.

                  Die Abfrage muss doch sowieso abgesetzt werden. Erst danach kann man ja in die Verlegenheit kommen, num_rows von affected_rows unterscheiden zu müssen.

                  Und wenn dann später auch noch Stored Procedures dazukommen sollen, die bei gleichem Schlüsselwort beides zurückliefern können, dann funktioniert diese Schlüsselwortunterscheidung nicht mehr.

                  echo "$verabschiedung $name";

                  1. yo,

                    stimmt, die sql-anweisung muss so oder so abgeschickt werden. aber wenn ich weiß, ob es dml anweisung war oder eine abfrage, dann kann ich gleich die richtige funktion (num_rows, affected_rows) verwenden.

                    das mit den stored procedures erscheint mir ein wenig komplexer zu sein.  es kann ja nicht nur eine DML und eine abfrage durch die sp ausgeführt werden, sondern mehrere. und dann würden bei späterer verwendung der num_rows und affacted_rows funktionen nur die jeweils letzte anweisung angezeigt werden.

                    Ilja

                  2. Und wenn dann später auch noch Stored Procedures dazukommen sollen, die bei gleichem Schlüsselwort beides zurückliefern können, dann funktioniert diese Schlüsselwortunterscheidung nicht mehr.

                    Ja, was macht man denn da unter PHP? (U.a. mit Perl und MS SQL Server ist das alles übrigens kein Problem.)

  2. echo $begrüßung;

    Also muss ich abhängig von der Art der Abfrage entweder mysql_num_rows oder mysql_affected_rows verwenden. Bloß, wie erkenne ich in der Funktion um welche Art der Abfrage es sich handelt? Wenn ich es vorher nicht weiß, dann kriege ich ja zu recht den berühmten "invalid mysql resource" Fehler.

    Den bekommst du nur dann, wenn du blind das Ergebnis einer Funktion an eine andere weitergibst, ohne es vorher zu prüfen.

    Ich halte die Idee einer Superfunktion nicht für besonders praktisch.
    Beispielsweise eine Abfrage mit Ergebnismenge: Du gibst an den aufrufenden Programmteil nur die Anzahl der Datensätze weiter, wie kommt man dann an die eigentlichen Datensätze? Warum ist die Information der Größe des Ergebnisses nicht an das Ergebnis-Objekt/-Array gebunden bzw. dort abfragbar? Falls dies überhaupt interessiert, denn hauptsächlich will man doch die Datensätze. Zum reinen Zählen gibt es effektivere Methoden (COUNT()).

    ich schreibe gerade eine Funktion in PHP5, die die Datenbankabfragen gegen MySQL5 ausführt. Wenn ich ein SELECT-Statement absetze, dann liefert diese mir das Ergebnis sowie Anzahl der gefundenen Datensätze. Wenn es allerdings UPDATE oder DELETE ist, dann brauche ich die Anzahl der betroffenen Datensätze.

    Was machst du bei INSERT? Das kannst du nicht mittels True/False/Ressource von einem UPDATE unterscheiden. Da wird die Anzahl der betroffenen Datensätze meist 1 sein, was relativ uninteressant ist, da sich Erfolg oder Misserfolg am Rückgabewert der Query-Funktion ablesen lässt. Interessanter für die Anwendung wäre wahrscheinlich die ID des eben eingefügten Datensatzes.

    Warum soll die Anwendung eine recht unwichtige statistische Information zurückbekommen anstatt des eigentlich interessierenden Ergebnisses?

    Wenn du eine Datenbank-Abstraktion schreibst, sowas gibt es schon, ist auch in PHP5 enthalten und nennt sich z.B. PDO.

    Ich nehme an, dass du den Teil der Geschäftslogik (=der eigentliche Sinn eines Programms) deiner Anwendung mit dem Zusammenbau der SQL-Befehle durchsetzt hast. Deine Superfunktion kapselt dann recht wenig. Warum muss sich die Anwendung darum kümmern, wie die SQL-Statements zusammengebaut werden? Warum muss sie überhaupt Wissen über die Quelle und Details der Abfrage haben?

    Schreib dir doch lieber Funktionen, die jeweils speziell eine der benötigen Datenbankhandlungen kapseln, Parameter entgegennehmen, die noch keinen direkten Bezug zur eigentlichen Datenhaltung benötigen, und die ein Ergebnis zurückliefern, das für die jeweilige Aufgabe am sinnvollsten ist.

    echo "$verabschiedung $name";