Heim >Backend-Entwicklung >PHP-Tutorial >E-Mail- oder Benutzername-Login

E-Mail- oder Benutzername-Login

WBOY
WBOYOriginal
2016-09-22 08:56:481533Durchsuche

Ich würde gerne fragen. Ich habe Felder namens E-Mail und Passwort

<code>$email = $_POST['email'];
$password = $_POST['password'];
$login     = mysql_query("SELECT * FROM `users`
JOIN `users_profile` USING (id)
WHERE `email` = '".$email."' AND `password` = '".$password."' 
OR `username` = '".$email."' AND `password` = '".$password."'
</code>

Das Obige ist meine Anmeldesyntax
Angenommen, der Benutzer gibt das E-Mail- oder Passwortpaar ein, ist die Anmeldung erfolgreich:

<code>`email` = '".$email."' AND `password` = '".$password."' 
</code>

Aber wenn der Benutzer den richtigen Benutzernamen und das richtige Passwort eingibt, kann er sich trotzdem anmelden

<code>`username` = '".$email."' AND `password` = '".$password."'
</code>

Es ist nur so, dass die obige Syntax nur zum Anmelden per E-Mail und Passwort verwendet werden kann
Wenn Sie sich mit Benutzername und Passwort anmelden, schlägt die Anmeldung fehl
Bestätigen Sie das JOIN-Benutzerprofil und verwenden Sie die ID problemlos
Was ist das Problem?

Antwortinhalt:

Ich würde gerne fragen. Ich habe Felder namens E-Mail und Passwort

<code>$email = $_POST['email'];
$password = $_POST['password'];
$login     = mysql_query("SELECT * FROM `users`
JOIN `users_profile` USING (id)
WHERE `email` = '".$email."' AND `password` = '".$password."' 
OR `username` = '".$email."' AND `password` = '".$password."'
</code>

Das Obige ist meine Anmeldesyntax
Angenommen, der Benutzer gibt das E-Mail- oder Passwortpaar ein, ist die Anmeldung erfolgreich:

<code>`email` = '".$email."' AND `password` = '".$password."' 
</code>

Aber wenn der Benutzer den richtigen Benutzernamen und das richtige Passwort eingibt, kann er sich trotzdem anmelden

<code>`username` = '".$email."' AND `password` = '".$password."'
</code>

Es ist nur so, dass die obige Syntax nur zum Anmelden per E-Mail und Passwort verwendet werden kann
Wenn Sie sich mit Benutzername und Passwort anmelden, schlägt die Anmeldung fehl
Bestätigen Sie das JOIN-Benutzerprofil und verwenden Sie die ID problemlos
Was ist das Problem?

Achten Sie darauf, Klammern hinzuzufügen, wenn Sie OR verwenden.

<code class="sql">SELECT * FROM `users`
JOIN `users_profile` USING (id)
WHERE (`email` = '".$email."' AND `password` = '".$password."') 
OR (`username` = '".$email."' AND `password` = '".$password."')</code>

Es wird jedoch nicht empfohlen, ein solches SQL zu verwenden.

Sie können zunächst reguläre Ausdrücke im Code verwenden, um festzustellen, ob der Benutzer eine E-Mail-Adresse oder einen Benutzernamen eingibt. Wenn es sich um eine E-Mail handelt, verwenden Sie das E-Mail-Feld zur Abfrage, andernfalls verwenden Sie das Benutzernamensfeld.

Referenz: http://tool.oschina.net/regex#

Zuallererst Ihr Code kann problemlos mit SQL injiziert werden , also verwenden Sie bitte zumindest mysqli, ich persönlich empfehle PDO wärmstens.

Dann gehe ich persönlich davon aus, dass das Formular auf der Startseite eine Eingabe ähnlich dieser hat:

<code><input name="login" type="text" class="form-control" placeholder="用户名或者邮箱"></code>

Wir verwenden hier name="login", um email oder username zu ersetzen, dann:

<code>$field = filter_var($_POST['login'],FILTER_VALIDATE_EMAIL) ? 'email':'username';
// 这里的 $field 就是你的 欄位 (这边翻译为 字段 )</code>

Dann sieht die SQL-Anweisung wahrscheinlich so aus:

<code>$email = $_POST['email'];
WHERE `".$field."` = '".$email."'</code>

Wieder einmal ist die Art, wie du schreibst, sehr gefährlich.

Informationsreferenz: http://php.net/manual/en/func...

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn