我想使用mysql查询的结果来设置会话变量,但是目前我正在努力设置它。
我的代码是:
<?php
ob_start("ob_gzhandler");
?>
<?php
// Include required MySQL configuration file and functions
require_once('config.inc.php');
require_once('functions.inc.php');
// Start session
session_start();
// Check if user is already logged in
if ($_SESSION['logged_in'] == true) {
// If user is already logged in, redirect to main page
redirect('../index.php');
} else {
// Make sure that user submitted a username/password and username only consists of alphanumeric chars
if ( (!isset($_POST['username'])) || (!isset($_POST['password'])) OR
(!ctype_alnum($_POST['username'])) ) {
redirect('../login.php');
}
// Connect to database
$mysqli = @new mysqli(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
// Check connection
if (mysqli_connect_errno()) {
printf("Unable to connect to database: %s", mysqli_connect_error());
exit();
}
// Escape any unsafe characters before querying database
$username = $mysqli->real_escape_string($_POST['username']);
$password = $mysqli->real_escape_string($_POST['password']);
// Construct SQL statement for query & execute
$sql = "SELECT * FROM users WHERE username = '" . $username . "' AND password = '" . md5($password) . "'";
$result = $mysqli->query($sql);
// If one row is returned, username and password are valid
if (is_object($result) && $result->num_rows == 1) {
// Set session variable for login status to true
$_SESSION['auth_lvl'] = $Auth_lvl;
$_SESSION['logged_in'] = true;
redirect('../index.php');
} else {
// If number of rows returned is not one, redirect back to login screen
redirect('../login.php');
}
}
?>
然后我用以下方法测试会话变量:
<?php
session_start();
echo "Login Status is:".$_SESSION['logged_in'];
echo "<br/>";
echo "Auth status is level:".$_SESSION['auth_lvl'];
?>
在我的测试页面上,登录的会话工作正常,显示正确的信息,但auth lvl变量不显示任何内容。
我只能假设我没有正确地调用我正在设置变量的信息。
任何帮助都将不胜感激。
艾伦。
我注意到并且我一直在尝试这些建议的是,如果我设置了一个决定性而不是试图从数据库中检索一个值,那么该值将在我的测试页面上返回。即
$_SESSION['auth_lvl'] = 'test';
这告诉我这是我从数据库中提取数据并尝试将其设置为导致问题的$ _SESSION ['auth_lvl']的方式。
答案 0 :(得分:2)
发现问题。
代码读取:
$result = $mysqli->query($sql);
// If one row is returned, username and password are valid
if (is_object($result) && $result->num_rows == 1) {
// ADD THIS SET OF LINES
$data = mysql_fetch_assoc( $result );
// Replace auth_lvl with the name of your database column name
$Auth_lvl = $data['Auth_lvl'];
// Set session variable for login status to true
$_SESSION['auth_lvl'] = $Auth_lvl;
$_SESSION['logged_in'] = true;
因为我在这段代码上使用了mysqli,所以我没有注意到//添加了这段代码中的“i”缺失了。当我将代码更改为:
$data = mysqli_fetch_assoc( $result );
生命中的一切都被激发了。
感谢您的帮助。
答案 1 :(得分:1)
我无法看到您为$ Auth_lvl分配值的任何地方,所以当您这样做时:
$_SESSION['auth_lvl'] = $Auth_lvl;
它可能被指定为null。
答案 2 :(得分:0)
我没看到你在哪里设置$ Auth_lvl。检查结果和行后,您将直接针对空变量设置会话变量。
if (is_object($result) && $result->num_rows == 1) {
// ADD THIS SET OF LINES
$data = mysql_fetch_assoc( $result );
// Replace auth_lvl with the name of your database column name
$Auth_lvl = $data['auth_lvl']'
// Set session variable for login status to true
$_SESSION['auth_lvl'] = $Auth_lvl;
$_SESSION['logged_in'] = true;
redirect('../index.php');
然后使用您的logged_in会话变量,将其设置为布尔值,为true,然后尝试将其作为普通文本回显。
if ( $_SESSION['logged_in'] ) { echo "Login status is: True"; }
我希望有所帮助。
-Dan