Puxando dados da tabela sql com o php usando sessões

9

Estou tentando extrair dados da minha tabela sql com php exclusivo para o ID da sessão, no entanto, só obtenho a posição em que o usuário está quando faço eco de qualquer coisa!

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

é exibido como:

5 5

se eu fizer login com a quinta posição no banco de dados!

    
por thedullmistro 18.10.2012 в 21:20
fonte

7 respostas

3

A razão pela qual você está recebendo 5 é para este código:

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

é que o valor de $ _SESSION ['user_id'] é 5. Então, após a atribuição, o valor de $ user_info é 5. Agora, porque o $ _SESSION ['user_id'] não está definido como uma matriz, sua intenção parece ser . O resultado é que $ user_info é tomado como uma string e ['firstname'] é avaliado como [0]. Se quiser, você pode atualizar o ID de 5 a 54, etc. Você sempre obterá o primeiro caractere do seu ID.

Para corrigir isso, tente alterar as duas últimas linhas antes do retorno em sua função user_data para:

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

para:

if (logged_in() === true) { 
    $user_data = user_data($_SESSION['user_id'], 'username', 'first_name', 'last_name', 'email');
    $_SESSION['user_id'] = $user_data;
}
    
por Tash Pemhiwa 23.10.2012 / 17:05
fonte
2
if (logged_in === true) { 

deve ser

if (logged_in()) { 
    
por StaticVariable 18.10.2012 / 21:23
fonte
0

para mim, parece que você esqueceu de atualizar os dados na sessão. vamos dizer aqui:

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

Espero que ajude você a resolver seus problemas.

    
por chmeliuk 22.10.2012 / 08:01
fonte
0

O que eu vejo que você está nesta linha

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

você está usando "firstname", enquanto que no banco de dados ele é chamado "first_name", veja sublinhado

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

Deixe-me saber se isso resolve ou não como eu também quero saber sua resposta

    
por Ravi Kumar 22.10.2012 / 08:48
fonte
0

Pode ajudá-lo com algumas alterações no seu código

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>
    
por Parag Chaure 25.10.2012 / 10:28
fonte
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);
        }
}

e

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

}

e

<?php
include 'core/init.php';
$user_info = $_SESSION['data'];
?>
<html>....
<h1><?php echo $user_info['firstname'];?>&nbsp<?php echo $user_info['firstname'];?> </h1>
    
por Arun Killu 25.10.2012 / 11:09
fonte
0

A partir da experiência de criar grandes bases de código em PHP e quando você expande o aplicativo, você verá que está usando cada vez mais dados em todo o lugar da tabela de usuários. Além disso, a tabela deve conter apenas os dados mais vitais que são usados com frequência e você NÃO deseja enviar mais de 1 ou 2 consultas para a tabela de usuários por página atingida, pois ela pode se tornar um gargalo em breve. Por esse motivo, é melhor armazenar todos os dados de dados (mova campos grandes para outra tabela ou campos raramente usados). Em seguida, armazene todo o registro do usuário em uma sessão, o que significa que qualquer função, classe, etc. pode usá-lo enquanto ele se torna um superglobal e você pode confiar nele o suficiente para usá-lo em toda a aplicação sem precisar consultar novamente a tabela de usuários.

Eu escrevi um exemplo de trabalho (processando sua estrutura de tabela de banco de dados) e comentei tudo ao longo do texto explicando por que eu fiz isso do jeito que eu tenho e alguns pontos que você pode querer considerar.

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

P.S. Além disso, você pode querer começar a usar LIMIT em suas consultas SQL, pois LIMIT 1 na consulta acima diz ao mysql que ele pode parar de pesquisar depois de encontrar 1 resultado - e você deve ter um índice nessa coluna (preferencialmente um índice primário ou índice exclusivo) para mantê-lo relâmpago rápido (ou pelo menos no início de qualquer maneira > <).

    
por VBAssassin 25.10.2012 / 23:07
fonte