entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

PHP+MySQL (order by con limit)

Hola a todos,

Os pongo en contexto, programando en php estoy haciendo consultas a mysql.

Me ha surgido la necesidad de hacer una consulta ordenada por un campo que podra ser ascendente o descendente y con un limite de lineas.

El tema es que yo probaba con la siguiente consulta, la cual devuelve el resultado ASCENDENTE:
SELECT * FROM personas ORDER BY id DESC LIMIT 0,5

De forma gráfica he conseguido en phpmyadmin la sentencia que lo hace DESCENDIENTE:
SELECT * FROM personas ORDER BY personas.id DESC LIMIT 0,5

El matiz es que la segunda consulta hace el ORDER BY con tabla.campo y yo lo hacia con campo, tampoco devuelve error pero simplemente lo devolvía ascendiente que es el por defecto..

Y me pongo manos a la obra, añado lo de 'personas' antes de 'id' en el order by...
$sql="SELECT * FROM personas ORDER BY 'personas'.'id' ASC LIMIT 0,5";

también he probado sin comillas en personas:
$sql="SELECT * FROM personas ORDER BY personas.'id' ASC LIMIT 0,5";

y otras combinaciones pero no doy con la sintaxis correcta para que haga lo mismo que el phpmyadmin cuando hace 'persona'.'id'...

Lo único que he podiodo conseguir de información es este Notice:
Notice: Trying to get property of non-object in C:\Program Files (x86)\XAMPP\htdocs\agenda\index.php on line 59

Pongo el código que se corresponde a tal error, siendo la de negrita la tal 59:

<?php
$sql="SELECT FROM personas ORDER BY '".$_SESSION['campo']."' 'personas'.'".$_SESSION['orden']."' LIMIT
".$_SESSION['registro'].",5";
$result = $con->query($sql);
if($result->num_rows > 0){*
while($row=$result->fetch_assoc()){
echo '<tr>
<td>'.$row['id'].'</td>
<td>'.$row['apellido1'].' '.$row['apellido2'].'</td>
<td>'.$row['nombre'].'</td>
<td>'.$row['telefono'].'</td>
<td><a href="#">Ver</a></td>
<td><a href="#">Cambiar</a></td>
<td><a href="#">Borrar</a></td>
</tr>';
}
}
mysqli_close($con);
?>

Yo creo que no es la 59, simplemente esa ejecuta la query y por eso da el error, estoy convencido que es por la sintaxis de tabla.campo que no se trasladarla del phpmyadmin al codigo PHP,

¿Alguien puede echarme una mano o sabe la sintaxis correcta para pasar el código?

Muchas gracias de antemano.
Un saludo

1 Respuesta

1voto

Leonardo-Tadei Puntos227320

Hola badgyver,

el PHPMyAdmin a veces agrega el nombre de la tabla antes del nombre de los campos y a veces no. En caso de estar haciendo la query a una sola tabla, agregar el nombre de la tabla antes del campo es superfluo. Si es a más de una tabla que no tienen el campo repetido, también; en cambio si es más de una tabla que tienen el mismo nombre de campo sí hace falta ponerlo, porque si no la query es ambigua: la DB no sabe a cual de los campos te referís.

Volviendo a tu ordenamiento, debés de haber visto algo mal en las salidas, ya que para ver el resultado ascendente por el ID la query es:

$sql="SELECT * FROM personas ORDER BY 'id' LIMIT 0,5"; // ascendente es el default

y para obtener el resultado descendente es:

$sql="SELECT * FROM personas ORDER BY 'id' DESC LIMIT 0,5";

El error que tiene tu código PHP al concatener las variables es que pusiste el nombre de la tabla personas después del nombre del campo en lugar de antes.

Ante la duda y para debugguear, recordá que podés hacer un print($sql) antes de ejecutar la query para ver como queda armada una vez que se reemplazan las variables. De esa forma también podés copiar y pegar la salida en PHPMyAdmin y ver si se ejecuta o no y con qué errores.

Saludos cordiales.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta