2012-02-12 20 views
6

Me estoy haciendo esto:MySQL fetch array agrega valores duplicados?

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 
) 

Después de ejecutar este

$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]'")) 

Cualquier idea por qué se está duplicando de esta manera? Gracias

EDIT: Creo que la clave principal es hacer esto. ¿Alguna idea sobre cómo detenerlo?

Respuesta

13

Si no se especifica un tipo de resultado como segundo parámetro, mysql_fetch_array() tomaría el valor MYSQL_BOTH(citando):

Mediante el uso de MYSQL_BOTH (por defecto), obtendrá una matriz con ambos índices asociativos y números.


Si esto no es lo que quiere, tiene que pasar un segundo parámetro a la función, para indicar qué tipo de resultados que desea.

Por ejemplo, sólo para obtener una matriz asociativa con los nombres de las columnas como claves:

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


Como comentario:

  • Asegúrese de que está escapando de las variables se inyecta en su consulta , para evitar SQL Injections, usando, por ejemplo, mysql_real_escape_string()
  • Antes de usar mysql_fetch_array(), debe probar si mysql_query() fue exitoso,
  • Y, especialmente para un nuevo proyecto, debe usar mysqli o PDO, y no las antiguas funciones mysql_* - consulte Choosing an API.
+0

-1 para repetir viejas tonterías. escaparse no tiene nada que ver con las inyecciones SQL, pero los "valores" irreflexivos harán que la inyección sea posible. –

+0

Bueno, asegurarse de que los datos inyectados en consultas SQL sean * seguros * tiene que ver con Inyecciones de SQL; y escapar de cadenas es una forma de asegurarse de que sean * seguras *; Aún así, admito que podría haber agregado que la misma idea debería aplicarse a valores que no sean cadenas, como enteros * (asegurándose de que realmente contengan números enteros, con 'intval()' por ejemplo) * –

+0

un viejo delirio de nuevo. escaparse no hace que los datos * sean "seguros" *. es simplemente un formateo. Y seguramente debe usarlo (para cadenas) no por la seguridad que sea, sino simplemente para mantener su SQL consistente.Enteros no es el único caso, el identificador es otro ejemplo de completa e inutilidad de escape que se suponía que haría sus "valores" "seguros" –

1

Pruebe el segundo parámetro MYSQL_ASSOC o MYSQL_NUM. MYSQL_BOTH está activado de forma predeterminada, y regresa con las teclas numéricas y de campo.

1

Pascal MARTIN ya explicó el motivo.

Te diré que uses mysql_fetch_assoc Te dará solo la matriz asociada. La parte numérica no estará presente.

Cuestiones relacionadas