php - 使用 pdo 而不是 mysqli 时 $_SESSION 中断
问题描述
一周前,我开始使用 js 和 php 构建一个小网站。为了让人们登录,我从通过 mysqli 查询访问数据库开始,但过了一会儿我发现,使用 pdo 会是更好的主意。
php 脚本本身就像我想要的那样工作,如果登录参数正确,则返回用户。
我现在的问题是,当我使用 pdo 实现(当前在我的示例中已注释掉)时,没有 $_SESSION['user'] 了,而它使用 mysqli-query 实现。
如果我在这里错过了一些基本的东西,我不会感到惊讶,但我还没有找到解决方案。'unserialize(serialize($user))' 也只是解决我的问题的绝望尝试。只是说 $_SESSION['user'] = $user; 以同样的方式行事。
有谁知道我的代码有什么问题?我可以坚持使用工作版本,但我更喜欢使用 pdo。
在我的示例中,我使用了一个表用户,其中包含电子邮件、密码和名字列。php 文件名为 test1l.php
<!DOCTYPE html>
<html lang="en">
<head>
<title>Test1l</title>
<meta content="text/javascript" charset="UTF-8"/>
</head>
<?php
if(isset($_POST['login'])) {
session_start();
session_regenerate_id();
$dbservername = "127.0.01";
$dbusername = "username";
$dbpassword = "password";
$dbname = "dbname";
$dbport = 1337;
$conn = new mysqli($dbservername, $dbusername, $dbpassword, $dbname, $dbport);
if ($conn->connect_error) {
header('HTTP/1.1 901 Connection failed', true);
header('X-PHP-Response-Code: 901', true);
} else {
$email = $_POST['email'];
$password = $_POST['password'];
$errormsg = "";
$user = NULL;
$sql = "SELECT * FROM user WHERE email = '" . $email . "'";
$result = $conn->query($sql);
$conn->close();
if ($result->num_rows > 0) {
$count = 0;
while($row = $result->fetch_assoc()) {
if (count > 1) {
header('HTTP/1.1 902 Too many results', true);
header('X-PHP-Response-Code: 902', true);
}
$user = $row;
$count++;
}
if (password_verify($password, $user['password'])) {
$_SESSION['user'] = $user;
} else {
header('HTTP/1.1 903 Wrong password', true);
header('X-PHP-Response-Code: 903', true);
}
} else {
header('HTTP/1.1 904 Unknown E-Mail', true);
header('X-PHP-Response-Code: 904', true);
}
}
}
?>
<!--
if(isset($_POST['login'])) {
$email = $_POST['email'];
$password = $_POST['password'];
$user = NULL;
$pdo = new PDO('mysql:host=127.0.01;dbname=dbname;port=1337', 'username', 'password');
$statement = $pdo->prepare("SELECT * FROM user WHERE email = ?");
$result = $statement->execute(array($email));
if ($result === false) {
header('HTTP/1.1 901 Login Statement failed', true);
header('X-PHP-Response-Code: 901', true);
} else {
$count = 0;
while($row = $statement->fetch()) {
$user = $row;
$count++;
}
if ($count > 1) {
header('HTTP/1.1 902 Too many results', true);
header('X-PHP-Response-Code: 902', true);
} else if ($count < 1) {
header('HTTP/1.1 904 Unknown E-Mail', true);
header('X-PHP-Response-Code: 904', true);
} else {
if (password_verify($password, $user['password'])) {
$_SESSION['user'] = unserialize(serialize($user));
} else {
header('HTTP/1.1 903 Wrong password', true);
header('X-PHP-Response-Code: 903', true);
}
}
}
}
-->
<body>
<div style="display:table; margin-left:auto; margin-right:auto;">
<?php session_start(); if(!isset($_SESSION['user'])) : ?>
<form method="post">
<div id="errorlogin"></div>
<div>
<input type="text" placeholder="Enter E-Mail-Address" name="email" required>
</div>
<div>
<input type="password" placeholder="Enter Password" name="password"required>
</div>
<button type="button" class="btn-login" name="login" onclick="logMeIn(this.form.email.value, this.form.password.value)">Login</button>
<script>
function logMeIn(email, password, remember) {
var http = new XMLHttpRequest();
var url = 'test1l.php';
var params = 'login=1&email=' + email + '&password=' + password + '&remember=' + remember;
http.open('POST', url, true);
http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
http.onreadystatechange = function() {
if (http.readyState == 4) {
document.getElementById('errorlogin').innerHTML = '';
if (http.status == 200) {
document.location = 'test1l';
} else if (http.status == 903 || http.status == 904) {
document.getElementById('errorlogin').innerHTML += 'Incorrect email or password.';
} else {
document.getElementById('errorlogin').innerHTML += 'Error during login: ' + http.status;
}
}
}
http.send(params);
}
</script>
</form>
<?php else : ?>
Hello <?php echo $_SESSION['user']['firstname']; ?>
<?php endif; ?>
</div>
</body>
</html>
解决方案
在注释掉的版本中,它试图在调用之前写入会话session_start
。
推荐阅读
- javascript - 以html形式输入日期后如何修复400错误请求错误?
- python - Python:跨模块使用字典
- c# - 如何获取当前的 PowerPoint 幻灯片编号
- .htaccess - 如何在.htaccess 中阻止对网站主页的访问?
- python - Jupyter Notebooks:如何将笔记本导出为 HTML,包括 splitcell 扩展?
- python - 检查用户输入的单词是否可以从给定的字母列表中生成?
- networking - 可从其他 PC 访问的 Docker 桌面 Linux 容器
- python - 将包含 nan 的字符串转换为 numpy 浮点数组
- c++ - 如何使用运行时大小参数构造 boost spsc_queue 以使用共享内存在两个进程之间交换 cv::Mat 对象?
- javascript - 如何使用 jQuery 切换加号和减号图标?