9

我正在尝试使用会话 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

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

4

7 回答 7

3

你得到 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 函数中返回之前的最后两行更改为:

$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;
}
于 2012-10-23T15:05:39.773 回答
2
if (logged_in === true) { 

应该

if (logged_in()) { 
于 2012-10-18T19:23:56.197 回答
0

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

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);
}

希望它可以帮助您解决问题。

于 2012-10-22T06:01:35.057 回答
0

我看到你在这一行

<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>

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

于 2012-10-22T06:48:12.747 回答
0

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

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>
于 2012-10-25T08:28:38.863 回答
0
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>
于 2012-10-25T09:09:27.423 回答
0

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

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

//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>';

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

于 2012-10-25T21:07:14.257 回答