2014-10-06 137 views
0

我想让我的代码检查用户名和密码是否存在于我的数据库中。 ,它工作的硬编码,但我想用database.Right做到这一点,现在这是我有:PHP mySQL检查用户名和密码是否在数据库中

if(isset($_POST["name"], $_POST["password"])) 
     {  

      $name = $_POST["name"]; 
      $password = $_POST["password"]; 

      $result1 = mysql_query("SELECT password FROM Users WHERE username = '".$name."'"); 
      $result2 = mysql_query("SELECT username FROM Users WHERE password = '".$password."'"); 

      if($name == $result2 && $password == $result1) 
      { 
       $_SESSION["logged_in"] = true; 
       $_SESSION["naam"] = $name; 
      } 
      else 
      { 
       echo'The username or password are incorrect!'; 
      } 
    } 

的问题是在result1/2部分我想,因为当我使用正确的用户名和密码在我的网站,它给出了不正确的信息。

噢,是和查询工作过,尝试过在phpMyAdmin但后来没有,我的用户名

+1

不要忘记清洁你的'$ _POST'变量对MySQL的注射,即'mysql_real_escape_string()' – adamdehaven 2014-10-06 18:35:07

+1

你只需要一个单一的查询'“选择密码从用户的用户名='”。 $名称。 “'”AND password ='“。$ password。”'“'不要忘记SQL注入,如果有任何查询结果 - 用户存在,不要使用'mysql_'扩展名 - 不推荐使用。 'mysqli_'代替 – Cheery 2014-10-06 18:36:17

+0

使用'mysql_num_rows()' - 更好的是,使用预先准备的语句和一个安全的密码散列方法如果使用纯文本密码,你**将被黑客入侵 – 2014-10-06 18:38:34

回答

5

您可以使用mysql_num_rows()并结合您的查询 - 见脚注

if(isset($_POST["name"], $_POST["password"])) 
    {  

     $name = $_POST["name"]; 
     $password = $_POST["password"]; 

     $result1 = mysql_query("SELECT username, password FROM Users WHERE username = '".$name."' AND password = '".$password."'"); 

     if(mysql_num_rows($result1) > 0) 
     { 
      $_SESSION["logged_in"] = true; 
      $_SESSION["naam"] = $name; 
     } 
     else 
     { 
      echo 'The username or password are incorrect!'; 
     } 
} 

为了使您的本次代码有点更安全,使用:

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

$password = stripslashes$_POST["password"]); 
$password = mysql_real_escape_string$_POST["password"]); 

但不要看下面的链接关于使用预处理语句和密码散列。


脚注:

你现在的代码是开放的SQL injection。使用prepared statementsPDO with prepared statements。访问这些链接了解更多信息。

我注意到你可能以纯文本格式存储密码。如果是这样的话,它是非常不鼓励的。

如果你是,这是一个现场网站,你最终会被黑客入侵。

我建议你用CRYPT_BLOWFISH或者PHP5.5的password_hash()函数。对于PHP < 5.5使用password_hash() compatibility pack


mysql_*功能已取消通知:

http://www.php.net/manual/en/intro.mysql.php

这个扩展不赞成PHP 5.5.0,并且不建议用于编写新的代码,因为它会在将来被移除。应该使用mysqliPDO_MySQL扩展名。请参阅MySQL API Overview以获取进一步帮助,同时选择MySQL API。

这些功能允许您访问MySQL数据库服务器。有关MySQL的更多信息,请参阅»http://www.mysql.com/

为MySQL

文档可以在»http://dev.mysql.com/doc/找到。


编辑:助阵OP(不考虑我提供有关的链接密码哈希)。

尝试用替换

 if(mysql_num_rows($result1) > 0) 
     { 
      $_SESSION["logged_in"] = true; 
      $_SESSION["naam"] = $name; 
     } 
     else 
     { 
      echo 'The username or password are incorrect!'; 
     } 

while($row=mysql_fetch_assoc($result1)) 
{ 
$check_username=$row['username']; 
$check_password=$row['password']; 
} 

if($username == $check_username && $password == $check_password){ 
echo "Matches."; 
} 

else{ 
echo "No match."; 
} 
+0

嗨弗雷德和约翰,谢谢你评论。该代码仍然是“用户名或密码不正确”。但我会将你标记为答案,因为你解释得很好。 – user3763686 2014-10-06 19:06:01

+0

@ user3763686是否将密码直接存储在数据库中? – 2014-10-06 19:11:07

+0

Nvm它已经工作,这是因为我正在使用sqli上面的代码x),谢谢你们! – user3763686 2014-10-06 19:15:01

-1

$name$password可能是字符串替换它的$name部分。如果您的查询正在完成并正确完成,它们将作为对象返回。

为了使其工作,您只需从if()条件中删除$name ==$password ==

您还可以将这些查询结合起来以简化操作。

<?php 

$result = mysql_query("SELECT username, password FROM Users WHERE username = '".$name."' && password = '".$password."'"); 

if ($result && mysql_num_rows($result) > 0) { 
    // Login 
} else { 
    // Failed! 
} 

如果你不在乎知道哪一个失败,那么这将实现同样的目的。

+1

'mysql_ *'函数被认为不推荐使用。请使用PDO或'mysqli_ *'函数向人员展示 – 2014-10-06 18:40:17

+0

@JustinWood我只是试图保持OP能够理解的问题的上下文。 – helllomatt 2014-10-06 18:41:39

+1

不是。本网站的重点是帮助用户。你应该教他们最佳实践。不幸的是,不少人会复制/粘贴一个答案,看看它是否有效。然后他们会教别人过去为他们工作的东西。继续糟糕的知识周期。 – 2014-10-06 18:44:45

相关问题