PHP将会话变量从数组转换为int

时间:2012-02-02 19:29:51

标签: php mysql

我将会话信息存储在名为“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);

?>

5 个答案:

答案 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。

http://php.net/manual/en/language.types.type-juggling.php

答案 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'");