PDO验证登录数据

时间:2012-05-28 14:55:44

标签: php mysql sql pdo

好的..我对这个PDO的东西完全是新的..我试图重新创建我的mysql脚本(工作)到PDO脚本(不工作)..我测试过我的数据库登录信息正确编程为PDO ..

这是我的PDO脚本......

<?

session_start();
//connect to DB
require_once("connect.php");

//get the posted values
$email=htmlspecialchars($_POST['email'],ENT_QUOTES);
$pass=md5($_POST['psw']); 

//now validating the email and password
$sql - $conn_business->prepare( "SELECT email, password FROM members WHERE email='".$email."'");
$sql -> execute();
$count = $sql->rowCount();
$result = $sql -> fetch();
// Now use $result['rowname'];

$stmt = $conn_business->prepare("SELECT * FROM members WHERE email='".$email."'");
$stmt ->execute();
$act = $stmt -> fetch();

//if email exists
if($count > 0)
{
//compare the password
if(strcmp($result["password"],$pass)==0)
{
    // check if activated
    if($act["activated"] == "0")
    {
        echo "act"; //account is not activated yet
    }
    else
    {
        echo "yes"; //Logging in
        //now set the session from here if needed 
        $_SESSION['email'] = $email;
    }
}
else
        echo "no"; //Passwords don't match
}
else
    echo "no"; //Invalid Login

?>

这是我原来的mysql脚本......

session_start();
require_once("connect.php");
//get the posted values
$email=htmlspecialchars($_POST['email'],ENT_QUOTES);
$pass=md5($_POST['psw']); 

//now validating the username and password
$sql="SELECT email, password members WHERE email='".$email."'";
$result=mysql_query($sql);
$row=mysql_fetch_array($result); 

$sql2="SELECT * FROM members WHERE email='".$email."'";
$result2=mysql_query($sql2);
$row2=mysql_fetch_array($result2);
$act = $row2['activated'];

//if username exists
if(mysql_num_rows($result)>0)
{
    //compare the password
    if(strcmp($row['password'],$pass)==0)
    {
        // check if activated
        if($act == "0")
        {
            echo "act";
        }
        else
        {
            echo "yes";
            //now set the session from here if needed 
            $_SESSION['email'] = $email;
        }
    }
    else
            echo "no";
}
else
        echo "no"; //Invalid Login

有人知道吗,我做错了什么?它是一个自动脚本..它通过AJAX调用并返回基于'no','yes'和'act'的数据,告诉AJAX / jQuery脚本该怎么做..正如我所说 - mysql脚本正在运行,所以,如果有人能告诉我PDO脚本做错了什么,那就好了。

编辑:

当它将数据返回给jQuery脚本时,应该会发生这种情况: 如果是:启动会话,在会话开始时重定向到page2.php。 否则如果是:写入未激活帐户的字段。 否则:写下电子邮件和密码不匹配。

问题是,当我尝试编写正确的电子邮件和密码时 - 它继续写:“电子邮件和密码不匹配”而不是重定向..当我说它不工作时它是因为mysql脚本按照描述执行,但PDO脚本没有..

我试图改变'echo'没有“;” 'echo'是“;”看看登录是否会以任何方式启动,但不知怎的,它继续写下电子邮件和密码不匹配..

解决方案:

我没有告诉过这个因为我认为这是不必要的,但是它不起作用的原因是因为我在页面顶部的注释标记中有我的旧mysql代码,所以session_start命令没有工作..删除旧代码后,它工作,但后来我发现其他东西要改变,这是在PDO脚本验证时说:     $ sql - $ conn_business-&gt; prepare(“SELECT email,password FROM members WHERE email ='”。$ email。“'”); 然后我只是将$ sql后的' - '更改为'=',现在,一切都运行完美......无论如何,谢谢大家......希望这段代码可以帮助别人..

2 个答案:

答案 0 :(得分:0)

我相信你的脚本中的第二个查询不是必须的,你可以简单地做

   SELECT * FROM members WHERE email=:EMAIL AND password=:PWS;

使用 bindParam 方法

   $qCredentials->bindParam(":EMAIL",$EMAIL);
   $qCredentials->bindParam(":PWS",$PWS);

然后执行更多低估输出,而不是 ..
尝试“无法登录:提供的凭据无效”表示无效类型的值或“无法登录:凭据无效,找不到用户”表示无效用户凭证。
您可以尝试在用户成功登录IF条件后返回并且方法为

后启动会话
$PDOstatement->debugDumpParams()
$PDOstatement->errorInfo()
$PDOstatement->errorCode()

将帮助您了解查询出了什么问题!

答案 1 :(得分:0)

在“开始使用”PDO之前,您是否阅读过本手册?

  • 这不是应该如何使用准备好的陈述!您的代码填充了SQL注入。
  • 为什么要两次选择同一行?
  • 如果一个字符串与另一个字符串相同,则strcmp() <>
  • 哈希密码就像简单的MD5一样只是个恶作剧。

    session_start();
    
    //very stupid way to acquire connection
    require_once("connect.php");
    
    //get the posted values
    $email = htmlspecialchars($_POST['email'],ENT_QUOTES);
    if (filter_var( $email, FILTER_VALIDATE_EMAIL))
    {
        // posted value is not an email
    }
    
    // MD5 is not even remotely secure
    $pass = md5($_POST['psw']); 
    
    $sql = 'SELECT email, password, activated FROM members WHERE email = :email';
    
    $statement = $conn_business->prepare($sql);
    $statement->bindParam(':email', $email, PDO::PARAM_STR);
    
    $output = 'login error';
    
    if ($statement->execute() && $row = $statement->fetch())
    {
        if ( $row['password'] === $pass )
        {
            // use account confirmed
            if ( $row['activated'] !== 0 ) {
                $output = 'not activated';
                $_SESSION['email'] = $email;
            }
    
            $output = 'logged in';
        }
    }
    
    echo $output;