Php 如何在PDO中使用会话?
我仍在重新编写和删除代码中的旧mysql_*命令。我尝试将我的会话登录表单转换为旧代码,这是我目前得到的结果:Php 如何在PDO中使用会话?,php,session,login,pdo,Php,Session,Login,Pdo,我仍在重新编写和删除代码中的旧mysql_*命令。我尝试将我的会话登录表单转换为旧代码,这是我目前得到的结果: public function login($user, $password) { if (!empty($user) && !empty($password)) { $password = $web->doHash($user, $password); // in this function is (return sh
public function login($user, $password)
{
if (!empty($user) && !empty($password))
{
$password = $web->doHash($user, $password); // in this function is (return sha1(strtoupper($user).':'.strtoupper($password))
$stmt = $db_login->prepare("SELECT * FROM account WHERE username=:user AND pass_hash=:password");
$stmt->bindValue(':user', $user, PDO::PARAM_STR);
$stmt->bindValue(':password', $password, PDO::PARAM_STR);
$stmt->execute();
$rows = $stmt->rowCount();
if ($rows > 0)
{
$results_login = $stmt->fetch(PDO::FETCH_ASSOC);
$_SESSION['user_name'] = $results_login['username'];
$_SESSION['user_id'] = $results_login['id'];
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
之后,我将检查用户是否登录站点:
public function isLogged()
{
return (!empty($_SESSION['user_id']) && !empty($_SESSION['user_name']));
}
但是,这个函数似乎总是返回空的,因为$u会话在PDO中不存在?当然,在我的网站上,注销是以这种形式使用的:
public function logout()
{
unset($_SESSION['user_id']);
unset($_SESSION['user_name']);
}
但我认为PDO有不同的处理会话的方式?我没有发现任何问题,所以我可以在PDO中添加$_会话,而不需要对代码进行太多更改吗
我在整个web项目中使用变量$\u SESSION['user\u name']
和$\u SESSION['user\u id']
总结:
1) 如何正确使用PDO中的会话
2) 使用$stmt->fetch(PDO::fetch_ASSOC)有什么区别
和$stmt->fetchAll()代码>
谢谢。PDOStatement::rowCount()
在mysql中不起作用,所以$rows不会返回任何内容。
另外,PDO与会话无关,它是处理数据库的扩展
如果你想计算结果的数量,你可以这样做
$stmt->execute();
$results = $stmt->fetchAll();
$results = count($results);
答案如下:
session\u start()
$stmt->fetch()
将获取一行,而fetchAll()
将获取整个结果集PDO::FETCH_ASSOC
检索按列名索引的数据。i、 伊安
在我看来,最好使用PDO::FETCH_ASSOC
,因为它非常清楚正在获取和处理哪些数据
如果选择fetchAll(PDO::fetch\u ASSOC)
有关
FetchAll
PDO函数的更多信息,请查看摆脱mysql的+1。现在阅读您的问题:)PDO和会话是PHP的两个不相关的特性。它们可以而且通常可以共存。登录函数是否返回true而会话变量仍然为空?您是否事先调用了session\u start()
?我没有调用session\u start()-我应该把它放在哪里?我刚刚在那里施工,但我删除了它。@事实是这样的:我应该把它放回去还是以某种方式重做?你知道我第二个问题的答案吗?谢谢你,难道你看不到你的Byakugan吗?我想我的Rinnegan更强壮…:请看我的答案。你知道我第二个问题的答案吗我知道什么时候该用这个或那个,但无法解释清楚。你应该阅读手册,或者其他人可以解释。那么,这个案例是什么更好地使用?或者更安全或更实用?:)fetch()。因此,这取决于您需要什么,所以即使我只需要获取一个,我也可以使用fetchAll,不在乎我是否理解正确:)如果它在没有会话的情况下也能工作,我还应该使用它吗?我应该在我的注销函数中使用session_destroy()之类的东西吗?所以似乎它没有正确地将变量添加到$_session['user_name']和$_session['user_id']中。最后,在编辑函数之后,它出现了,但是当我打印会话变量时,它们是空的。你知道吗?即使打印成功地打印在该函数中,但变量为空。。。我很绝望。您是否确保正在运行if语句-if($rows>0)以及在所有必需的页面中调用了session_start()?@Byakugan-在检查了我在前面的评论中建议的两项之后,我还建议检查填充了以下变量:$results_login['username']和$results_login['id']