Pregunta

¿Cuál es la forma más rápida de obtener una gran cantidad de datos (piense en golf) y la más eficiente (piense en rendimiento) para obtener una gran cantidad de datos de una base de datos MySQL a una sesión sin tener que seguir haciendo lo que ya tengo?

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

Y antes de que alguien pregunte que sí, realmente necesito 'SELECCIONAR'

Editar:Sí, estoy desinfectando los datos para que no pueda haber inyección SQL, eso está más adelante en el código.

¿Fue útil?

Solución

Se me ocurrió esto y parece funcionar.

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

Otros consejos

Más eficiente:

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

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

Hecho.

Esto ahora está almacenado en una matriz.Entonces digamos que un campo es nombre de usuario y simplemente lo hace:

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

Los datos son el nombre de la matriz; el nombre de usuario es el campo de la matriz.que contiene el valor de ese campo.

EDITAR:Se corrigieron algunos errores de sintaxis: P, pero ya entiendes la idea.

Bien, esto no responde a tu pregunta, pero ¿tu código actual no te deja abierto a la inyección SQL?

Podría estar equivocado, nunca trabajé en PHP, ¡solo vi el uso de cadenas en SQL y comenzaron a sonar las alarmas!

Editar:

No estoy tratando de alterar tu publicación, estaba corrigiendo un error de ortografía, no retrocedas.

No estoy seguro de lo que quiere decir con "grandes cantidades de datos", pero me parece que solo está inicializando datos para un usuario.Si es así, no veo ninguna razón para optimizar esto a menos que tenga cientos de columnas en su base de datos con varios megabytes de datos.

O, para decirlo de otra manera, ¿por qué es necesario optimizar esto?¿Tiene problemas de rendimiento?

Lo que está haciendo ahora es un enfoque sencillo y realmente no veo ninguna razón para hacerlo de manera diferente a menos que tenga algunos problemas específicos.

Sin embargo, envolver los datos del usuario en un objeto de usuario podría ayudar algo en la estructura del programa.Probablemente también sea una buena idea validar su aportación.

@UnkWntech parece que tienes razón, pero siguiendo un Google, que lideró aquí Parece que es posible que quieras cambiar a mysql_real_escape_string()

En cuanto a la edición, corregí la ortografía de eficiente así como también se eliminó el “qué es el”..Dado que eso no es realmente necesario ya que el tema lo dice todo.

Puede revisar el historial de edición (que resalta muy bien los cambios reales) haciendo clic en el "editado hace un minuto" texto al final de su pregunta.

Intente usar json por ejemplo:

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

¿La implementación de esa función es más rápida que lo que ya está haciendo?

¿Alguien más tiene problemas para ingresar] en rebajas?tengo que pegarlo

Sí, tiene micrófonos.

@Anders: hay entre 50 y 75 columnas.

Nuevamente, a menos que esto realmente esté causando problemas de rendimiento en su aplicación, no me molestaría en optimizarla.Sin embargo, si el rendimiento es un problema, consideraría obtener solo algunos de los datos inicialmente y cargar de forma diferida las otras columnas a medida que sean necesarias.

Si la sugerencia de Unkwntech realmente funciona, le sugiero que cambie su SELECT declaración para que no capture todo, ya que su columna de contraseña sería uno de esos campos.

En cuanto a si es necesario o no mantener estas cosas en la sesión, digo ¿por qué no?Si va a verificar la base de datos cuando el usuario inicia sesión (supongo que esto se haría entonces, ¿no?), también puede almacenar información bastante no confidencial (como el nombre) en la sesión si planea sobre el uso de esa información durante la visita de la persona.

No es tanto que cause problemas de rendimiento sino que me gustaría que el código se viera un poco más limpio.

Luego envuelva los datos del usuario en una clase.Modificar $_SESSION directamente parece algo sucio.Si desea mantener los datos en un diccionario, lo cual aún puede hacer incluso si los coloca en una clase separada.

También puede implementar un bucle que repita todas las columnas, obtenga sus nombres y copie los datos en un mapa con los mismos nombres de clave.De esa manera, sus variables internas (nombradas por clave en el diccionario) y los nombres de las columnas de la base de datos siempre serán los mismos.(Esto también tiene la desventaja de cambiar el nombre de la variable cuando cambia el nombre de la columna en la base de datos, pero es una compensación bastante común y bien aceptada).

Intente usar json por ejemplo:

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

EditarMás tarde tú entonces json_decode el $_SESSION['data'] variable y obtuviste una matriz con todos los datos que necesitas.

Aclaración:

Puedes usar json_encode y json_decode si desea reducir la cantidad de líneas de código que escribe.En el ejemplo de la pregunta, se necesitaba una línea de código para copiar cada columna de la base de datos a la matriz SESSION.En lugar de hacerlo con 50-75 líneas de código, podrías hacerlo con 1 por json_encoding todo el registro de la base de datos en una cadena.Esta cadena se puede almacenar en la variable SESSION.Posteriormente, cuando el usuario visita otra página, la variable SESSION está ahí con la cadena JSON completa.Si luego desea saber el nombre, puede utilizar el siguiente código:

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

Este método no será más rápido que una copia línea por línea, pero ahorrará codificación y será más resistente a los cambios en su base de datos o código.

POR CIERTO¿Alguien más tiene problemas para ingresar] en rebajas?Tengo que pegarlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top