Tomas: Datenprüfung mit MySQL oder mit PHP durchführen?

Hallo zusammen,

Ich schreibe gerade ein Login-System in PHP. Die Daten werden in einer MySQL-Datenbank gespeichert. Aktuell geht es um das Angemeldet-bleiben durch Cookies.

Die Cookies übertragen die Daten Benutzer-Nr, Passwort-Hash und anderes.

Mir ist nun aufgefallen, dass ich entweder direkt in der MySQL-Abfrage prüfen kann, ob die Daten korrekt sind (WHERE mit Benutzer-Nr und PW-Hash).

Andererseits könnte ich aber auch alle Daten anhand der Benutzer-Nr. abfragen und dann mit PHP auf ihre Korrektheit überprüfen.

Zu ebachten ist eventuell auch noch, dass bei der PHP-Abfrage bereits ein paar WHERE-Klauseln existieren.

Was wäre hier sinnvoller bzw. effizienter?

Hoffe auf Aufklärung :-)
Gruß, Tomas

  1. Andererseits könnte ich aber auch alle Daten anhand der Benutzer-Nr. abfragen und dann mit PHP auf ihre Korrektheit überprüfen.

    Dann muesstest Du Dir die Daten aller Benutzer ausgeben lassen, obwohl alle bis auf evtl einen voellig uninteressant sind. Das ist extrem ineffizient, pruef lieber gleich in der Datenbank.

    Gruss
    der Bademeister

    1. Andererseits könnte ich aber auch alle Daten anhand der Benutzer-Nr. abfragen und dann mit PHP auf ihre Korrektheit überprüfen.

      Dann muesstest Du Dir die Daten aller Benutzer ausgeben lassen, obwohl alle bis auf evtl einen voellig uninteressant sind. Das ist extrem ineffizient, pruef lieber gleich in der Datenbank.

      Hallo,

      da habe ich wohl zu eifrig getippt! Ich meinte, ich frage den Datensatz des Benutzers mit dessen Nummer ab und überprüfe die restlichen Daten wie Passwort und IP.

      Danke derweil, Tomas

      1. da habe ich wohl zu eifrig getippt! Ich meinte, ich frage den Datensatz des Benutzers mit dessen Nummer ab und überprüfe die restlichen Daten wie Passwort und IP.

        kannst du doch - select userid from usertabelle where user = username, password = passwordhash, ip = ip usw

        1. Hallo,

          kannst du doch - select userid from usertabelle where user = username, password = passwordhash, ip = ip usw

          Dass ich das kann ist mir bekannt, danke. Ich frage mich ja nur, ob das auslesen aus der Datenbank mit anschließender Prüfung durch PHP besser oder schlechter ist, als eine Abfrage mit Zahlreichen WHERE-Bedingungen, die diese Prüfung übernehmen.

          Ich muss dabei ja bedenken, dass es eine Prüfung ist, die zig Mal (aufgrund hoher Benutzerzahl) durchgeführt wird.

          Gruß, Tomas

          1. Ich muss dabei ja bedenken, dass es eine Prüfung ist, die zig Mal (aufgrund hoher Benutzerzahl) durchgeführt wird.

            das sagte mein vorredner bereits

            warum 1000 benutzerdatensätze auslesen und vergleichen wenn man nur einen braucht?

            wenn du jetzt 1000 besucher hast, musst du anstatt 1000 datensätze 1000000 auslesen - genau aus dem grund ist die vergleichsmöglichkeit mit der datenbank  in diesem fall die schnellere

            wenn du hingegen sowieso alle daten benötigst, musst du testen was schneller ist

            aber wie gesagt, es ist absurd die ganze sau zu schlachten, wenn du nur eine stelze brauchst

          2. Mahlzeit Tomas,

            kannst du doch - select userid from usertabelle where user = username, password = passwordhash, ip = ip usw

            Dass ich das kann ist mir bekannt, danke. Ich frage mich ja nur, ob das auslesen aus der Datenbank mit anschließender Prüfung durch PHP besser oder schlechter ist, als eine Abfrage mit Zahlreichen WHERE-Bedingungen, die diese Prüfung übernehmen.

            Schlechter. Ein Datenbanksystem ist doch genau dafür da: gezielt bestimmte Daten anhand verschiedener Kriterien aus einer unübersichtlich großen Mente herauszusuchen. Was willst Du denn? Du willst doch entweder genau einen Datensatz (nämlich den des angemeldeten Benutzers) oder keinen (wenn die Daten nicht stimmen. Wieso also u.U. viele heraussuchen und dann "von Hand" nachprüfen?

            Ich muss dabei ja bedenken, dass es eine Prüfung ist, die zig Mal (aufgrund hoher Benutzerzahl) durchgeführt wird.

            Ja und? Wenn Dein DBMS das nicht kann, hast Du einen Fehler gemacht: entweder bei der Auswahl desselben oder beim Aufbau Deiner Tabellenstruktur (inkl. Indizes usw.).

            MfG,
            EKKi

            --
            sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
            1. Hallo,,

              Ich muss dabei ja bedenken, dass es eine Prüfung ist, die zig Mal (aufgrund hoher Benutzerzahl) durchgeführt wird.

              Hier besteht das Verständnisproblem für euch liebe Helfer. Aus der Datenbank kommt so oder so immer nur ein Datensatz. Die Frage ist, ob es besser wäre, das was geprüft werden muss (bei diesem einen Datensatz) durch die Abfrage oder durch PHP durchführen zu lassen.

              Gruß, Tomas

              1. Hallo,

                Die Frage ist, ob es besser wäre, das was geprüft werden muss (bei diesem einen Datensatz) durch die Abfrage oder durch PHP durchführen zu lassen.

                was hast Du gemessen?

                Freundliche Grüße

                Vinzenz

                1. Hallo,

                  was hast Du gemessen?

                  ich bin momentan nicht in der Lage, selbst zu messen, daher hatte ich auf Erfahrungswerte gehofft.

                  Gruß, Tomas

                  1. Hallo

                    ich bin momentan nicht in der Lage, selbst zu messen, daher hatte ich auf Erfahrungswerte gehofft.

                    und warum stellst Du bei Mikrooptimierung die Performancefrage?

                    Bei Deiner Abfrage *muss* das Drumherum, Verbindungsaufbau, ... viel aufwendiger sein als das Durchführen der Abfrage. Weitere Kriterien, die aus maximal einem Datensatz die Anzahl auf Null reduzieren, können nicht viel kosten. Es kann ja nur nur noch ein Datensatz geprüft werden. Ist die Anzahl der Datensätze bereits Null, dann werden weitere Prüfungen gar nicht mehr durchgeführt.

                    Aus programmiertechnischer Sicht halte ich es - genau wie es Dir EKKi bereits gesagt hat - für sinnvoll, die Kriterien an *einer* Stelle zu bündeln.

                    Wenn Deine Anwendung den Anforderungen nicht genügend sollte, dann prüfe, wo der Flaschenhals vorliegt - und beseitige zunächst genau diesen.

                    Freundliche Grüße

                    Vinzenz

              2. echo $begrüßung;

                Aus der Datenbank kommt so oder so immer nur ein Datensatz.

                Nein, wenn nicht mal der Username gefunden wurde, kommt auch schon mal eine leere Menge zurück.

                Die Frage ist, ob es besser wäre, das was geprüft werden muss (bei diesem einen Datensatz) durch die Abfrage oder durch PHP durchführen zu lassen.

                Gesucht werden muss der Datensatz vom DBMS auf alle Fälle. Ein Kriterium mehr oder weniger spielt dabei keine Bratsche. Wenn du die Prüfung durch das DBMS machen lässt und dabei kein übereinstimmender Datensatz gefunden wurde, bekommst du eine leere Ergebnismenge. Darauf musst du ja sowieso am Client prüfen. Du kannst dir dann weitere Prüfungen und Verarbeitungen sparen.

                echo "$verabschiedung $name";

                1. Hallo,

                  Nein, wenn nicht mal der Username gefunden wurde, kommt auch schon mal eine leere Menge zurück.

                  Ich frag nach der ID ab, aber macht nichts, dank dir und Vinzenz hab ich jetzt meinen Problempunkt gefunden und ausgemerzt. Dankeschön.

                  Freundliche Grüße, Tomas