Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP将会话变量从数组转换为int_Php_Mysql - Fatal编程技术网

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

PHP将会话变量从数组转换为int,php,mysql,Php,Mysql,我将会话信息存储在一个名为“Auth”的数组中。该数组包含2个会话信息:id和密码。我的问题是,当我使用id信息进行查询时,它不起作用。我很确定这是因为我表中的id info是int,而会话数组中的id info不是int。因此,我的问题是知道如何将会话id变量转换为int。下面是我使用$\u session(['Auth']['id'])的函数。提前感谢您的回复。干杯马克 我使用会话信息的PHP代码: <?php session_start(); header('Content-Type

我将会话信息存储在一个名为“Auth”的数组中。该数组包含2个会话信息:id和密码。我的问题是,当我使用id信息进行查询时,它不起作用。我很确定这是因为我表中的id info是int,而会话数组中的id info不是int。因此,我的问题是知道如何将会话id变量转换为int。下面是我使用$\u 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
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);

?>

在SQL语句中,不应将整数括在单引号中

试试这个

$result = mysql_query("SELECT * FROM usr_users WHERE usr_id = $id AND usr_pass = '$pass'");
extract()
是一个非常丑陋的函数,你应该忘掉它的存在

没有必要这样做,因为这纯粹是PHP早期“懒惰”时期的遗留问题,当时它试图为您做任何事情,这在一定程度上造成了PHP糟糕的安全声誉

您可以在任何地方直接嵌入会话变量,即使它是一个任意的“深度”数组引用,如您的会话:

$sql = "SELECT ... WHERE id={$_SESSION['Auth']['id']} ...";
甚至

$id = $_SESSION['Auth']['id']'
$sql = "SELECT ... WHERE id=$id";

两者的工作方式相同,并且不会在变量名称空间中乱扔无用的垃圾。

您可以使用cast方法将任何变量强制转换为任何类型

$usr_id = (int)$data['usr_id']
这将返回一种整数类型。如果id包含除整数以外的任何内容,则返回0


您不应该在每次检查用户是否登录时都查询数据库。而且您不需要在seision中存储密码。 当您登录用户(代码的第二部分)时,只需查询db一次

如果为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();
如果您“非常确定这是由于(您的)表中的id info是int,而会话数组中的id info不是int”

下面是一种将会话id从数组转换为变量()的简单方法


希望有帮助。

MySQL隐式转换以字符串形式引用的数值。还有一些事情正在发生,例如
$\u SESSION['Auth']['Id']
不包含您认为它的功能。“at array包含两个会话信息:Id和password。”您为什么要将密码存储在会话中?Michael,ty试图帮助我。检查上面我创建会话信息的代码。它可能会给你更多的指示来帮助我。谢谢问题已解决-这是一个语法错误:(感谢所有花时间帮助我的人。你好,大卫。谢谢你的帮助。不幸的是,你的想法不起作用。数值可以用引号括起来。啊!只有这样,我对MySQLs松散性的不容忍才让我如此痛苦!你好,马克。非常感谢你提供的信息。我将停止使用extract()。不幸的是,它没有解决我面临的问题。你好,Richard。我已经尝试过了。不幸的是,它没有帮助。你好,我没有检查用户是否已登录。我正在检查是否有真正的用户已登录。出于安全原因,设置会话似乎不够。这些会话必须准确,并且与真实用户帐户。这就是为什么我也将密码用作会话信息。如果在会话中存储密码,则在安全性方面不会有任何好处。在会话中存储id就足够了。此外,如果您想检查这是否是真实用户,可以在Auth::id()中添加相应的查询我只是向您展示了一个更简洁的代码示例。
$id = (int)$_SESSION['id'];