这是用户登录的代码行,用户通过其用户名登录。我想以这样的方式编辑它,它允许用户从电子邮件ID或用户名登录。我认为我们将不得不使用两个名称,但语法不正确。告诉你这样做的方法。
if (isset($_POST["user_login"]) && isset($_POST["password_login"])) {
$user_login = preg_replace('#[^A-ZA-z0-9]#i', '',$_POST["user_login"]); //filter everything but numbers and letters
$password_login = preg_replace('#[^A-ZA-z0-9]#i', '',$_POST["password_login"]);//filter everything but number and letter
$password_login_md5 = md5($password_login);
$sql = mysql_query("SELECT id FROM users WHERE username='$user_login' AND password='$password_login_md5'LIMIT 1");//query whether user exists
//Check for their existence
$userCount = mysql_num_rows($sql);//Count the number of rows entered
if ($userCount ==1){
while ($row =mysql_fetch_array($sql)) {
$id = $row["id"];
}
$_SESSION["id"] = $id;
$_SESSION["user_login"] = $user_login;
$_SESSION["password_login"] = $password_login;
header("location: welcome.php");
exit();
}else {
echo 'Information is incorrect, try again';
exit();
}
}
?>
<div style="width: 800px; margin: 0px auto 0px auto;">
<table>
<tr>
<td width="60%" valign="top">
<form action="index.php" method="POST">
<input type="text" name="user_login" size="25" placeholder="Username"><br>
<input type="password" name="password_login" size="47" placeholder="Password"><br><br>
<input type="submit" name="login" value="Login">
</form>
</td>
答案 0 :(得分:2)
你真的应该在后端/处理页面上处理这种类型的检查。
一个简单的检查,例如下面的准示例,就像它可以得到的一样简单:(显然需要额外的安全验证)
if(filter_var($_POST["user_login"], FILTER_VALIDATE_EMAIL)) {
$sql_prepare = 'SELECT id FROM users WHERE email = ? AND password = ? LIMIT 1';
}
else {
$sql_prepare = 'SELECT id FROM users WHERE username = ? AND password = ? LIMIT 1';
}
但是,这真的很容易解决你的问题。
答案 1 :(得分:0)
您只需要根据用户输入的用户名输入创建不同的查询。
if (!filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
// is email
$sql = mysql_query("SELECT id FROM users WHERE email='$user_login' AND password='$password_login_md5'LIMIT 1");//query whether user exists
} else {
// not email
$sql = mysql_query("SELECT id FROM users WHERE username ='$user_login' AND password='$password_login_md5'LIMIT 1");//query whether user exists
}
答案 2 :(得分:0)
您希望将SQL更改为此类似的内容。它将比较匹配的电子邮件和用户名字段。
$sql = "SELECT id FROM users WHERE (username='$user_login' OR email='$user_login') AND password='$password_login_md5' LIMIT 1";
您还应该考虑使用PDO代替mysql_*
函数,并考虑使用哈希密码而不是md5()
。
答案 3 :(得分:0)
您可以使用filter_var
功能进行一点检查以进行电子邮件验证。如果函数返回false
,那么它肯定不会是有效的电子邮件。基于此,您可以稍微修改您的查询,如下面的代码:
function is_email($str) {
return filter_var($str, FILTER_VALIDATE_EMAIL);
}
if(is_email($user_login)) {
$sql = mysql_query("SELECT id FROM users WHERE email ='{$user_login}' AND password = '{$password_login_md5}' LIMIT 1");
} else {
$sql = mysql_query("SELECT id FROM users WHERE username = '{$user_login}' AND password = '{$password_login_md5}' LIMIT 1");
}
为了避免让您感到困惑,我只是通过更改现有代码中的一些内容来发布整个代码:
function is_email($str) {
return filter_var($str, FILTER_VALIDATE_EMAIL);
}
if(isset($_POST["user_login"]) && isset($_POST["password_login"])) {
$user_login = preg_replace('#[^A-ZA-z0-9]#i', '', $_POST["user_login"]); //filter everything but numbers and letters
$password_login = preg_replace('#[^A-ZA-z0-9]#i', '',$_POST["password_login"]); //filter everything but number and letter
$password_login_md5 = md5($password_login);
if(is_email($user_login)) {
$sql = mysql_query("SELECT id FROM users WHERE email ='{$user_login}' AND password = '{$password_login_md5}' LIMIT 1");
} else {
$sql = mysql_query("SELECT id FROM users WHERE username = '{$user_login}' AND password = '{$password_login_md5}' LIMIT 1");
}
$userCount = mysql_num_rows($sql); //Count the number of rows entered
if($userCount ==1) {
while ($row =mysql_fetch_array($sql)) {
$id = $row["id"];
}
$_SESSION["id"] = $id;
$_SESSION["user_login"] = $user_login;
$_SESSION["password_login"] = $password_login;
header("location: welcome.php");
exit();
} else {
echo 'Information is incorrect, try again';
exit();
}
}
此外,我想提醒您注意一些代码。
$user_login
的正则表达式,因为您只允许使用数字和字母。这不接受电子邮件格式。您还可以传递#[^A-ZA-z0-9@_.]#i
这样的正则表达式,以接受其他几个字符,例如@
,_
,.
等等,如果您要将输入限制为仅允许字符。mysql
扩展程序。使用mysqli
或PDO
。mysqli
或PDO
中使用预准备语句以避免SQL注入攻击。希望它有所帮助!