Tortilla Chip: "mysql_num_rows"-Warning

Hi an alle Experten =)

Also ich suche nun schon lange nach der Lösung meines Problems, aber ich komme einfach nicht dahinter.

Ich habe folgenden PHP-Code:

  
$verbindung = mysql_connect("localhost", "NAME", "PASSWORT") or die ("Keine Verbindung möglich. Benutzername oder Passwort sind falsch");  
mysql_select_db("DATENBANKNAME") or die ("Die Datenbank existiert nicht.");  
  
$abfrage = mysql_query("SELECT id FROM benutzer WHERE Email LIKE '$emailInput'");  
$ergebnis = mysql_num_rows($abfrage); //Hier ist der Fehler?  
  
if($ergebnis == 0)  
{  
   echo "Benutzer kann mit dieser Email-Adresse angelegt werden.";  
   //...  
}  
else  
{  
   ///...  
}  

Bei der Ausführung bekomme ich immer folgenen Error/Warning:
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in ...*.php on line 67

Kann mir dabei jemand von Euch helfen?
lg Tortilla Chip

  1. Moin!

    $sql='SELECT id FROM benutzer WHERE Email LIKE "'.mysql_real_escape_string($emailInput, $verbindung).'"';  
    $result = mysql_query($sql, $verbindung) or die (mysql_error($verbindung)."<pre>".$sql);  
      
    if(0==mysql_num_rows($result)) {  
       echo "Benutzer kann mit dieser Email-Adresse angelegt werden.";  
    }
    

    Noch besser:

    $sql='SELECT COUNT(`id`) FROM `benutzer` WHERE `Email` LIKE "'.mysql_real_escape_string($emailInput, $verbindung).'"';  
    $result = mysql_query($sql, $verbindung) or die (mysql_error($verbindung)."<pre>".$sql);  
      
    $row=mysql_fetch_array($result, MYSQL_NUM);  
    if(0==$row[0]) {  
       echo "Benutzer kann mit dieser Email-Adresse angelegt werden.";  
    }
    

    1.)
    Der Hinweis, dass mysql_num_rows() eine Ergebnisset und keinen booleanschen Wert erwartet zeigt, dass ein solcher in $abfrage steht. Hier kommt nur "false" in Betracht - und false enthält dieser Wert nur, wenn die Abfrage zu einem Fehler führte. Prüfe also die tatsächlich übergebene Abfrage.

    2.)
    $abfrage enthält ein Ergebnis. Du benennst Dein Zeug verwirrend, also falsch.

    3.)
    Trenne den Aufbau der Abfrage und deren Ausführung, damit Du im Fehlerfall die gesamte Abfrage ausgeben kannst.

    4.)
    Was soll eigentlich das LIKE? LIKE wird verwendet, wenn der zu vergleichende Wert Platzhalter verwendet. Wolltest Du vielleicht:

      
    $sql='SELECT COUNT(`id`) FROM `benutzer` WHERE `Email` = "'.mysql_real_escape_string($emailInput, $verbindung).'"';
    

    5.)
    Wenn Du auf die Spalte email einen Unique-Index setzt, dann kannst Du direkt beim Eintrag prüfen, ob das funktioniert hat. Die Funktion mysql-errno($verbindung) gibt, wenn die Adresse bereits existiert, 1062 zurück.

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix

    1. Hi!

      $result = mysql_query($sql, $verbindung) or die (mysql_error($verbindung)."<pre>".$sql);

      Wenn Du auf die Spalte email einen Unique-Index setzt, dann kannst Du direkt beim Eintrag prüfen, ob das funktioniert hat. Die Funktion mysql-errno($verbindung) gibt, wenn die Adresse bereits existiert, 1062 zurück.

      Dann muss man aber eine ordentliche Fehlerbehandlung und kein Gnandenschuss-die() einbauen. - Bitte bring den Fehlerbehandlungsunwissenden nicht die die()-Methode bei, die ist Mist. Fehler können immer auftreten, auch wenn die Abfrage syntaktisch einwandfrei ist. Halbfertige Seiten mit einem technischen Fehlermeldungstext sollten Besucher nicht zu Gesicht bekommen.

      Lo!

      1. Moin!

        Dann muss man aber eine ordentliche Fehlerbehandlung und kein Gnandenschuss-die() einbauen.

        Eine bessere Fehlerbehandlung könnte man mal irgendwo unter einer URL veröffentlichen.
        Natürlich mit Berücksichtigung von

        • $bolIsFatal
        • $intDebugModus
        • $bolIsTestSystem (Ich mute Dir mal zu, dass Du erkennst, was da jeweils drin sein soll)

        dann könnte man immer schön schreiben

        $result=mysql_query($sql, $DB);
        if (false===$result) {
           sql_error('mysql', $DB, $bolIsFatal, $bolDebugModus, $bolIsTestSystem);
           # oder, hier auf jeden Fall lohnend, als Objekt
        }

        und die Funktion verlinken. Aber vermutlich würde dann gar niemand was lernen, jeder würde das kopieren und die Anfragen mit "verstehe gar nichts" würden noch häufiger. Tortillia ist ja schon bei "mysql_real_escape_string()" ausgestiegen.

        Fehler können immer auftreten, auch wenn die Abfrage syntaktisch einwandfrei ist.

        Immer? Im vorliegenden Kontext (einfache Abfrage) eher nicht.

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix

        1. Hi!

          Dann muss man aber eine ordentliche Fehlerbehandlung und kein Gnandenschuss-die() einbauen.

          Eine bessere Fehlerbehandlung könnte man mal irgendwo unter einer URL veröffentlichen.

          Ja, einen "Wie sucht man grundlegend Fehler"-Artikel, der dann auch einen "Robustes MySQL-Beispiel"-Abschnitt enthalten soll, hab ich mir schon lange vorgenommen zu schreiben.

          Natürlich mit Berücksichtigung von

          • $bolIsFatal

          Fatale Fehler sind üblicherweise so gravierend, dass das PHP-Script nicht fortgeführt werden kann. Fehler beim Mit-MySQL-Arbeiten lassen sich alle problemlos abfangen und das Script kann geordnet beendet werden.

          • $intDebugModus

          Der ist nebensächlich. Im Fehlersuch-Fall kann man sich schnell mal drei Kontrollausgaben einbauen. Für den laufenden Betrieb braucht man eher einen Logging- und Benachrichtigungsmechanismus.

          • $bolIsTestSystem (Ich mute Dir mal zu, dass Du erkennst, was da jeweils drin sein soll)

          Das kann sich jeder selbst einbauen, wenn er das benötigt.

          dann könnte man immer schön schreiben

          $result=mysql_query($sql, $DB);
          if (false===$result) {
             sql_error('mysql', $DB, $bolIsFatal, $bolDebugModus, $bolIsTestSystem);
             # oder, hier auf jeden Fall lohnend, als Objekt
          }

          und die Funktion verlinken. Aber vermutlich würde dann gar niemand was lernen, jeder würde das kopieren und die Anfragen mit "verstehe gar nichts" würden noch häufiger.

          Das würde vermutlich passieren, wenn du die Funktion schreibst, denn du neigst ja dazu, lieber fertigen Code auszuarbeiten, als den Weg zu beschreiben :-)

          Ich denke aber nicht, dass eine Universalfunktion für alle Anwendungsfälle genügt. Das wäre dann wie eine eierlegende Wollmilchsau - verspricht ideal zu sein, ist aber unmöglich herzustellen. Selbst wenn, hat man dann immer das Euter mit rumzuschleppen, auch wenn man nur die Wolle und ab und zu mal Eier braucht. Dann zeige ich lieber ein grundlegendes Beispiel oder ein Gerüst dessen und vielleicht noch den Spezialfall "absichtlicher Unique-Constraint-Fehler".

          Fehler können immer auftreten, auch wenn die Abfrage syntaktisch einwandfrei ist.
          Immer? Im vorliegenden Kontext (einfache Abfrage) eher nicht.

          Immer. Die Abfrage selbst ist bei sorgfältigem Erstellen üblicherweise nicht mehr das Problem, aber dem MySQL-Server kann jederzeit unpässlich werden. Selbst dann, wenn der Connect noch klappte, kann es sein, dass die Abfrage nicht mehr durchgeführt werden kann, weil just in dem Augenblick die Netzwerkverbindung gestört ist, das System in seinen Wartungsmodus geht (oder gegangen wird), oder oder oder. Der Gründe gibt es viele. Natürlich kann man, wenn das zu oft vorkommt, über einen Anbieterwechsel nachdenken, aber nicht mit ihnen rechnen sollte man nicht.

          Lo!

          1. Moin!

            Selbst dann, wenn der Connect noch klappte, kann es sein, dass die Abfrage nicht mehr durchgeführt werden kann

            Stimmt auch wieder. Seit mysql_pconnect kann der Zeitrahmen zwischen Verbindungsaufbau und Abfrage weitaus größer sein als bisher (maximal Scriptlaufzeit). Ohne das war einfach die Wahrscheinlichkeit eines solchen Abbruches wesentlich geringer (Skripte mit exorbitanten Laufzeiten oder Anforderungen an die Datenkonsistenz habe ich bisher nie bauen müssen).

            MFFG (Mit freundlich- friedfertigem Grinsen)

            fastix

          2. Hi nochmal an alle.

            Ich muss sagen ich bin beeindruckt. Fachlich, hilfreich und sehr schnell...was soll ich noch sagen.

            Ich werde mir auf jeden Fall die ganze MySQL-Thematik noch genauer anschaun, was ich jedoch sowiso vorgehabt hätte, da ich (wie ihr bestimmt gemerkt habt) noch ziemlich am Anfang stehe.
            Was mich dennoch verwirrt, ist das der Code den ich benutzen _wollte_ genau so (oder zumindest mit den selben Befehlen) in einem Tutorial steht, und ich mich an dem _orientiert_ (nicht abgeschrieben =] ) habe.

            Also dann...danke nochmals, ihr werdet bestimmt noch von mir hören.

            lg Tortilla

            1. Moin!

              Was mich dennoch verwirrt, ist das der Code den ich benutzen _wollte_ genau so (oder zumindest mit den selben Befehlen) in einem Tutorial steht, und ich mich an dem _orientiert_ (nicht abgeschrieben =] ) habe.

              Tutorials sind leider oft sehr einseitig zielorientiert. Ich habe immer wieder das Problem, dass in den Dingern Mist steht der zufällig (und nur für das genaue Beispiel mit den genauen Daten) funktioniert.

              Bei manchen Autoren, die pro Jahr zwei bis vier "Tausendseiter" produzieren, wundert mich aber nicht unbedingt.

              MFFG (Mit freundlich- friedfertigem Grinsen)

              fastix

            2. Mahlzeit Tortilla Chip,

              Ich werde mir auf jeden Fall die ganze MySQL-Thematik noch genauer anschaun, was ich jedoch sowiso vorgehabt hätte, da ich (wie ihr bestimmt gemerkt habt) noch ziemlich am Anfang stehe.

              Öhm ... ja. :-) Wenn Du wieder *konkrete* Fragen hast, stelle sie gern!

              Was mich dennoch verwirrt, ist das der Code den ich benutzen _wollte_ genau so (oder zumindest mit den selben Befehlen) in einem Tutorial steht, und ich mich an dem _orientiert_ (nicht abgeschrieben =] ) habe.

              Zustätzlich zu dem von fastix® Geschriebenen: wer hat behauptet, dass dieses nicht näher benannte Tutorial auch tatsächlich *gut* ist? Im Prinzip kann jeder Hans und Franz irgendwelche Tutorials und Anleitungen im Netz veröffentlichen - allein ihr Vorhandensein ist keine qualifizierte Aussage über deren Qualität.

              Du solltest *immer* *alles* kritisch hinterfragen ...

              MfG,
              EKKi

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

          Eine bessere Fehlerbehandlung könnte man mal irgendwo unter einer URL veröffentlichen.
          Natürlich mit Berücksichtigung von

          • $bolIsFatal
          • $intDebugModus
          • $bolIsTestSystem (Ich mute Dir mal zu, dass Du erkennst, was da jeweils drin sein soll)

          Was stellst Du Dir denn hier unter Fehlerbehandlung vor? Fehlerbehandlung ist kein technisches Standard-Gedöns, sondern Teil des individuellen Designs der Seite bzw. des Skriptes.

          Viele Grüße,
          der Bademeister

          1. Moin!

            • $bolIsFatal
            • $intDebugModus
            • $bolIsTestSystem (Ich mute Dir mal zu, dass Du erkennst, was da jeweils drin sein soll)

            Was stellst Du Dir denn hier unter Fehlerbehandlung vor? Fehlerbehandlung ist kein technisches Standard-Gedöns, sondern Teil des individuellen Designs der Seite bzw. des Skriptes.

            Ganz einfach gesagt: Daten rein und eine Möglichkeit auf immer die gleiche (und wiederverwendbare) Weise Daten herauszubekommen.

            $bolIsFatal entscheidet, ob das Skript überhaupt ("geordnet") beendet wird oder weiter läuft. Könnte ja sein, es wird nur auf ein Gimmik verzichtet. Individuell für jede Abfrage vom Programmierer zu setzen.
            $intDebugModus was wird wo ausgegeben? Individuell zu setzen vom Programmierer. Am besten in einer config - oder ini-Datei für das gesamte Projekt und überladbar für das einzelne Skript.
            $bolIsTestSystem - Überschreibt $intDebugModus: Auf Testsystem erfolgt immer vollständige Ausgabe (Fehlernummer, Fehlermeldung, sql) auf der Benutzeroberfläche (also im HTML oder in der Konsole). Zu setzen von der Maschine anhand der Umgebung. Selbstverfreilich können das auch Konstanten sein.

            MFFG (Mit freundlich- friedfertigem Grinsen)

            fastix

            1. Ganz einfach gesagt: Daten rein und eine Möglichkeit auf immer die gleiche (und wiederverwendbare) Weise Daten herauszubekommen.

              [...]

              Ok. Aber bei der Problematik, dass 'die()' keine gute Reaktion auf einen Fehler ist, geht es nicht (nur) darum, den Fehler zu protokollieren, sondern in erster Linie um Anwenderfreundlichkeit: Auf den Fehler *reagieren*.

              Ggf. sollten Usereingaben zwischengespeichert werden, wenn sie nicht unmittelbar verarbeitet werden können. Oder Formulare wiederum angeboten werden mit der Nachricht, dass die Verarbeitung nicht geklappt hat. Die Formular entweder leer oder vorbelegt mit den vorherigen Nutzereingaben. All das abhängig von Sicherheits- und Aktualitätsaspekten (sind Passwörter im Spiel, Tocttou...).

              Abgesehen davon kann es sein, dass das Skript noch tausend andere Dinge treibt, die sich nicht darum scheren, ob an einer Stelle eine Datenbankabfrage klappt oder nicht.

              Das sind doch alles Dinge, die eine allgemeine Fehlerbehandlungsklasse nicht weissen und leisten kann. Und wenn man wirklich das Skript abbrechen will, dann kann man wenigstens noch so nett sein, eine vollständige HTML-Seite rauszugeben, in der ne Nachricht steht, was los ist. Und diese Nachricht ist nicht die mysql-Fehlermeldung. Die geht den User nämlich nix an.

              Viele Grüße,
              der Bademeister

        3. Moin!

          Eine bessere Fehlerbehandlung könnte man mal irgendwo unter einer URL veröffentlichen.
          Natürlich mit Berücksichtigung von

          • $bolIsFatal
          • $intDebugModus
          • $bolIsTestSystem (Ich mute Dir mal zu, dass Du erkennst, was da jeweils drin sein soll)

          Kein schönes Konzept.

          dann könnte man immer schön schreiben

          $result=mysql_query($sql, $DB);
          if (false===$result) {
             sql_error('mysql', $DB, $bolIsFatal, $bolDebugModus, $bolIsTestSystem);
             # oder, hier auf jeden Fall lohnend, als Objekt
          }

          Für die Behandlung von Fehlerfällen hat die objektorientierte Welt die Exception erfunden. Die eignet sich sehr gut für einige der von dir angerissenen Aspekte, und auch ohne Objekte - wenngleich das an dieser Stelle bereits deutliche Vorteile versprechen würde.

          $bolIsFatal - Exception werfen und nicht fangen. Oder fangen und zum geordneten Skriptabbruch laufen lassen.

          $intDebugModus - Logging-Level, oder wie? Wäre Aufgabe im Logger, der angesteuert wird von u.a. gefangenen Exceptions.

          $bolIsTestSystem - eher nicht, sowas steckt in der Grundsatzkonfiguration des genutzten Servers. Oder welche Auswirkungen stellst du dir da vor?

          Dass sql_error() zusätzlich zu den ganzen notwenigen Informationen auch jedesmal noch die gewählte global gültige Konfiguration übergeben kriegen soll, reduziert die Anwendbarkeit dieser Funktion nochmals deutlich. Sowas holt man sich, wenn schon, dann innerhalb dieser Funktion von den relevanten Stellen ab.

          und die Funktion verlinken. Aber vermutlich würde dann gar niemand was lernen, jeder würde das kopieren und die Anfragen mit "verstehe gar nichts" würden noch häufiger. Tortillia ist ja schon bei "mysql_real_escape_string()" ausgestiegen.

          Und allein schon diese Diskussion über den "richtigen"[TM] Weg der Fehlerbehandlung beweist, dass dein Ansatz alles andere als praktikabel ist. Es gibt keine Universalfunktion dafür - jede Lösung hat sich in die existierenden Umgebung einzufügen, ohne als Fremdkörper zu wirken. Aber gerade bei solchen individuell programmierten Skripten von Leuten eher mittelmäßiger Wissensbasis wirst du mit so einem pauschalen Ansatz keinen Erfolg haben können.

          Oder kräftigen Supportaufwand, weil diese Lösung so viele Fragen aufwirft und nirgends "einfach funktioniert".

          - Sven Rautenberg

    2. Hi danke für die schnell und vor allem lehrreiche Antwort.
      Also zu 2.)

      $abfrage enthält ein Ergebnis. Du benennst Dein Zeug verwirrend, also falsch.

      ...tut mir leid, da muss beim zusammenkopieren etwas schiefgegangen sein. Ist natürlich Schwachsinn.

      Hier nun nochmal der Code, den ich nun Verwende:

        
      $abfrage = "SELECT id FROM benutzer WHERE Email = 'emailInput'";  
      $ergebnis = mysql_query($abfrage);  
        
      if(mysql_num_rows($ergebnis) == 0)  
      {  
         //Ausgabe  
      }  
      
      

      $sql='SELECT id FROM benutzer WHERE Email LIKE "'.mysql_real_escape_string($emailInput, $verbindung).'"';

      ...ich verstehe nicht warum ich das so "kompliziert" machen muss und meine Methode nicht möglich ist.

      Zu 1.)
      ...ist hinfällig, da $abfrage michs mit mysql_num_rows(...) zu tun hat.

      Zu 3.)

      Trenne den Aufbau der Abfrage und deren Ausführung, damit Du im Fehlerfall die gesamte Abfrage ausgeben kannst.

      ...ok danke werde ich von nun an so machen.

      Zu 4.)

      Was soll eigentlich das LIKE? LIKE wird verwendet, wenn der zu vergleichende Wert Platzhalter verwendet.

      ...ich dachte "LIKE" ist gleichzusetzen mit "=" und "NOT LIKE" mit "!=", was du mit Platzhalter meinst ist mir jedoch nicht klar.

      Und weils mir schon wieder aufgefallen ist, jeder verwendet andere (keine Ahnung wie man die allgemein nennt) "Stricherl". --> Worin liegt der Unterschied bei der Verwendung von "   '   `  . Mir kommt vor das die jeder anders verwendet. (Und bitte nicht allzu kompliziert erklären wenn möglich ;) )

      btw: Mein Code geht noch immer nicht... =)

      lg Tortilla Chip

      1. Moin!

        $sql='SELECT id FROM benutzer WHERE Email LIKE "'.mysql_real_escape_string($emailInput, $verbindung).'"';
        ...ich verstehe nicht warum ich das so "kompliziert" machen muss und meine Methode nicht möglich ist.

        Möglich ja. Aber mit der Gefahr verbunden, dass es dann eben auch möglich ist, statt eine Mailadresse etwas in die Datenbank einzutragen oder auf Deiner Webseite auszugeben, was Du gewiss nicht willst. Und die Mailadresse stammt hier von außen, ist also eine Eingabe, die Du nicht kennst, gilt damit "tainted".

        ...ich dachte "LIKE" ist gleichzusetzen mit "=" und "NOT LIKE" mit "!=", was du mit Platzhalter meinst ist mir jedoch nicht klar.

        Mit LIKE "%a%" bekommst Du alle Strings zurück, die ein "a" enthalten.
        Mit LIKE "a%" bekommst Du alle Strings zurück, die mit "a" beginnen.
        Mit LIKE "%a" bekommst Du alle Strings zurück, die mit "a" enden.
        Das %-Zeichen ist der Platzhalter.

        Es geht nicht um "Geht oder geht nicht", es geht um Performance beim Programmieren, Debuggen und Ausführen. Jeder, der den Code mit LIKE sieht sucht nach dem %-Zeichen. Und... versuche mal einen String mit dem Prozentzeichen zu finden wenn Du Like verwendest. Das darfst Du dann maskieren...

        Worin liegt der Unterschied bei der Verwendung von "   '   `

        Backticks [`] um Namen (Datenbanken, Tabellen, Spalten)
        Einfache Quotas ['],  und doppelte ["] haben prinzipiell den gleichen Verwendungszweck: Es sind Stringbegrenzer. Dabei können diese in vielen Programmiersprachen "überkreuz" verwendet werden und sparen so das Maskieren:

        'a' liefert a
        "a" liefert a
        '"a"' liefert 'a'
        "'a'" liefert "a"
        ""a"" - liefert "a" - in Sprachen, in denen der Backslash als Maskierungszeichen verwendet wird.
        ''a'' - liefert 'a'
        '"a'" - Fehler
        "'a"' - Fehler

        In einigen Programmierspachen gibt es einen wesentlichen Unterschied zwischen einfachen und doppelten Quotas. Folgendes funktioniert mindestens in PHP und Perl mit kleinen Abweichungen (ohne die Dollar-Symbole bei der Wertzuweisung) auch in einem sh- oder bash-Skript:

        $a = 'Hallo ';
        $b = 'Welt!';

        echo "$a$b";

        Hallo Welt!

        (Die Werte werden ausgegeben)

        echo '$a$b';

        $a$b

        (Die Variablennamen werden ausgegeben)

        Verstanden?

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix

        1. Sorry.

          '"a"' liefert "a"
          "'a'" liefert 'a'

          MFFG (Mit freundlich- friedfertigem Grinsen)

          fastix

      2. Hi!

        $sql='SELECT id FROM benutzer WHERE Email LIKE "'.mysql_real_escape_string($emailInput, $verbindung).'"';
        ...ich verstehe nicht warum ich das so "kompliziert" machen muss und meine Methode nicht möglich ist.

        Das ist nicht kompliziert sondern richtig. Diesen Kontextwechsel nicht zu beachten und Werte einfach so einzufügen, ist einer der häufigsten Programmierfehler.

        Was soll eigentlich das LIKE? LIKE wird verwendet, wenn der zu vergleichende Wert Platzhalter verwendet.
        ...ich dachte "LIKE" ist gleichzusetzen mit "=" und "NOT LIKE" mit "!=", was du mit Platzhalter meinst ist mir jedoch nicht klar.

        Mit = wird ein genauer Vergleich durchgeführt. LIKE wertet die Platzhalter % und _ aus. Platzhalter werden auch Jokerzeichen genannt. Anstelle eines _ kann ein beliebiges anderes und anstelle von % beliebig viele andere Zeichen stehen. WHERE feld LIKE 'a%' wählt alles aus, was mit a beginnt (üblicherweise auch mit A, wenn du Groß-Kleinschreibung nicht explizit beachten lässt).

        Und weils mir schon wieder aufgefallen ist, jeder verwendet andere (keine Ahnung wie man die allgemein nennt) "Stricherl".

        Der Fachbegriff lautet Quotes, oder zu deutsch Anführungszeichen.

        Worin liegt der Unterschied bei der Verwendung von "   '   `  . Mir kommt vor das die jeder anders verwendet. (Und bitte nicht allzu kompliziert erklären wenn möglich ;) )

        Standard-SQL verwendet '' zum Kennzeichnen von Stringliteralen. MySQL gestattet außerdem auch "" dafür. Für Bezeichner (z.B. Feld- und Tabellennamen) definiert MySQL die Backticks ``. Du kannst also "" und '' unter MySQL nach Belieben verwenden. Wenn du dich eher an den Standard halten willst, nimm die ''. Zudem kommt, dass das SQL-Statement auch unter PHP als Stringliteral notiert wird, weswegen ebenfalls Anführungszeichen benötigt werden. Damit hast du nun im SQL-Statement-String-Literal weitere String-Literale, welche beide zu quotieren (mit Anführungszeichen einzurahmen) sind, und dann können auch noch Anführungszeichen als Datenbestandteil auftauchen. Das muss man sorgfältig schachteln und beachten. Der bereits verlinkte Kontextwechsel-Artikel sollte Aufklärung bringen.

        btw: Mein Code geht noch immer nicht... =)

        Dann musst du Fehlersuche betreiben. Die mysql_*()-Funktionen geben im Fehlerfall ein false zurück und keine Ressourcenkennung. Eine solche wird aber von der nachfolgenden mysql_*()-Funktion benötigt. Mit einem false können sie nichts anfangen. Und es wäre auch sinnlos, bei einem Fehler einfach fortzufahren, als ob nichts geschehen wäre. Deswegen solltest du die Rückgabewerte auswerten und nur im Gut-Fall zum nächsten Schritt übergehen. Das von fastix gezeigte "or die(...)" ist die schnellste aber zugleich unschönste Art. - Wenn du in den Urlaub fahren willst, der Veranstalter aber aus irgendeinem Grund die Reise nicht durchführen kann, nimmst du dir sicher nicht das Leben. Die im Urlaub geplanten Erlebnisse sind zwar alle ausgefallen, aber dein Leben geht weiter bis zu seinem natürlichen Ende. So der Idealfall. - Tom hat in seiner Anwort gezeigt, wie es prinzipiell besser geht. In deinem Fall solltest du aber auch dein Konzept grundlegend ändern. Ein Webserver ist ein Multi-User- und Multi-Task-System. Anfragen werden bunt durcheinander beantwortet und immer wieder unterbrochen, weil andere zur selben Zeit laufende Requests ebenfalls bearbeitet werden wollen. Deswegen fragt man _nicht_ erst die Datenhaltung, ob ein bestimmter Zustand gegeben ist und ändert daraufhin in einem zweiten Schritt die Daten, sondern man versucht gleich die Änderung vorzunehmen und lässt das System die Einhaltung bestimmter Bedingungen überwachen. Den Fehlerfall fängt man ab und weiß dadurch, dass der Zustand schon gegeben ist. Konkret geht das so: Du setzt einen Unique-Index auf das Email-Feld. Der sorgt dafür, dass keine Email doppelt auftreten kann. Neue Benutzer werden einfach eingefügt. Gab es keine Fehler ist alles in Ordnung. Gab es einen Unique-Constraint-Fehler, war diese Email schon vorhanden. Gab es einen anderen Fehler, dann war der unerwartet und deine Ersatzreaktion muss ausgeführt werden (User vertrösten, gegebenenfalls alternativen Weg zum Ziel anbieten - Fehler loggen und vom Admin auswerten lassen).

        Lo!

        1. Moin!

          Die mysql_*()-Funktionen geben im Fehlerfall ein false zurück und keine Ressourcenkennung.

          Oh ja. Das habe ich zwar auch gewusst, aber _jetzt_ war es _die_ Antwort auf eine Frage, die ich im Hinterkopf hatte und immer mit einem fatalistischen "ist so" beantwortet habe. Nämlich die, warum manche Funktionen die Datenbankverbindungskennung und manche das Resultset als Parameter erwarten. Ich habe mich da nämlich schon manches Mal sehr geärgert (in meiner Logik gehört z.B. der Fehler, aber auch mysql_affected_rows() (genau wie mysql_num_rows()) oder mysql_info() zur Abfrage und damit zum Resultat).

          [x] Diese Frage ist jetzt geklärt.

          Jetzt wundere ich mich noch mehr, warum das ganze "MySQL-Funktions-Theater" nicht in ein schickes Objekt verpackt wurde.

          MFFG (Mit freundlich- friedfertigem Grinsen)

          fastix

          1. Hi!

            Die mysql_*()-Funktionen geben im Fehlerfall ein false zurück und keine Ressourcenkennung.

            Der Satz passt übrigens genaugenommen nicht auf alle, sondern nur auf einge der am häufigsten verwendeten. Aber gut, dass du heute nicht zum Krümelerzeugen aufgelegt bist :-)

            warum manche Funktionen die Datenbankverbindungskennung und manche das Resultset als Parameter erwarten.

            Naja, kommt ja immer darauf an, was die Funktionen so für Aufgaben haben. Manche arbeiten eben mit einem Resultset, andere brauchen eine Verbindung. Und pro Verbindung kann man ja durchaus mehrere Resultsets haben.

            Jetzt wundere ich mich noch mehr, warum das ganze "MySQL-Funktions-Theater" nicht in ein schickes Objekt verpackt wurde.

            Gibt es doch in der mysqli-Extension und PDO existiert ebenfalls. Allerdings gibt es die nicht als Eine-Klasse-Gebilde, weil auch hier wieder zwischen verbindungsorientierten und resultset-orientierten Aufgaben getrennt werden muss.

            Lo!

            1. Moin!

              Aber gut, dass du heute nicht zum Krümelerzeugen aufgelegt bist :-)

              Bin ich schon. Habe mich aber an einem dankbareren Korinthenkacker ausreichend verlustiert.

              Und dann tatsächlich das hier gelesen.

              MFFG (Mit freundlich- friedfertigem Grinsen)

              fastix

  2. Hello,

    $verbindung = mysql_connect("localhost", "NAME", "PASSWORT") or die ("Keine Verbindung möglich. Benutzername oder Passwort sind falsch");
    mysql_select_db("DATENBANKNAME") or die ("Die Datenbank existiert nicht.");

    $abfrage = mysql_query("SELECT id FROM benutzer WHERE Email LIKE '$emailInput'");

    if ($abfrage)
    {
      $ergebnis = mysql_num_rows($abfrage);
      //Hier ist der Fehler?
      ## nein. der ist schon eine Zeile früher gemacht worden, als Du den
      ## Erfolg des Querys nicht abgefragt hast

    if($ergebnis == 0)
      {
         echo "Benutzer kann mit dieser Email-Adresse angelegt werden.";

    //...
    }
    else
    {
       ///...
    }

    }
    else
    {
       ## Fehlerbehandlung für das Query.
       ## mysql_error($verbindung) auswerten
       ## Logbuch schreiben
       ## und für den User eine benutzertaugliche Meldug anzeigen
       ## entwieder die Abfrage wiederholen oder ihm einen
       ## Rücklink anbieten zu einer passenden Seite
    }

      
      
      
    Liebe Grüße aus dem schönen Oberharz  
      
      
    Tom vom Berg  
    ![](http://selfhtml.bitworks.de/Virencheck.gif)  
      
    
    -- 
     ☻\_  
    /▌  
    / \ Nur selber lernen macht schlau  
    <http://bergpost.annerschbarrich.de>
    
    1. Hi!

      $ergebnis = mysql_num_rows($abfrage);
        if($ergebnis == 0)
        {
           echo "Benutzer kann mit dieser Email-Adresse angelegt werden.";

      Du hast doch hier im Forum den Beinamen Mister Tocttou :-) also solltest du wenigstens dazuschreiben, dass man das nicht so sondern mit einem Unique-Index löst. (Oder unterließest du das, weil's der fastix schon schrub?)

      Lo!

      1. Hello,

        $ergebnis = mysql_num_rows($abfrage);
          if($ergebnis == 0)
          {
             echo "Benutzer kann mit dieser Email-Adresse angelegt werden.";

        Du hast doch hier im Forum den Beinamen Mister Tocttou :-)

        Ach!

        also solltest du wenigstens dazuschreiben, dass man das nicht so sondern mit einem Unique-Index löst. (Oder unterließest du das, weil's der fastix schon schrub?)

        Das habe ich in dem Moment gar nicht bewertet, weil ich mich nur um die vergessene Fehlerstatusabfrage gesorgt habe. :-)

        Du hast aber Recht. Nicht nur die Umsetzung, sondern auch das Konzept ist falsch.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de