我正在学习的编码是关于细节的,我错过了一些东西,因为我有以下代码:
public function login() {
if ($_POST) {
$logdb = new PDO('mysql:host=localhost;dbname=kiko', 'kiko', 'pass');
$logdb->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $logdb->prepare("SELECT * FROM usreg WHERE email=:email AND password=:pass");
$stmt->bindParam(":email", $_POST['email']);
$stmt->bindParam(":pass", $_POST['password']);
$stmt->execute();
$loged = $stmt->fetch();
$atributes = $stmt->fetch(PDO::FETCH_ASSOC);
if ($loged) {
session_start();
$_SESSION["loggedIn"] = true;
$_SESSION["id"] = $atributes->id;
$_SESSION["email"] = $_POST['email'];
$_SESSION["group"] = $atributes->group;
$_SESSION["firstname"] = $atributes->firstname;
$_SESSION["lastname"] = $atributes->lastname;
$_SESSION["phone"] = $atributes->phone;
$_SESSION["mobile"] = $atributes->mobile;
$_SESSION["adress"] = $atributes->adress;
$_SESSION["city"] = $atributes->city;
$_SESSION["country"] = $atributes->country;
} else {
echo 'wrong login try again';
}
} else {
echo '<form name="login" action="" method="POST">
Email: <br />
<input type="text" name="email"/><br />
Password: <br />
<input type="password" name="password"/><br />
<button type="submit">Login</button>
<a href="register.php">Register</a></form>';
}
}
除了我注册全局变量的部分外,一切运行良好。我试图做的是将全局会话设置为fetch数组属性的详细信息,我尝试过:
$atributes = $stmt->fetch(PDO::FETCH_OBJ);
但结果是一样的,我将电子邮件从数组更改为POST
,因为当我这样做时它会起作用:
echo $_SESSION['email'];
它可以工作,但是fetch没有将细节传递给其他会话全局变量。我应该把它放在那里成就我试图做的事你们能帮助我吗?我需要另一种准备好的陈述吗?它是否缺少结果,因为我正在制作WHERE
条款?
答案 0 :(得分:3)
你为什么要抓两次?一次为$ loged,另一次为$ atributes
我假设用户名/密码组合是唯一的,因此您只能从SQL查询中获得一个结果。这意味着当你再次调用fetch时,你什么也得不到。
也许你想要:
//$loged = $stmt->fetch();
$atributes = $stmt->fetch(PDO::FETCH_OBJ);
if ($atributes) {
session_start();
$_SESSION["loggedIn"] = true;
$_SESSION["id"] = $atributes->id;
此外,请确保在处理密码时使用password_verify!