会话没有得到声明
问题描述:
这是我的登录代码会话没有得到声明
global $connection;
if (isset($_POST['user_login'])) {
$email = $_POST['email'];
$password = $_POST['password'];
$password= md5($password);
$login = mysqli_query($connection, "SELECT * FROM user WHERE email ='{$email}' AND password = '{$password}' ");
if(!$login) {
die("QUERY FAILED" . mysqli_error($connection));
}
if(!$login || mysqli_num_rows($login) == 0) {
echo "<div class='alert alert-danger' role='alert'> <strong>Your Username or Password is invalid!</strong></div>";
} else {
$_SESSION['user_id'] = $user_id;
$_SESSION['email'] = $email;
$_SESSION['username'] = $username;
header('Location: index.php');
}
}
我用的print_r函数来显示所有的会话,但只对会话邮件是越来越声明。为什么没有声明user_id和username?我做错了什么?
答
- 您可能会忘记在顶部声明
session_start();
。 - 看起来你在会话中使用
user_id
和username
,但它们不会从PHP
代码中的任何地方获取。所以,你可能会忘记从你的$login
响应中获取并使用它们。
这是一个假设,因为你的代码看起来
SELECT
查询的基础上使用user_id
和username
。
所以,你可以尝试使用此代码,具有从选择查询中使用的所有参数:
session_start();
global $connection;
if (isset($_POST['user_login'])) {
$email = $_POST['email'];
$password = $_POST['password'];
$password= md5($password);
$login = mysqli_query($connection, "SELECT * FROM user WHERE email ='{$email}' AND password = '{$password}' LIMIT 1");
if(!$login) {
die("QUERY FAILED" . mysqli_error($connection));
}
if(!$login || mysqli_num_rows($login) == 0) {
echo "<div class='alert alert-danger' role='alert'> <strong>Your Username or Password is invalid!</strong></div>";
} else {
// get user_id and username fetched from your Select query
while($row = $login->fetch_assoc()) {
$_SESSION['user_id'] = $row['user_id']; // assuming user_id as a column
$_SESSION['email'] = $email;
$_SESSION['username'] = $row['username']; // assuming username as a column
}
header('Location: index.php');
}
}
答
当你试图将不initilized变量或空值到会话,会话不提高例外。但是键和值列表,不能添加不初始变量或空值。
你是否开始会话?它看起来不像我 –
您的代码易受[** SQL注入**](https://en.wikipedia.org/wiki/SQL_injection)攻击的影响。你应该使用[** mysqli **](https://secure.php.net/manual/en/mysqli.prepare.php)或[** PDO **](https://secure.php.net/ manual/en/pdo.prepared-statements.php)准备带有绑定参数的语句,如[**这篇文章**]所述(https://*.com/questions/60174/how-can-i-prevent-sql步喷射功能于PHP)。 –
MD5不足以进行密码散列。使用['password_hash()'](http://us3.php.net/manual/en/function.password-hash.php)和['password_verify()'](http://us3.php.net/ manual/en/function.password-verify.php)。 –