Pergunta

Qual é a maneira mais rápida de obter uma grande quantidade de dados (pense em golfe) e a mais eficiente (pense em desempenho) para obter uma grande quantidade de dados de um banco de dados MySQL para uma sessão sem ter que continuar fazendo o que já tenho:

$sql = "SELECT * FROM users WHERE username='" . mysql_escape_string($_POST['username']) . "' AND password='" . mysql_escape_string(md5($_POST['password'])) . "'";
$result = mysql_query($sql, $link) or die("There was an error while trying to get your information.\n<!--\n" . mysql_error($link) . "\n-->");
if(mysql_num_rows($result) < 1)
 {
    $_SESSION['username'] = $_POST['username'];
    redirect('index.php?p=signup');
 }
$_SESSION['id'] = mysql_result($result, '0', 'id');
$_SESSION['fName'] = mysql_result($result, '0', 'fName');
$_SESSION['lName'] = mysql_result($result, '0', 'lName');
...

E antes que alguém pergunte sim, eu realmente preciso 'SELECIONAR

Editar:Sim, estou higienizando os dados, para que não haja injeção de SQL, que está mais acima no código.

Foi útil?

Solução

Eu inventei isso e parece funcionar.

while($row = mysql_fetch_assoc($result))
 {
    $_SESSION = array_merge_recursive($_SESSION, $row);
 }

Outras dicas

Mais eficiente:

$get = mysql_query("SELECT * FROM table_name WHERE field_name=$something") or die(mysql_error());

$_SESSION['data'] = mysql_fetch_assoc($get);

Feito.

Isso agora é armazenado em uma matriz.Então digamos que um campo seja nome de usuário, você acabou de fazer:

echo $_SESSION['data']['username'];

Dados é o nome da matriz - nome de usuário é o campo da matriz.que contém o valor desse campo.

EDITAR:corrigi alguns erros de sintaxe: P, mas você entendeu.

OK, isso não responde à sua pergunta, mas seu código atual não deixa você aberto ao SQL Injection?

Posso estar errado, nunca trabalhei em PHP, só vi o uso de strings no SQL e os alarmes começaram a tocar!

Editar:

Não estou tentando alterar sua postagem, estava corrigindo um erro de ortografia, por favor, não reverta.

Não tenho certeza do que você quer dizer com "grandes quantidades de dados", mas parece que você está inicializando dados apenas para um usuário.Nesse caso, não vejo motivo para otimizar isso, a menos que você tenha centenas de colunas em seu banco de dados com vários megabytes de dados.

Ou, dito de outra forma, por que você precisa otimizar isso?Você está tendo problemas de desempenho?

O que você está fazendo agora é uma abordagem direta e não vejo nenhuma razão para fazer isso de maneira diferente, a menos que você tenha alguns problemas específicos com isso.

No entanto, agrupar os dados do usuário em um objeto de usuário pode ajudar um pouco na estrutura do programa.Validar sua opinião provavelmente também é uma boa ideia.

@Unkwntech Parece que você está correto, mas seguindo um Google, que levou aqui parece que você pode querer mudar para mysql_real_escape_string()

Quanto à edição, corrigi a grafia de eficiente bem como removeu o "o que é".Já que isso não é realmente necessário, já que o tópico diz tudo.

Você pode revisar o histórico de edições (que destaca bem as alterações reais) clicando no botão "editado há um minuto" texto na parte inferior da sua pergunta.

Tente usar json por exemplo:

$_SESSION['data'] = json_encode(mysql_fetch_array($result));

A implementação dessa função é mais rápida do que ele já está fazendo?

Alguém mais tem problemas para entrar] no markdown?tenho que colar

Sim, está bugado.

@Anders - existem algo em torno de 50 a 75 colunas.

Novamente, a menos que isso esteja realmente causando problemas de desempenho em seu aplicativo, eu não me preocuparia em otimizá-lo.Se, no entanto, o desempenho for um problema, consideraria obter apenas alguns dos dados inicialmente e carregar lentamente as outras colunas conforme necessário.

Se a sugestão da Unkwntech realmente funcionar, sugiro que você mude seu SELECT declaração para que não pegue tudo, já que sua coluna de senha seria um desses campos.

Quanto a saber se você precisa ou não manter essas coisas na sessão, eu digo: por que não?Se você for verificar o banco de dados quando o usuário fizer login (presumo que isso seria feito, não?) De qualquer maneira, você também pode armazenar informações bastante não confidenciais (como nome) na sessão, se planejar sobre como usar essas informações durante a visita da pessoa.

Não é tanto que isso cause problemas de desempenho, mas gostaria que o código parecesse um pouco mais limpo.

Em seguida, envolva os dados do usuário em uma classe.Modificar $_SESSION diretamente parece um tanto sujo.Se você quiser manter os dados em um dicionário, o que ainda poderá ser feito mesmo se você os colocar em uma classe separada.

Você também pode implementar um loop que itere sobre todas as colunas, obtenha seus nomes e copie os dados para um mapa com os mesmos nomes de chaves.Dessa forma, suas variáveis ​​internas – nomeadas por chave no dicionário – e os nomes das colunas do banco de dados seriam sempre os mesmos.(Isso também tem a desvantagem de alterar o nome da variável quando você altera o nome da coluna no banco de dados, mas essa é uma compensação bastante comum e bem aceita.)

Tente usar json por exemplo:

$_SESSION['data'] = json_encode(mysql_fetch_array($result));

EditarMais tarde você então json_decode o $_SESSION['data'] variável e você terá um array com todos os dados que você precisa.

Esclarecimento:

Você pode usar json_encode e json_decode se você quiser reduzir o número de linhas de código que você escreve.No exemplo da pergunta, foi necessária uma linha de código para copiar cada coluna do banco de dados para o array SESSION.Em vez de fazer isso com 50 a 75 linhas de código, você poderia fazer isso com 1 por json_encoding todo o registro do banco de dados em uma string.Esta string pode ser armazenada na variável SESSION.Posteriormente, quando o usuário visitar outra página, a variável SESSION estará lá com toda a string JSON.Se você quiser saber o primeiro nome, poderá usar o seguinte código:

$fname = json_decode($_SESSION['data'])['fname'];

Este método não será mais rápido do que uma cópia linha por linha, mas economizará codificação e será mais resistente a alterações em seu banco de dados ou código.

POR FALAR NISSOAlguém mais tem problemas para entrar] no markdown?Eu tenho que colar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top