2013-06-27 118 views
0

当我使用正确的用户名和密码登录时,数据库连接发生错误“用户名或密码错误”,我认为密码+用户名检查有问题。登录脚本需要PHP帮助

<?php 
    $host="mysql12-int.cp.hostnet.nl"; // Host name 
    $username="u33936_mick"; // username 
    $password="//password was correct"; // password 
    $db_name="db33936_axe"; // Database name 
    $tbl_name="users"; // Table name 


    mysql_connect("$host", "$username", "$password"); 
    mysql_select_db("$db_name"); 



    $myusername = stripslashes($myusername); 
    $mypassword = stripslashes($mypassword); 
    $myusername = mysql_real_escape_string($myusername); 
    $mypassword = mysql_real_escape_string($mypassword); 
    $sql = 'SELECT * FROM `users` LIMIT 0, 30 WHERE username="$myusername" and   
    password="$mypassword"'; 
    $result=mysql_query($sql); 


    $count=mysql_num_rows($result); 



    if($count==1){ 
     session_register("username"); 
     session_register("password"); 
     header("location:index.php"); 
    } else { 
     echo "Wrong Username or Password"; 
    } 
    ?> 

这是我的形式

 <form name="login" method="post" action="login.php"> 
       <fieldset id="inputs"> 
        <input id="myusername" type="text" name="myusername"  
    placeholder="Username" required=""> 
        <input id="mypassword" type="password" name="mypassword"  
    placeholder="Password" required=""> 
       </fieldset> 
       <fieldset id="login.php"> 
        <input type="submit" id="submit" value="Login"> 
    </style> 
       </fieldset> 
      </form> 
+3

**不再支持** mysql_ *'函数,它们是[**官方不推荐使用的**](https://wiki.php.net/rfc/mysql_deprecation),**不再维护**,将来会[**删除**](http://php.net/manual/en/function.mysql-connect.php#warning)。您应该使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/msqli)更新您的代码,以确保您的项目未来的功能。 – War10ck

+1

男人不寻找他正在寻找解决方案的建议。 –

+0

'echo $ count;' - 可能是因为一些奇怪的原因而超过1?也许它是零? – alfasin

回答

7

最重要的,我建议你看看赞成mysqlidocs)或PDO(docs)从已过时mysql_*家庭的功能转变了,没有的就代码而言,这需要您做出重大改变。

至于你的具体错误,看起来你是错误地连接到查询中的值。另外,您的WHERELIMIT顺序不正确且无效的SQL。这里是正确的形式:

$sql = ' 
    SELECT 
     * 
    FROM 
     `users` 
    WHERE 
     username="'.$myusername.'" AND 
     password="'.$mypassword.'" 
    LIMIT 0, 30 
'; 

目前尚不清楚你使用LIMIT声明带来什么好处。要么你应该有一个匹配的行,或者没有。如果有的话,我会用LIMIT 1。如果你有30行,你会怎么做?!

转换为PDO很简单!在PDO同样的查询应该是这样的:

$host="mysql12-int.cp.hostnet.nl"; // Host name 
$username="u33936_mick"; // username 
$password="//password was correct"; // password 
$db_name="db33936_axe"; // Database name 

$pdo = new PDO('mysql:host='.$host.';dbname='.$db_name, $username, $password); 
$sth = $pdo->prepare(' 
     SELECT 
      * 
     FROM 
      `users` 
     WHERE 
      username=:username AND 
      password=:password 
     LIMIT 0, 30 
'); 
$sth->execute(array('username'=>$myusername, 'password'=>$mypassword)); 
$user = $sth->fetch(); 

注意,当您使用PDO与绑定参数(如图所示),你不必与mysql_real_escape_stringaddSlashes消毒为您在代码中所做的那样。

目前尚不清楚您在哪里定义$mypassword$myusername,但如果您使用的是已注册的全局变量,那么您应该更改您的代码。直接从$_POST获取值。 addSlashes是不安全的,既不是注册的全局变量。

文档

+0

谢谢!但现在我的主页显示,u33936_mick已登录,而不是我登录的帐户 – user2528939

+0

我想你正在用'$ _POST ['myusername']'和'$ _POST ['mypassword']混合数据库用户名和密码'。这就是为什么使用注册的全局变量是一个坏主意:)我不知道你的数据库里有什么,或者你在数据库检查后做了什么,但是确保你不在任何地方使用'$ username',因为那是数据库用户名,而不是登录的用户。 –

2

一些问题:

  • 您应该使用$_POST['myusername']等来获取发布的变量。如果您依赖于register_globals,则应该将其关闭,因为它已被弃用且存在安全风险;
  • LIMIT子句以mysql结尾;
  • 您不应该使用stripslashes和转义函数等函数来修改已发送的信息,而应该使用PDO/mysqli中绑定变量的预准备语句,因为mysql_*函数已被弃用,并且密码可以包含例如斜线。

作为一个侧面说明,你应该真的用盐和散列你的密码,不要在你的数据库中存储纯文本密码。

+1

关于注册全局变量的好消息!我在我的回答中也加了一些,以确保未来的读者能够得到提示。 +1 –