对输入类型使用多个名称

时间:2016-12-21 18:18:35

标签: php html

这是用户登录的代码行,用户通过其用户名登录。我想以这样的方式编辑它,它允许用户从电子邮件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>

4 个答案:

答案 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();
    }
}

此外,我想提醒您注意一些代码。

  1. 删除$user_login的正则表达式,因为您只允许使用数字和字母。这不接受电子邮件格式。您还可以传递#[^A-ZA-z0-9@_.]#i这样的正则表达式,以接受其他几个字符,例如@_.等等,如果您要将输入限制为仅允许字符。
  2. 避免使用已弃用的mysql扩展程序。使用mysqliPDO
  3. mysqliPDO中使用预准备语句以避免SQL注入攻击。
  4. 希望它有所帮助!