如何使用MySQL数据库中的凭据对用户进行身份验证

时间:2015-09-01 01:22:55

标签: php html mysql authentication

在我的表单页面上,我有两个名为namepassword的文本框。

当用户点击提交时,它会将该数据发送到名为' name'的MySQL数据库中的两列中。和密码'。

记录数据后(这是我理解并且不需要帮助的部分),我希望用户进入登录页面并键入他/她的姓名和密码,如果数据库中已存在名称和密码数据(我不明白的部分),则允许进入网站。

我会使用以下查询:

SELECT * FROM tablename WHERE name & password = "'$_POST[name]', $_POST[password]'

4 个答案:

答案 0 :(得分:2)

您应该使用AND&&而不是单个&符号(&),并将要绑定的变量与其列名相对应。

在将变量用于查询之前,还应考虑清理变量。您可以使用*_real_escape_string()来阻止SQL injections

$name = mysql_real_escape_string($_POST["name"]);
$password = mysql_real_escape_string($_POST["password"]);

"SELECT * FROM tablename WHERE name = '".$name."' AND password = '".$password."'"

但我能给你的最好建议是使用prepared statement而不是deprecated mysql_*

if($stmt = $con->prepare("SELECT * FROM tablename WHERE name = ? AND password = ?")){ /* PREPARE THE QUERY; $con SHOULD BE ESTABLISHED FIRST USING ALSO mysqli */
  $stmt->bind_param("ss",$_POST["name"],$_POST["password"]); /* BIND THESE VARIABLES TO YOUR QUERY; s STANDS FOR STRINGS */
  $stmt->execute(); /* EXECUTE THE QUERY */
  $noofrows = $stmt->num_rows; /* STORE THE NUMBER OF ROW RESULTS */
  $stmt->close();  /* CLOSE THE STATEMENT */
} /* CLOSE THE PREPARED STATEMENT */

为了保护密码,您还可以查看password_hash()

答案 1 :(得分:1)

始终使用准备好的声明来执行来自代码外部的变量的SQL代码。将用户输入的变量连接到SQL代码是危险的(考虑SQL注入),您可以将预备语句mysqliPDO一起使用(推荐)。

Mysqli示例:

$mysqli = new mysqli("example.com", "user", "password", "database");
// error check you connection here
$query='select * from tablename where user =? AND password=?';
$stmt = $mysqli->prepare($query);
$stmt->bind_param("ss", $user,$password);
$stmt->execute();
if($stmt->num_rows!=1) {
   // check failed
}else{
   // check success
}

PDO示例(推荐)

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
// error check you connection here
$query='select * from tablename where user =? AND password=?';
$stmt = $dbh->prepare($query);
$stmt->bindParam(1,$user);
$stmt->bindParam(2,$password);
$stmt->execute();
if($sth->fetchAll()) {
    // check success
}else{
    // check failure
}

此外,您还应考虑使用某种形式的单向密码加密(密码散列),然后将其存储在数据库中并将其与散列进行比较(最常用的方法是使用它) Bcrypt)。

答案 2 :(得分:0)

您可以使用类似

的内容

 
SELECT count(*) FROM tablename WHERE name  = "'.$_POST[name].' AND  password = "'. $_POST[password].'"

您应该期望count正好为1 - 表示有效用户,0 - 表示无效用户

大于1的任何内容都应该是无效的情况,表明数据库中存在某种不一致...

答案 3 :(得分:0)

您应该将变量分配给name&随后通过。

你可以试试这个:

$con = mysqli_connect("localhost","YOURUSER","YOURPASS","YOURDB");
if (mysqli_connect_errno())

{
    echo"The Connection was not established" . mysqli_connect_error();



$user
= mysqli_real_escape_string($con,$_POST['user']);

$pass = mysqli_real_escape_string($con,$_POST['password']);

$query = "select * from tablename where user ='$user' AND password='$pass' ";
$run = mysqli_query($con,$query);
$check = mysqli_num_rows($run );
            if($check == 0)
            {
                echo "<script> alert('Password or Email is wrong,try again!')</script>";

            }
            else 
            {
    //get a session for user    

$_SESSION['user']=$user;

                  // head to index.php; you can just put index.php if you like

                echo"<script>window.open('index.php?login=Welcome to Admin Area!','_self')</script>";
            }