dedlfix: "mysql_num_rows"-Warning

Beitrag lesen

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!