Domanda

Qual è il modo più rapido per ottenere una grande quantità di dati (pensa al golf) e il più efficiente (pensa alle prestazioni) per ottenere una grande quantità di dati da un database MySQL a una sessione senza dover continuare a fare ciò che ho già:

$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 prima che qualcuno chieda di sì, devo davvero "SELEZIONARE".

Modificare:Sì, sto disinfettando i dati, in modo che non possa esserci SQL injection, che è più in alto nel codice.

È stato utile?

Soluzione

Mi è venuta in mente questa e sembra funzionare.

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

Altri suggerimenti

Più efficiente:

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

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

Fatto.

Questo è ora memorizzato in un array.Quindi diciamo che un campo è il nome utente che fai semplicemente:

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

Data è il nome dell'array - nome utente è il campo dell'array..che contiene il valore per quel campo.

MODIFICARE:corretti alcuni errori di sintassi: P ma hai capito.

OK, questo non risponde alla tua domanda, ma il tuo codice attuale non ti lascia aperto a SQL Injection?

Potrei sbagliarmi, non ho mai lavorato in PHP, ho appena visto l'uso delle stringhe in SQL e il campanello d'allarme ha iniziato a suonare!

Modificare:

Non sto cercando di manomettere il tuo post, stavo correggendo un errore di ortografia, per favore non tornare indietro.

Non sono sicuro di cosa intendi per "grandi quantità di dati", ma mi sembra che tu stia inizializzando i dati solo per un utente?In tal caso, non vedo alcun motivo per ottimizzarlo a meno che nel database non siano presenti centinaia di colonne con diversi megabyte di dati al loro interno.

Oppure, per dirla diversamente, perché è necessario ottimizzarlo?Hai problemi di prestazioni?

Quello che stai facendo ora è un approccio diretto e non vedo alcun motivo per farlo diversamente a meno che tu non abbia qualche problema specifico con esso.

Tuttavia, racchiudere i dati dell'utente in un oggetto utente potrebbe aiutare alcuni nella struttura del programma.Anche convalidare il tuo input è probabilmente una buona idea.

@Unkwntech sembra che tu abbia ragione, ma segue un Google, che ha guidato Qui sembra che tu voglia passare a mysql_real_escape_string()

Per quanto riguarda la modifica, ho corretto l'ortografia di efficiente oltre a rimuovere il "cos'è il"..Dal momento che non è realmente richiesto poiché l'argomento dice tutto.

Puoi rivedere la cronologia delle modifiche (che evidenzia bene le modifiche effettive) facendo clic su "modificato un minuto fa" testo in fondo alla tua domanda.

Prova a utilizzare json ad esempio:

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

L’implementazione di quella funzione è più rapida di quella che sta già facendo?

Qualcun altro ha problemi ad inserire ] nel markdown?Lo devo incollare

Sì, è disturbato.

@Anders: ci sono qualcosa come 50-75 colonne.

Ancora una volta, a meno che ciò non causi effettivamente problemi di prestazioni nella tua applicazione, non mi preoccuperei di ottimizzarla.Se, tuttavia, le prestazioni sono un problema, prenderei in considerazione la possibilità di ottenere inizialmente solo alcuni dati e di caricare lentamente le altre colonne quando sono necessarie.

Se il suggerimento di Unkwntech funziona davvero, ti suggerisco di cambiare il tuo SELECT istruzione in modo che non prenda tutto, poiché la colonna della password sarebbe uno di quei campi.

Per quanto riguarda la necessità o meno di tenere queste cose nella sessione, dico: perché no?Se hai intenzione di controllare il DB quando l'utente accede (suppongo che ciò verrebbe fatto allora, no?) In ogni caso, potresti anche memorizzare informazioni abbastanza non sensibili (come il nome) nella sessione se pianifichi sull'utilizzo di tali informazioni durante la visita della persona.

Non è tanto che causi problemi di prestazioni, ma vorrei che il codice sembrasse un po' più pulito.

Quindi racchiudi i dati dell'utente in una classe.La modifica diretta di $_SESSION sembra un po' sporca.Se vuoi conservare i dati in un dizionario, cosa che puoi comunque fare anche se li inserisci in una classe separata.

Potresti anche implementare un ciclo che scorre su tutte le colonne, ottiene i loro nomi e copia i dati su una mappa con gli stessi nomi di chiave.In questo modo le variabili interne, denominate in base alla chiave nel dizionario, e i nomi delle colonne del database sarebbero sempre gli stessi.(Ciò ha anche lo svantaggio di cambiare il nome della variabile quando si cambia il nome della colonna nel database, ma questo è un compromesso abbastanza comune e ben accettato.)

Prova a utilizzare json ad esempio:

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

ModificarePiù tardi allora json_decode IL $_SESSION['data'] variabile e hai un array con tutti i dati di cui hai bisogno.

Una precisazione:

Puoi usare json_encode E json_decode se vuoi ridurre il numero di righe di codice che scrivi.Nell'esempio della domanda era necessaria una riga di codice per copiare ciascuna colonna del database nell'array SESSION.Invece di farlo con 50-75 righe di codice, potresti farlo con 1 by json_encoding l'intero record del database in una stringa.Questa stringa può essere memorizzata nella variabile SESSION.Successivamente, quando l'utente visita un'altra pagina, la variabile SESSION è presente con l'intera stringa JSON.Se poi vuoi conoscere il nome, puoi utilizzare il seguente codice:

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

Questo metodo non sarà più veloce di una copia riga per riga, ma salverà la codifica e sarà più resistente alle modifiche nel database o nel codice.

A propositoQualcun altro ha problemi ad inserire ] nel markdown?Lo devo incollare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top