好的..我对这个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后的' - '更改为'=',现在,一切都运行完美......无论如何,谢谢大家......希望这段代码可以帮助别人..
答案 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之前,您是否阅读过本手册?
哈希密码就像简单的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;