2012-05-28 56 views
0

好的..我完全是这个PDO的东西..我试图重新创建我的mysql脚本(工作)到一个PDO脚本(不工作)..我测试了我的数据库登录信息是正确编程为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脚本没有...

而我试图改变'回声'没有“;”回声“是”;“看是否登录无论如何都会开始,但不知何故,继续编写电子邮件和密码不匹配..

SOLUTION:

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

+2

“不工作”是非常宽泛的......看到任何错误信息或其他调试指标? – GDP

+0

有一点引人注目的是你在查询后没有发生任何错误。请参阅http://stackoverflow.com/questions/3726505/how-to-squeeze-error-message-out-of-pdo关于如何做到这一点。 –

+0

@Pekka我已经阅读过它,但我仍然不知道到底是如何,在哪里以及为什么要这样做..:/这是很容易与普通的MySQL,我只是认为它不会是更先进的处理PDO ... – Dimser

回答

0

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

  • 这不是准备好的语句应该如何使用!你的代码充满了SQL注入。
  • 你为什么选择同一行两次?
  • strcmp()而不是为checing,如果一个字符串是相同的另一个。
  • 和散列密码一样简单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; 
    
+0

我了解您所写的代码,并非常感谢您展示了完成此操作的完美方式。但连接到数据库的最佳方式将如何?如果我必须将发布的密码与数据库中的密码相匹配,则必须对md5进行编码以进行比较。 – Dimser

+0

而不是“裸”MD5,你应该使用[crypy()](http://php.net/manual/en/function.crypt.php),与Sha512或Blowfish。至于连接数据库,它包含了更大的问题:用户身份验证应该由服务(一个对象)完成,该对象在构造函数中提供了连接对象。我会考虑应用程序,其中通过在全局范围内包含大量带有变量的文件来实现模块化,这是非常有缺陷的。 –

0

我相信第二个查询你的脚本是没有必要的,你可以简单的做

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

使用bindParam方法

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

然后做更多understable个产出,而不是没有 ..
尝试“无法登录:凭据无效提供的”无效类型的值或
“无法登录:证书无效,找不到用户”
无效的用户凭证。
你可以尝试启动会话后,用户在你的IF条件返回已成功登录,并且这些方法

$PDOstatement->debugDumpParams() 
$PDOstatement->errorInfo() 
$PDOstatement->errorCode() 

将有助于你理解了什么错查询!