2012-05-01 10 views
8

quiero hacer algo como esto:¿Puedo simplemente SELECCIONAR una columna en MYSQL en lugar de todas, para hacerlo más rápido?

$query=mysql_query("SELECT userid FROM users WHERE username='$username'"); 
$the_user_id= ..... 

Porque todo lo que quiero es el ID de usuario que corresponde al nombre de usuario.

La forma más habitual sería que:

$query=mysql_query("SELECT * FROM users WHERE username='$username'"); 
while ($row = mysql_fetch_assoc($query)) 
    $the_user_id= $row['userid']; 

Pero hay algo más eficiente que este? Muchas gracias, saludos

+0

Seleccionar solo lo que necesita es una buena práctica. ¿Tienes algún problema en particular con eso? – zerkms

+0

http://stackoverflow.com/questions/811153/php-simple-way-to-read-single-record-from-mysql –

+0

Hola, de hecho, no sé cómo hacer la segunda línea, es decir, declarar una variable y le asigna el resultado de la consulta. – eric01

Respuesta

13

Has dado en el clavo justo en la cabeza: lo que quieres hacer es SELECT userid FROM users WHERE username='$username'. Pruébalo, funcionará :)

SELECT * es casi siempre una mala idea; es mucho mejor especificar los nombres de las columnas que desea que devuelva MySQL. Por supuesto, todavía necesitará usar mysql_fetch_assoc o algo similar para obtener realmente los datos en una variable de PHP, pero al menos esto ahorra a MySQL la sobrecarga de enviar todas estas columnas que de todos modos no utilizará.

Como un lado, es posible que desee utilizar la biblioteca más nueva de mysqli o PDO en su lugar. Estos también son mucho más eficientes que la antigua biblioteca mysql, que está en desuso.

+0

Hola, gracias por su respuesta. Pero mi problema es que no sé cómo asignar ese valor a la declaración de la variable '$ the_user_id = ...' Recuerdos – eric01

+1

Aún necesita usar el código que ya escribió usando 'mysql_fetch_asoc'; evitar esto 'SELECT *' simplemente le ahorra a MySQL una gran cantidad de sobrecarga porque puede evitar el envío de datos que no utilizará. – Daan

+0

Gracias por su explicación. Estoy leyendo sobre DOP. Saludos – eric01

3

La forma "habitual" es solo seleccione las columnas que necesita.

Cualquier columna que sea parte de la selección y no sea necesaria ralentizará la recuperación. En parte debido al tráfico de red y en parte porque el motor de base de datos puede aplicar ciertas optimizaciones si solo se seleccionan algunas columnas.

Y select * generalmente está mal visto en el código de producción.

3

Su consulta es correcta:

$query = mysql_query("SELECT userid FROM users WHERE username='$username'"); 

Esto funcionará si se hace correctamente . Tenga en cuenta que $username debe escaparse correctamente con mysql_real_escape_string. Recomiendo consultar las consultas parametrizadas para reducir el riesgo de introducir una invulnerabilidad de inyección SQL.

Otra cosa que puede cambiar es utilizar mysql_result en lugar de su bucle:

$the_user_id = mysql_result($result, 0); 

Esto supone que sabe que tendrá una sola fila.

3

No solo puede, sino que debería hacerlo. Desafortunadamente, muchos desarrolladores jóvenes adquieren el hábito de seleccionar demasiados datos. Una vez que ejecuta su consulta, no necesita hacer un ciclo while ya que solo tiene un registro que regresa. En su lugar, sólo tiene que utilizar los siguientes:

$sql = sprintf("SELECT userid FROM users WHERE username = '%s'", $username); 
$result = mysql_query($sql) or die(mysql_error()); 
$data = mysql_result($result, 0); 

if ($data) echo $data; // first userid returned 

El segundo parámetro de mysql_result() es el índice de la fila que desea recuperar. 0 es primero.

1

Sí, ¡esa es una gran práctica de optimización!

Además, si quieres ir un paso más allá y hacer que sea muy optimizada y trate de añadir un límite, así: $query=mysql_query("SELECT userid FROM users WHERE username='$username' LIMIT 1");

Esto, por supuesto, asume que esperar solo se obtiene un ID de usuario y la voluntad hacer que el motor de base de datos se detenga una vez que lo encuentre.

Pero, lo más importante: SIEMPRE ESCAPE/SANITIZE SUS DATOS DE ENTRADA! (No puedo enfatizar esto lo suficientemente bien)

0

Usted puede hacer esto con una sola línea de código

echo array_values(mysqli_fetch_array($mysqli->query("SELECT name FROM user WHERE id='$userid'")))[0]; 

debe conectarse a la base de datos como se muestra a continuación antes de utilizar este

$mysqli = new mysqli('HOST', 'USERNAME', 'PASSWORD', 'DATABASE'); 

Créditos a @samuel t thomas

Cuestiones relacionadas