Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDO验证登录数据_Php_Mysql_Sql_Pdo - Fatal编程技术网

Php PDO验证登录数据

Php PDO验证登录数据,php,mysql,sql,pdo,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($_P

好的。。我对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

?>
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调用,并根据“否”、“是”和“act”返回数据,告诉AJAX/jQuery脚本该做什么。。正如我所说的,mysql脚本正在运行,所以如果有人能告诉我PDO脚本有什么问题,请告诉我

编辑:

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

问题是,当我试图写正确的电子邮件和密码时,它会继续写:“电子邮件和密码不匹配”,而不是重定向。。当我说它不起作用时,是因为mysql脚本按照所描述的那样起作用,而PDO脚本却不起作用

我试着改变“回声”的“不”回应“是”查看登录是否会启动,但不知何故它会继续写入电子邮件和密码不匹配

解决方案:

我甚至没有这样说,因为我认为这是不必要的,但它不起作用的原因是我在页面顶部的注释标记中有我的旧mysql代码,因此session_start命令不起作用。。删除旧代码后,它工作了,但后来我发现了其他需要更改的内容,这是在PDO脚本中验证它时说的: $sql-$conn_business->prepare(“选择电子邮件,来自成员的密码,其中email='”“$email.”);
然后我把$sql后面的“-”改为“=”,现在,一切都很完美。。。无论如何,谢谢大家。。希望此代码可以帮助其他人。

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

   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()

将帮助您了解查询的错误

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

  • 这不是准备好的语句应该被使用的方式!您的代码中充满了SQL注入
  • 为什么选择同一行两次
  • 如果一个字符串与另一个字符串相同,则用于检查的是而不是
  • 将密码散列为简单的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;
    

“不工作”的含义相当广泛……您是否看到任何错误消息或其他调试指标?引人注目的一点是,您在查询后没有进行任何错误检查。看看怎么做。@Pekka我现在已经读过了,但我仍然不知道怎么做,在哪里做,为什么做使用普通的mysql非常简单,我只是认为它在处理PDO方面不会更高级……这行代码看起来是错误的:$sql-$conn_business->prepare(“选择电子邮件,来自成员的密码,其中email=”“$email.”);那个减号是什么,肯定是打字错误吗?我理解你写的代码,非常感谢你展示了一个完美的方法来实现这一点。。但是,连接数据库的最佳方式是什么呢?如果我必须将发布的密码与数据库中的密码匹配,我必须对其进行md5编码以进行比较。您应该使用Sha512或Blowfish,而不是“裸”md5。至于连接到数据库,它包含了更大的问题:用户身份验证应该由服务(一个对象)完成,该服务在构造函数中提供了连接对象。我会考虑应用程序,其中模块化是通过在全局范围内包含许多变量的文件来实现的,这是一个非常有缺陷的文件。