Sie haben den Nagel auf den Kopf getroffen: Was Sie tun möchten, ist SELECT userid FROM users WHERE username='$username'
. Probieren Sie es aus - es wird funktionieren :)
SELECT *
ist fast immer eine schlechte Idee; Es ist viel besser, die Namen der Spalten anzugeben, die MySQL zurückgeben soll. Natürlich müssen Sie mysql_fetch_assoc
oder etwas Ähnliches verwenden, um die Daten tatsächlich in eine PHP-Variable zu bringen, aber zumindest spart dies MySQL den Aufwand, alle diese Spalten zu versenden, die Sie sowieso nicht verwenden.
Alternativ können Sie stattdessen die neuere mysqli-Bibliothek oder das PDO verwenden. Diese sind auch viel effizienter als die alte mysql-Bibliothek, die veraltet ist.
Der "übliche" Weg besteht darin, nur die Spalten auszuwählen, die Sie benötigen.
Jede Spalte, die Teil der Auswahl ist und nicht benötigt wird, verlangsamt den Abruf. Teilweise aufgrund des Netzwerkverkehrs und teilweise weil die Datenbank-Engine bestimmte Optimierungen anwenden kann, wenn nur einige Spalten ausgewählt sind.
Und select *
ist im Produktionscode normalerweise verpönt.
Ihre Anfrage ist korrekt:
%Vor% Dies funktioniert wenn es richtig gemacht wird . Beachten Sie, dass $username
korrekt mit mysql_real_escape_string
maskiert werden muss. Ich würde empfehlen, parametrisierte Abfragen zu betrachten, um das Risiko einer Unverwundbarkeit der SQL-Injection zu verringern.
Eine andere Sache, die Sie ändern können, ist mysql_result
anstelle Ihrer Schleife:
Dies setzt voraus, dass Sie wissen, dass Sie nur eine Zeile erhalten.
Sie können nicht nur, aber Sie sollten. Leider haben zu viele junge Entwickler die Angewohnheit, viel zu viele Daten auszuwählen. Sobald Sie Ihre Abfrage ausführen, müssen Sie keine While-Schleife mehr ausführen, da nur ein Datensatz zurückkommt. Verwenden Sie stattdessen einfach Folgendes:
%Vor% Der zweite Parameter von mysql_result()
ist der Zeilenindex, den Sie abrufen möchten. 0 ist zuerst.
Ja, das ist eine großartige Optimierungspraxis!
Wenn Sie noch einen Schritt weiter gehen und es superoptimiert machen möchten, fügen Sie ein LIMIT hinzu, etwa so: $query=mysql_query("SELECT userid FROM users WHERE username='$username' LIMIT 1");
Dies setzt natürlich voraus, dass Sie erwarten, dass nur eine Benutzer-ID zurückgegeben wird und die Datenbank-Engine stoppt, sobald sie gefunden wird.
Aber das Wichtigste: IMMER ESCAPE / SANITIEREN SIE IHRE EINGABEDATEN ! (kann das nicht genug betonen)
Sie können dies mit einer einzigen Codezeile tun
%Vor%Sie müssen eine Verbindung zur Datenbank wie unten gezeigt herstellen, bevor Sie diese verwenden
%Vor%Dank an @samuel t thomas