使用会话使用 php 从 sql 表中提取数据

Posted

技术标签:

【中文标题】使用会话使用 php 从 sql 表中提取数据【英文标题】:Pulling data off of sql table with php using sessions 【发布时间】:2012-10-09 08:27:25 【问题描述】:

我正在尝试使用会话 ID 唯一的 php 从我的 sql 表中提取数据,但是当我回显任何内容时,我只会得到用户所在的位置!

<?php
include 'core/init.php';
$user_info = $_SESSION['user_id'];
?>
<html>....
<h1><?php echo $user_info['firstname'];?>&nbsp<?php echo $user_info['firstname'];?> </h1>

显示为:

5 5

如果我以数据库中的第五个位置登录!

【问题讨论】:

在哪里将数据添加到 $_SESSION。我认为你错过了那部分 $session_user_id 在 $user_data = user_data($session_user_id, 'user_id', 'username', 'first_name', 'last_name', 'email') 行可能为空; 数据库图片是死链接 是的,缺少数据库映像。你能解决它吗? 【参考方案1】:

你得到 5 的原因是因为这段代码:

<?php echo $user_info['firstname'];?>

$_SESSION['user_id'] 的值是 5。所以在分配后 $user_info 的值是 5。现在因为 $_SESSION['user_id'] 没有设置为数组,因为您的意图似乎是.结果是 $user_info 被视为一个字符串并且 ['firstname'] 的计算结果为 [0]。如果您愿意,可以将 ID 5 更新为 54 等。您将始终获得 ID 的第一个字符。

要更正此问题,请尝试将 user_data 函数中 return 之前的最后 2 行更改为:

$data = mysql_fetch_assoc(mysql_query("SELECT $fields FROM `users` WHERE `user_id` = $user_id"));
$data = array_merge(array($user_id), $data);
return $data;

if (logged_in() === true)  
    $user_data = user_data($_SESSION['user_id'], 'username', 'first_name', 'last_name',     'email');
    $user_data = user_data($session_user_id, 'user_id', 'username', 'first_name', 'last_name', 'email');

到:

if (logged_in() === true)  
    $user_data = user_data($_SESSION['user_id'], 'username', 'first_name', 'last_name', 'email');
    $_SESSION['user_id'] = $user_data;

【讨论】:

【参考方案2】:
if (logged_in === true)  

应该是

if (logged_in())  

【讨论】:

我已经改了,但是用户的数据还是没有回显!【参考方案3】:

对我来说,您似乎忘记在会话中更新数据。 让我们在这里说:

if (logged_in() === true)  
    $user_data = user_data($_SESSION['user_id'], 'username', 'first_name', 'last_name', 'email');
    $user_data = user_data($session_user_id, 'user_id', 'username', 'first_name', 'last_name', 'email');

    $_SESSION = array_merge($_SESSION, $user_data);

希望它能帮助您解决问题。

【讨论】:

收到此错误“警告:array_merge() [function.array-merge]:参数 #2 不是 /home/emusauce/public_html/classm8.net/test/core/init 中的数组。第 12 行的 php" 好的。请问user_data函数的结果是什么?【参考方案4】:

我在这一行看到你的

<h1><?php echo $user_info['firstname'];?>&nbsp<?php echo $user_info['firstname'];?> </h1>

您使用的是“名字”,而在数据库中它被命名为“名字”,请参见下划线

<h1><?php echo $user_info['first_name'];?>&nbsp<?php echo $user_info['first_name'];?> </h1>

让我知道这是否解决了,因为我也想知道它的答案

【讨论】:

问题似乎有所不同,因为即使他使用 $user_info['firstname'],他也会得到输出 5。我认为这表明他错误地填充了会话值。 是的,看来是这样,如果可能的话,我会要求您提供您的代码和数据库,以便我可以追踪确切的问题 通过邮件发送到 ravipanwar85@gmail.com【参考方案5】:

可能会帮助您对代码进行一些更改

function user_data($user_id) 
    $data = array ();
    $user_id = (int)$user_id;

    $func_num_args = func_num_args();
    $func_get_args = func_get_args();

    if ($func_num_args > 1) 
        unset($func_get_args[0]);

        $fields = '`'. implode('`, `', $func_get_args). '`';
        echo '<br>'.
        $que =  "SELECT $fields FROM `users` WHERE `id` = $user_id";
        $data = mysql_fetch_assoc(mysql_query($que));
        print_r ($data);
        return $data;
        


function logged_in() 
    return (isset($_SESSION['id'])) ? true : false;


if (logged_in() === true)  
    $user_data = user_data($_SESSION['user_id'], 'username', 'firstname', 'email');
    //$user_data = user_data($session_user_id, 'user_id', 'username', 'firstname', 'email');
    print_r($user_data);

echo 
$user_info = $user_data;//$_SESSION['user_id'];
?>
<h1><?php echo $user_info['firstname'];?>&nbsp<?php echo $user_info['firstname'];?> </h1>

【讨论】:

【参考方案6】:
function user_data($data=array(),$whereData=array()) 
  $str='';
  if(isset($whereData) && is_array($whereData))
   
         foreach($whereData as $key=>$val)
    
        if($val!='')
        if($str=='')
            $str     =  $key." = '".$val."'";
        else
            $str    .=  " AND ".$key." = '".$val."'";
    
   
      $condition =
       $fields = implode(',' , $data);
       if($str!='')
        $data = mysql_fetch_assoc(mysql_query("SELECT $fields FROM `users` WHERE  $str"));
        
         else
          
                $data = mysql_fetch_assoc(mysql_query("SELECT $fields FROM `users` ));
          
        return $data;
        print_r ($data);
        

 if (logged_in() === true) 
  $data = array('username', 'first_name', 'last_name', 'email');
  $where=array('user_id'=>$_SESSION['user_id']) 
  $_SESSION['data'] = user_data($data, $where);


<?php
include 'core/init.php';
$user_info = $_SESSION['data'];
?>
<html>....
<h1><?php echo $user_info['firstname'];?>&nbsp<?php echo $user_info['firstname'];?> </h1>

【讨论】:

【参考方案7】:

根据在 PHP 中创建大型代码库的经验,当您扩展应用程序时,您会发现您使用的用户表中的数据越来越多。此外,该表应该只真正包含最常用的最重要的数据,并且您不希望每个页面命中向用户表发送超过 1 或 2 个查询,因为它很快就会成为瓶颈。出于这个原因,您最好存储所有数据数据(将大字段移动到另一个表或很少使用的字段)。然后将整个用户记录存储在一个会话中,这意味着任何函数、类等都可以使用它,因为它变成了一个超全局的,并且你可以足够信任它以在整个应用程序中使用它,而无需一次又一次地重新查询用户表。

我已经编写了一个工作示例(使用您的 db 表结构)并在整个过程中对其进行了评论,解释了为什么我会按照我的方式完成它以及您可能想要考虑的一些要点。

//change from user_data() to get_user_data() so we know we are "getting" it, makes it a little clearer
function get_user_data($user_id) 

    //protect agains sql injections
    $user_id = mysql_real_escape_string($user_id);

    //you should also be using mysqli or PDO, not the outdated mysql library - just check the php documentation if you don't believe me ;)
    $result = mysql_query("SELECT * FROM `users` WHERE `id` = '$user_id' LIMIT 1");

    //only if the previous query returned a result do we want to fetch an array from it
    if ($result) 
        return mysql_fetch_assoc($result);
    

    //query didn't work (syntax error for example) so return blank array
    return array();



//start and restore the session
session_start();

//if first page hit, set the user details element
if (isset($_SESSION['user_details']) == false) 
    $_SESSION['user_details'] = array();


//if already logged in, refresh their user details incase there were any changes
if (isset($_SESSION['user_details']->user_id)) 
    //refresh the user data
    $_SESSION['user_details'] = get_user_data($_SESSION['user_details']->user_id);


//login
if (empty($_POST['id']) == false) 
    $_POST['id'] = trim($_POST['id']);
    if (is_numeric($_POST['id'])) 
        $_SESSION['user_details'] = get_user_data($_POST['id']);
    


//logout
if (isset($_GET['logout'])) 
    if ($_GET['logout'] == session_id()) 
        $_SESSION['user_details'] = array();
    


//see if logged in so we know what to display
if (empty($_SESSION['user_details'])) 
    //not logged in
    print "<form method='post' action=''><label>User ID</label><input type='text' name='id' value='5' /><input type='submit' value='Login' /></form>";
     else 
    //is logged in
    print "<a href='?logout=" . rawurlencode(session_id()) . "'>logout</a>";


//proof that it works
print '<pre>';
print_r($_SESSION['user_details']);
print '</pre>';

附:此外,您可能希望在 SQL 查询中开始使用 LIMIT,因为上面查询中的 LIMIT 1 告诉 mysql 它可以在找到 1 个结果后停止搜索 - 并且您应该在该列上有一个索引(最好是主索引或唯一索引)让它快速变亮(或者至少在开始时>

【讨论】:

以上是关于使用会话使用 php 从 sql 表中提取数据的主要内容,如果未能解决你的问题,请参考以下文章

从 sql 数据库设置会话 id 变量;这安全吗?

使用 LINQ 和实体框架在一个 SQL 查询中从多个表中提取数据

通过PHP从SQL中的表中获取ID

将数据从 SAP 提取到 SQL Server

关于使用啥 pl-sql 从 Oracle 10G 数据库中提取大量记录(六百万)的任何建议,并从多个表中进行连接? [复制]

根据从 MySQL 中提取的一个值创建 PHP 会话变量