Moyen le plus efficace pour obtenir des données de la base de données vers la session

StackOverflow https://stackoverflow.com/questions/25767

  •  09-06-2019
  •  | 
  •  

Question

Quel est le moyen le plus rapide d'obtenir une grande quantité de données (pensez au golf) et le plus efficace (pensez aux performances) pour obtenir une grande quantité de données d'une base de données MySQL vers une session sans avoir à continuer à faire ce que j'ai déjà :

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

Et avant que quiconque demande oui, je dois vraiment « SÉLECTIONNER »

Modifier:Oui, je nettoie les données, afin qu'il ne puisse y avoir aucune injection SQL, plus loin dans le code.

Était-ce utile?

La solution

J'ai trouvé ça et cela semble fonctionner.

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

Autres conseils

Le plus efficace:

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

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

Fait.

Ceci est maintenant stocké dans un tableau.Alors disons qu'un champ est un nom d'utilisateur, vous venez de faire :

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

Data est le nom du tableau - le nom d'utilisateur est le champ du tableau.qui contient la valeur de ce champ.

MODIFIER:correction de quelques erreurs de syntaxe :P mais vous voyez l'idée.

OK, cela ne répond pas à votre question, mais votre code actuel ne vous laisse-t-il pas ouvert à l'injection SQL ?

Je peux me tromper, je n'ai jamais travaillé en PHP, je viens de voir l'utilisation de chaînes dans SQL et la sonnette d'alarme a commencé à sonner !

Modifier:

Je n'essaie pas de falsifier votre message, je corrigeais une faute d'orthographe, merci de ne pas revenir en arrière.

Je ne suis pas sûr de ce que vous entendez par « grandes quantités de données », mais il me semble que vous n'initialisez les données que pour un seul utilisateur ?Si tel est le cas, je ne vois aucune raison d'optimiser cela à moins que vous n'ayez des centaines de colonnes dans votre base de données contenant plusieurs mégaoctets de données.

Ou, pour le dire autrement, pourquoi avez-vous besoin d’optimiser cela ?Rencontrez-vous des problèmes de performances ?

Ce que vous faites maintenant est une approche simple, et je ne vois vraiment aucune raison de le faire différemment, à moins que vous n'ayez des problèmes spécifiques.

Envelopper les données utilisateur dans un objet utilisateur peut cependant aider certains sur la structure du programme.Valider votre contribution est probablement aussi une bonne idée.

@Unkwntech semble avoir raison, mais suivre un Google, qui a LED ici on dirait que vous voudrez peut-être changer pour mysql_real_escape_string()

Quant à la modification, j'ai corrigé l'orthographe de efficace ainsi que la suppression du "qu'est-ce que c'est"..Puisque ce n'est pas vraiment obligatoire puisque le sujet dit tout.

Vous pouvez consulter l'historique des modifications (qui met joliment en évidence les modifications réelles) en cliquant sur le bouton "modifié il y a une minute" texte au bas de votre question.

Essayez d'utiliser json par exemple :

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

La mise en œuvre de cette fonction est-elle plus rapide que ce qu’il fait déjà ?

Est-ce que quelqu'un d'autre a du mal à saisir ] dans la démarque ?je dois le coller

Oui, c'est buggé.

@Anders - il y a quelque chose comme 50 à 75 colonnes.

Encore une fois, à moins que cela ne provoque réellement des problèmes de performances dans votre application, je ne prendrais pas la peine de l'optimiser.Si, toutefois, les performances constituent un problème, j'envisagerais d'obtenir uniquement certaines données au départ et de charger paresseusement les autres colonnes selon leurs besoins.

Si la suggestion d'Unkwntech fonctionne effectivement, je vous suggère de modifier votre SELECT afin qu'il ne récupère pas tout, puisque votre colonne de mot de passe serait l'un de ces champs.

Quant à savoir si vous devez ou non garder ces éléments dans la session, je dis pourquoi pas ?Si vous envisagez de vérifier la base de données lorsque l'utilisateur se connecte (je suppose que cela serait fait alors, non ?), vous pourriez aussi bien stocker des informations assez non sensibles (comme le nom) dans la session si vous envisagez sur l'utilisation de ces informations tout au long de la visite de la personne.

Ce n'est pas tant que cela pose des problèmes de performances mais que j'aimerais que le code paraisse un peu plus propre.

Encapsulez ensuite les données utilisateur dans une classe.La modification de $_SESSION semble directement quelque peu sale.Si vous souhaitez conserver les données dans un dictionnaire, ce que vous pouvez toujours faire même si vous les placez dans une classe distincte.

Vous pouvez également implémenter une boucle qui parcourt toutes les colonnes, obtient leurs noms et copie les données sur une carte avec les mêmes noms de clé.De cette façon, vos variables internes (nommées par clé dans le dictionnaire) et les noms de colonnes de base de données seraient toujours les mêmes.(Cela présente également l'inconvénient de changer le nom de la variable lorsque vous modifiez le nom de la colonne dans la base de données, mais il s'agit d'un compromis assez courant et bien accepté.)

Essayez d'utiliser json par exemple :

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

ModifierPlus tard, tu json_decode le $_SESSION['data'] variable et vous obtenez un tableau avec toutes les données dont vous avez besoin.

Clarification:

Vous pouvez utiliser json_encode et json_decode si vous souhaitez réduire le nombre de lignes de code que vous écrivez.Dans l'exemple de la question, une ligne de code était nécessaire pour copier chaque colonne de la base de données dans le tableau SESSION.Au lieu de le faire avec 50 à 75 lignes de code, vous pouvez le faire avec 1 par json_encoding l'intégralité de l'enregistrement de la base de données dans une chaîne.Cette chaîne peut être stockée dans la variable SESSION.Plus tard, lorsque l'utilisateur visite une autre page, la variable SESSION est là avec l'intégralité de la chaîne JSON.Si vous souhaitez ensuite connaître le prénom, vous pouvez utiliser le code suivant :

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

Cette méthode ne sera pas plus rapide qu'une copie ligne par ligne, mais elle économisera du codage et sera plus résistante aux modifications de votre base de données ou de votre code.

D'AILLEURSEst-ce que quelqu'un d'autre a du mal à saisir ] dans la démarque ?Je dois le coller.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top