0

好的..我对这个 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 调用,并根据“否”、“是”和“行为”返回数据,告诉 AJAX/jQuery 脚本该做什么。正如我所说 - mysql 脚本正在工作,所以请如果有人能告诉我我在 PDO 脚本上做错了什么..

编辑:

当它将数据返回到 jQuery 脚本时,应该会发生这种情况:如果是:启动会话,重定向到 page2.php 并启动​​会话。else if act: 填写账户未激活的字段。否则:写那个电子邮件和密码不匹配。

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

我试图改变'回声“不”;' '回应“是”;' 看看登录是否会开始,但不知何故它继续写电子邮件和密码不匹配..

解决方案:

我没有告诉这个,因为我认为这是不必要的,但它不起作用的原因是因为我在页面顶部的注释标记中有我的旧 mysql 代码,所以 session_start 命令不起作用..删除旧代码后它可以工作,但后来我发现还有其他要更改的地方,那就是在 PDO 脚本中验证它时说: $sql - $conn_business->prepare("SELECT email, password FROM members WHERE电子邮件='".$email."'"); 然后我只是将 $sql 之后的 '-' 更改为 '=' 现在,一切正常...无论如何谢谢大家.. 希望这段代码可以帮助其他人..

4

2 回答 2

0

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

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

使用bindParam方法

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

然后做更多不稳定的输出而不是..
尝试“无法登录:提供的凭据无效”用于无效类型的值或
“无法登录:无效的凭据,找不到用户”用于无效的用户凭据。
您可以在用户成功登录您的 IF 条件返回yes后尝试启动会话,并且方法

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

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

于 2012-05-28T16:14:34.107 回答
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;
    
于 2012-05-28T16:20:22.937 回答