我将会话信息存储在名为“Auth”的数组中。该数组包含2个会话信息:id和密码。我的问题是当我使用id信息进行查询时,它无法正常工作。我很确定这是因为我的表中的id信息是一个int,而session数组中的id信息不是。所以我的问题是知道如何将会话id变量转换为int。下面是我使用$ _SESSION(['Auth'] ['id'])的函数。提前感谢您的回复。干杯。马克
我正在使用会话信息的PHP代码:
<?php
session_start();
header('Content-Type: text/html; charset=utf-8');
require("connect.inc.php");
function isLogged(){
if(isset($_SESSION['Auth']) && isset($_SESSION['Auth']['id']) && isset($_SESSION['Auth']['pass'])){
extract($_SESSION['Auth']);
$result = mysql_query("SELECT * FROM usr_users WHERE usr_id = '$id' AND usr_pass = '$pass'");
if(mysql_num_rows($result)==1){
return true;
}
else{
return false;
}
}
}
?>
这里是我设置会话信息的PHP代码:
<?php
session_start();
header('Content-Type: text/html; charset=utf-8');
require("connect.inc.php");
$identifiant = mysql_real_escape_string($_POST['identifiant']);
$pass = sha1($_POST['pass']);
$result = mysql_query("SELECT * FROM users WHERE usr_pseudo = '$identifiant' AND usr_pass = '$pass'");
if(mysql_num_rows($result)==1){
$data=mysql_fetch_assoc($result);
$_SESSION['Auth']=array(
'id'=>$data['usr_id'],
'pass'=>$pass
);
}
echo mysql_num_rows($result);
?>
答案 0 :(得分:1)
extract()
是一个非常丑陋的功能,你应该忘记它的存在。
没有必要,因为它纯粹是PHP早期“懒惰”日子的延续,当时它试图为你做所有事情,导致部分PHP具有可怜的安全声誉。
您可以直接在任何地方嵌入会话变量,即使它是像您的会话一样的任意“深度”数组引用:
$sql = "SELECT ... WHERE id={$_SESSION['Auth']['id']} ...";
甚至
$id = $_SESSION['Auth']['id']'
$sql = "SELECT ... WHERE id=$id";
将以相同的方式工作,而不是用无用的垃圾乱丢你的变量命名空间。
答案 1 :(得分:0)
您可以使用强制转换方法将任何变量强制转换为任何类型。
$usr_id = (int)$data['usr_id']
这会返回一个整数类型。如果id包含除整数之外的任何其他内容,则返回0。
答案 2 :(得分:0)
每次要检查用户是否已登录时,都不应该查询数据库。而且您不需要在查看中存储密码。 当您登录用户(代码的第二部分)时,您只需要查询一次数据库。
如果为auth逻辑创建一个简单的包装器会更好。像这个带静态函数的简单类:
<?php
class Auth
{
public static function login($identifiant, $password)
{
// query db then
// $_SESSION['Auth']['id'] = value from db
return self::id();
}
public static function isLogged()
{
return (bool)self::id()
}
public static function id()
{
return (isset($_SESSION['Auth']['id'])) ? $_SESSION['Auth']['id'] : false)
}
public static function logout()
{
$_SESSION['Auth'] = array();
}
}
// usage
Auth::login($_POST['identifiant'], $_POST['password']);
if (Auth::isLogged()) {
$sql = "select * from posts where user = " . Auth::id() . "";
}
Auth::logout();
答案 3 :(得分:0)
如果您“非常确定是由于(您的)表中的id信息是一个int值,而会话数组中的id信息不是该值”。
这是将会话ID从数组转换为变量(cast it)的简单方法。
$id = (int)$_SESSION['id'];
希望有帮助。
答案 4 :(得分:-2)
你不应该在SQL
中用单引号括起整数试试这个
$result = mysql_query("SELECT * FROM usr_users WHERE usr_id = $id AND usr_pass = '$pass'");