+3

Armazenando tabelas do BD em sessões

criado por Rafael Torres em 10/11/2004 7:50am
As variáveis de sessão ajudam muito o nosso trabalho, evitando a necessidade de consultar o banco de dados em todas as páginas. Aqui mostrarei como armazenar uma tabela inteira dentro de apenas 1 variável.

<?php
$enderecos = mysql_query("SELECT id, endereco, cidade, estado, cep FROM enderecos");
while ($endereco = mysql_fetch_array($enderecos))
  {
    for ($i=0;$i<=4;$i++)
      {
        $array_enderecos[$endereco[0]][$i] = $endereco[$i];
      }
  }
$_SESSION["enderecos"] = $array_enderecos;
?>

Foi feita uma consulta ao MySQL, e cada registro foi adicionado à um array de 2 dimensões. O primeiro índice do array é o ID do registro. O segundo índice é o campo da tabela. O valor do array é o valor do campo no banco de dados. Ao final do script, o array é atribuido à variável de sessão.

Agora vamos à leitura dos dados:

<?php
foreach ($_SESSION["enderecos"] as $endereco)
  {
    echo "ID: "       . $endereco[0] . "<BR>";
    echo "Endereço: " . $endereco[1] . "<BR>";
    echo "Cidade: "   . $endereco[2] . "<BR>";
    echo "Estado: "   . $endereco[3] . "<BR>";
    echo "CEP: "      . $endereco[4] . "<BR>";
  }
?>

Cada "looping do foreach" se refere a 1 registro da tabela. E a leitura de cada campo é feita utilizando o array "endereco" (cada índice é um dos campos). Executando o script, todos os campos de todos os registros serão mostrados na tela.

Agora você pode utilizar os dados desta tabela sem a necessidade de consultar o banco de dados novamente. Por exemplo: se você quiser saber o CEP do endereço de ID = 10, não é necessário fazer um novo SELECT no banco de dados. Basta ler a variável fornecendo o ID do endereço:

<?php
  echo "CEP: " . $_SESSION["enderecos"][10][4];
?>

No exemplo acima, o número 10 se refere ao ID do endereço, e o número 4 é o índice do campo CEP. Dessa forma, é possível fazer a leitura de todos os campos de qualquer registro da tabela.

Vale lembrar que esse método tem suas desvantagens. Uma delas é que as atualizações feitas no banco de dados não serão feitas na variável de sessão. Então use este recurso com cautela.

Comentários:

Mostrando 1 - 10 de 10 comentários
fccd disse:
Eu uso session para fazer login e logoff de aplicação, que no meu ver é muito util e a maneira correta! ( bem melhor que cookie e mais seguro)!

Para muitos dados jogados na sessão acho que não tem validade se você tiver a base de dados aonde você possa consultar isso!

Ok
05/01/2008 6:24am (~16 anos atrás)

Também vejo a utilização dessa "artimanha" como uma faca de dois gumes. Servidores de Banco de Dados já foram feitos para serem eficientes e suportarem bastantes consultas. Existe outras maneiras mais interessantes como o nosso colega Lucas Brito Arruda, o llbra, já comentou. Em minha humilde pessoa, só aconselho a utilização desta dica em situações bem particulares.
09/01/2005 9:46pm (~19 anos atrás)

pois é, justamente isso que pensei, sobrecarregar a memoria nao seria algo interessante, visto que isso traria um lentidao geral em toda site, enquanto a consulta direta, demora(nem sempre) somente na execuação da mesma.
09/12/2004 7:50am (~19 anos atrás)

Felipe Lopes disse:
Tem q ver ateh qdo guardar muitos dados numa sessão (e em um array) naum atrapalha o desempenho do script...Particularmente prefiro ainda fazer a consulta direta ao BD ao inves de a uma sessao....
19/11/2004 8:25am (~19 anos atrás)

João K. disse:
19/11/2004 7:44am (~19 anos atrás)

João K. disse:
AO invés de SESSION, que vai sobrecarregar o servidor... eu utilizo uma versão alternativa via arquivo. Não tem explicações heheh vão ter que entender como funciona. É bem simples.

<?php
echo 'starting';
$cache = new FileCache();
if ($cache->is_ok())
{
echo 'Está ok a versão do cache!!';
$arr = $cache->get();
print_r($arr);
}
else
{
echo 'O cache está desatualizado!!!';
$array = array();
$texto_inutil = 'blá blá blá \'single quotes\' "quotes" <html> e mais blá blá blá!';
$date = date('Y-m-d');
for ($i=1; $i < 500; $i++)
{
$array[] = array(
'id' => $i,
'texto' => $i . $texto_inutil,
'data' => $date
);
}
echo 'Fazer novo cache';
$cache->save($array);
}

class FileCache
{
var $root_dir = './cache/';
var $timeout = 3600; // in seconds 3600 = 1 hour

function FileCache()
{
$this->open_dir($this->root_dir);
$this->clean_cache();
}

function open_dir($dir = '.')
{
$this->files = array();
if ($handle = opendir($dir))
{
while (false !== ($file = readdir($handle)))
{
if ($file != '.' && $file != '..' && is_file($this->root_dir . $file))
{
if (is_int(strpos($file, '.php')))
{
list($timestamp, $ext) = explode('.', $file);
$this->file_timestamps[] = $timestamp;
}
}
}
closedir($handle);
sort($this->files);
reset($this->files);
}
else
{
echo 'Error: dir (' . $dir . ') not found!';
}
$k = sizeof($this->file_timestamps);
$this->last_update_time = $this->file_timestamps[$k - 1];
$this->last_update_file = $this->file_timestamps[$k - 1] . '.php';
}

function is_ok()
{
if (($this->last_update_time + $this->timeout) < time())
{
return false;
}
else
{
return true;
}
}

function get()
{
$file = $this->root_dir . $this->last_update_file;
if (file_exists($file))
{
include($file);
$var = "var_$fname";
return $$var;
}
else
{
return false;
}
}

function save($array = array())
{
$file = $this->root_dir . time() . '.php';
$str = var_export($array, true);
$str = chr(60) .'?php'. chr(13) . '$var_'. $fname .' = '. $str . chr(13) .'?>';
$handle = fopen($file, 'wb');
fwrite($handle, $str);
fclose($handle);
return true;
}

function clean_cache()
{
array_pop($this->file_timestamps);
$k = sizeof($this->file_timestamps);
if ($k > 0)
{
for ($i=0; $i<$k; $i++)
{
unlink($this->root_dir . $this->file_timestamps[$i] . '.php');
}
}
else
{
return false;
}
}
}


?>
17/11/2004 8:27pm (~19 anos atrás)

Isso funciona bem em sites onde a freqüência das atualizações dos dados é baixa, mas alguma sugestão para um site que seja constantemente atualizado?
16/11/2004 10:43pm (~19 anos atrás)

Eu estou envolvido em um novo projeto e este artigo vai me ajudar muito. Mas restou uma dúvida, como enviar as informações da sessão para uma outra página? Gostei da idéia de usar um arquivo de texto, alguém poderia dar um exemplo?
12/11/2004 10:48pm (~19 anos atrás)

Realmente é algo interessante a ser fazer. Você pode inclusive salvar isso num array. Apenas, tome cuidado com tabelas grandes ou enormes. Elas vão trazer um grande problema se forem salvas em sessions. É preferível, nesse caso, salvar elas em um arquivo temp. Esse temp, além de evitar uma sobrecarga ao bd, da acesso direto. E o melhor jeito de se guardar essas informações é com serialize(). E para extrair usa-se unserialize().
Assim, pode-se salvar um registro ou fazer um novo arquivo temp toda hora que o BD for atualizado. Assim, o bd tera apenas 2 processos (update, search) e só quando a tabela for alterada.
Lembre-se que estou falando de tabelas grandes pra cima.
Para tabelas pequenas e médias, $_SESSION serve.

[]´s

llbra
10/11/2004 8:55am (~19 anos atrás)

Realmente é algo interessante a ser fazer. Você pode inclusive salvar isso num array. Apenas, tome cuidado com tabelas grandes ou enormes. Elas vão trazer um grande problema se forem salvas em sessions. É preferível, nesse caso, salvar elas em um arquivo temp. Esse temp, além de evitar uma sobrecarga ao bd, da acesso direto. E o melhor jeito de se guardar essas informações é com serialize(). E para extrair usa-se unserialize().
Assim, pode-se salvar um registro ou fazer um novo arquivo temp toda hora que o BD for atualizado. Assim, o bd tera apenas 2 processos (update, search) e só quando a tabela for alterada.
Lembre-se que estou falando de tabelas grandes pra cima.
Para tabelas pequenas e médias, $_SESSION serve.

[]´s

llbra
10/11/2004 8:53am (~19 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)