感谢我的最后一个问题,我将我的网站更新为PDO,我想在我的头版上开始id,然后更深入地工作,我的第一个障碍就是我的登录脚本。
login-exec.php已编辑
session_start();
include_once ('connect.php');
$Email = isset($_POST['Email']) ? $_POST['Email'] : "Email Never Sent";
$Password = isset($_POST['Password']) ? $_POST['Password'] : "Password Never Sent";
$stmt = $db->prepare("SELECT * FROM members WHERE Email = :Email AND Password = :Password");
$stmt->bindParam(":Email" , $Email );
$stmt->bindParam(":Password", $Password);
$stmt->execute();
$member = $stmt->fetch(PDO::FETCH_ASSOC);
if ($member)
{
$_SESSION['SESS_MEMBER_ID'] = $member['Member_ID'];
$_SESSION['SESS_POST_AS'] = $member['Post_As'];
$_SESSION['SESS_AUTH'] = $member['auth'];
session_write_close();
header('location: index.php');
exit();
} else {
header("location: ?p=login-failed");
exit();
}
connect.php
$db = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
编辑:现在我被发送到登录失败的页面,我的问题现在也在于此页面从表单收到的内容了吗?
我知道我的$密码是纯文本,我以前使用过md5而且一旦我得到这个工作生病了实施更好的保护
答案 0 :(得分:0)
将您的连接尝试放入try / catch,然后您将看到错误
try {
$dbh = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
答案 1 :(得分:0)
问题可能是if ($count > 1)
,应该是
if ($count > 0)
或
if ($count == 1)
如果sql返回1行,我认为这就是你想要的。
答案 2 :(得分:0)
除了设置正确的错误报告外,还要更改
$count = $stmt->rowCount();
if ($count > 1)
到
$member = $stmt->fetch();
if ($member)
使代码保持一致
答案 3 :(得分:-1)
试试这个:
if ($count > 0)
或强>
if ($count >= 1)
{
session_start();
$_SESSION['SESS_MEMBER_ID'] = $member['Member_ID'];
$_SESSION['SESS_POST_AS'] = $member['Post_As'];
$_SESSION['SESS_AUTH'] = $member['auth'];
session_write_close();
header('location: index.php');
exit();
}
答案 4 :(得分:-1)
这将有效,您可以检查是否找到了结果:
$stmt->execute();
$result = $stmt->fetch(PDO::FETCH_ASSOC);
if($result)
{
//...
}
else
{
//...
}
另请注意,您必须始终
session_start();
位于页面顶部,否则无效。
$ member在这里没有意义,你在哪里创建它? $ member应该作为一行,但在这种情况下,$ result将为你完成这项工作。
我建议您查看phpass以获取密码保护。
你也应该在POST周围制作逻辑,除非你检查,否则你永远无法确定是否真的发布了任何内容。 Ternary Operator可以很方便:
$Password = isset($_POST['Password']) ? $_POST['Password'] : "Password Never Sent";
如果只是为了捕获失败的pdo连接,那么你不应该在整个页面中使用try catch,这应该是你的连接文件的一部分。
我会避免使用“?p = login-failed”,因为如果您没有正在进行任何有效的验证,则很容易操作。
我个人不喜欢bindParam方法,在语句中执行参数数组对我来说更有意义:
$stmt->execute(array(":Email"=>$Email, ":Password"=>$Password));
但在这种情况下,你的方法不应该导致错误。
请注意,您不需要exit();在header();
之后我希望我的评论有所帮助。