2012-02-12 14 views
6

sto ottenendo questo:L'array di recupero MySQL aggiunge valori duplicati?

Array 
(
[0] => 1 
[id] => 1 
[1] => 778613c4344dbc9565c359c1154c6a18 
[session] => 778613c4344dbc9565c359c1154c6a18 
[2] => fn 
[first_name] => fn 
[3] => ln 
[last_name] => ln 
[4] => un 
[username] => un 
[5] => 016e6128e8ca9dda1b310c364d9b622c 
[password] => 016e6128e8ca9dda1b310c364d9b622c 
[6] => address 
[email] => address 
[7] => 100 
[permission] => 100 
[8] => 10 
[year_level] => 10 
[9] => 
[department] => 
[10] => Sample 
[campus] => Sample 
[11] => 0 
[logo_url] => 0 
) 

Dopo aver eseguito questo

$user = mysql_fetch_array(mysql_query("SELECT session FROM users WHERE username='$cookie[username]' AND first_name='$cookie[first_name]' AND last_name='$cookie[last_name]' AND campus='$cookie[campus]' AND id='$cookie[id]'")) 

Tutte le idee perché esso è la duplicazione di come questo? Grazie

EDIT: Penso che la chiave primaria stia facendo questo. Qualche idea su come fermarlo?

risposta

13

Se non si specifica un tipo di risultato come secondo parametro, mysql_fetch_array() stabilizzeremo a MYSQL_BOTH(citando):

Utilizzando MYSQL_BOTH (default), si otterrà un allineamento con entrambi gli indici associativi e numerici.


Se questo non è quello che si vuole è, è necessario passare un secondo parametro a quella funzione, per indicare che tipo di risultati che si desidera.

Ad esempio, per ottenere solo un array associativo con i nomi di colonne come chiavi:

$result = mysql_query("SELECT session FROM users WHERE username='$cookie[username]' AND first_name='$cookie[first_name]' AND last_name='$cookie[last_name]' AND campus='$cookie[campus]' AND id='$cookie[id]'"); 
$user = mysql_fetch_array($result, MYSQL_ASSOC); 


Come sidenote:

  • Assicurarsi che si sta fuggendo le variabili di iniezione nella query , per impedire SQL Injections, utilizzando, ad esempio, mysql_real_escape_string()
  • Prima di utilizzare mysql_fetch_array(), è necessario verificare se mysql_query() ha avuto esito positivo,
  • E, soprattutto per un nuovo progetto, è necessario utilizzare mysqli o PDO e non le precedenti funzioni mysql_* - vedere Choosing an API.
+0

-1 per ripetere vecchie sciocchezze. l'escape non ha nulla a che fare con le Iniezioni SQL, ma i "valori" di fuga irrispettosi renderanno possibile l'iniezione. –

+0

Bene, assicurandosi che i dati iniettati nelle query SQL siano * sicuri * ha a che fare con le Iniezioni SQL; e sfuggire a stringhe è un modo per assicurarsi che siano * sicuri *; Tuttavia, ammetto che avrei potuto aggiungere che la stessa idea dovrebbe essere applicata per i valori non stringa, come gli interi * (assicurandoci che contengano davvero interi, con 'intval()' per esempio) * –

+0

di nuovo un'illusione. l'escaping non rende i dati * "sicuri" *. è semplicemente una formattazione. E sicuramente devi usarlo (per le stringhe) non per sicurezza, ma solo per mantenere il tuo SQL coerente.Integers non è un caso isolato, l'identificatore è un altro esempio di completa e totale inutilità di escape che avrebbe dovuto rendere i "valori" "sicuri" –

1

Provare il secondo parametro MYSQL_ASSOC o MYSQL_NUM. MYSQL_BOTH è impostato di default, restituendo sia numeri di serie che chiavi di campo.

1

Pascal MARTIN ha già spiegato il motivo.

Ti dirò di utilizzare mysql_fetch_assoc Ti fornirà solo l'array associato. La parte numerica non sarà presente.