Foros del Web » Programando para Internet » PHP »

Ordenar registros de modo ascendente y descendente en un solo click

Estas en el tema de Ordenar registros de modo ascendente y descendente en un solo click en el foro de PHP en Foros del Web. Saludos, espero alguien me pueda orientar en esto. Tengo este code Código PHP: $item = $_GET [ 'var' ]; $var [ 0 ]= "id" ; ...
  #1 (permalink)  
Antiguo 25/02/2009, 23:29
 
Fecha de Ingreso: julio-2008
Mensajes: 37
Antigüedad: 15 años, 9 meses
Puntos: 0
Ordenar registros de modo ascendente y descendente en un solo click

Saludos, espero alguien me pueda orientar en esto.

Tengo este code

Código PHP:
$item=$_GET['var'];
$var[0]="id";
$var[1]="cod_producto";
$var[2]="descripcion";
$var[3]="precio";
$var[4]="exento";
$var[5]="unidad_medida";
$var[6]="inventariable";
$var[7]="observacion";
$var[8]="cambio_de_sujeto";
$result=mysql_query("SELECT * FROM producto ORDER BY $item"); 
Aqui lo que hago es meter los campos de mi tabla en un arreglo, para que a la hora de que le den click en un link, por ejemplo "Codigo del Producto", se ordenen automaticamente los registros, eso lo he conseguido con esto..

Código PHP:
<a href="home.php?var=<?php echo $var[1?>">Codigo Producto</a></div></td>
En donde $var[1] va cambiando segun el usuario de click ya sea en descripcion, precio, etc.

Hasta esa parte me funciona muy bien, el detalle ahora, al darle un click por ejemplo en "precio", me ordena los registros comenzando por el numero mas chico hasta el numero mas grande.

Lo que quiero hacer es que el usuario al darle nuevamente click en "precio", ordene del mas grande al mas chico y si le vuelve a dar click, vuelva a tener del mas chico al mas grande.

Alguien podria darme alguna recomendacion??, talvez usando una funcion como on_click y on_focus, pero no tengo mucho conocimiento, ademas me supongo tendria que agregar una variable en el mysql_query, algo asi...

$definicion="asc";
$definicion="desc";
$result=mysql_query("SELECT * FROM producto ORDER BY $item $definicion");

Alguna sugerencia??
  #2 (permalink)  
Antiguo 26/02/2009, 00:25
 
Fecha de Ingreso: febrero-2009
Mensajes: 1
Antigüedad: 15 años, 2 meses
Puntos: 0
De acuerdo Respuesta: Ordenar registros de modo ascendente y descendente en un solo click

Deberías crear la nueva varible que sirva para elegir el orden y al mismo tiempo agregar un nuevo parámetro al enlace que te indique que deseas. Algo Así:

Código PHP:
$item=$_GET['var'];
$order $_GET['order']; // Aqui se establece si es ASC o DESC
$param $order=="ASC" "DESC" "ASC"
Y el enlace debería contener el parámetro:

Código PHP:
<a href="home.php?var=<?php echo $var[1?>&amp;order=<?php echo $param?>">Codigo Producto</a></div></td>
Espero te sirva
  #3 (permalink)  
Antiguo 26/02/2009, 00:43
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
Respuesta: Ordenar registros de modo ascendente y descendente en un solo click

Puedes agregarle la variable $definicion a los enlaces. O también puedes utilizar variables de sesión. Ya que te pusieron el ejemplo de lo primero, te pongo un ejemplo de lo segundo:
Código PHP:
<?php
session_start
();

if (isset(
$_GET['var'])){
    
$item $_GET['var']; // Aquí faltaría comprobar si $_GET['var'] tiene un valor permitido.
} else {
    
// Valores por defecto y re-seteo de la sesión.
    
$item 'item_1';
    
$_SESSION['ultimo_item'] = '';
}

if (!isset(
$_SESSION['ultimo_item']) || $_SESSION['ultimo_item'] != $item) {
    
// Si es la primera vez que carga la página
    // o se está cambiando el item por el que se ordena
    
$_SESSION['ultimo_item'] = $item;
    
$_SESSION['ultimo_sentido'] = 'asc';
} else {
    
// Si se hizo clic en el mismo que ya estaba ordenado antes
    // Sólo hay que cambiar el sentido:
    
if ($_SESSION['ultimo_sentido'] == 'asc') {
        
$_SESSION['ultimo_sentido'] = 'desc';
    } else {
        
$_SESSION['ultimo_sentido'] = 'asc';
    }
}

//-----------------------------------------------------------------------

echo 'SELECT los campos FROM tabla ORDER BY '.$_SESSION['ultimo_item'].' '.$_SESSION['ultimo_sentido'];
?>
<div>
    <a href="?var=item_1">Item 1</a> | 
    <a href="?var=item_2">Item 2</a> | 
    <a href="?var=item_3">Item 3</a> | 
    <a href="?var=item_4">Item 4</a>
</div>
Puedes probar este archivo y ver cómo funciona.

Saludos,
  #4 (permalink)  
Antiguo 26/02/2009, 01:13
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Ordenar registros de modo ascendente y descendente en un solo click

Yo lo haria con una matriz y 1 o 2 variables (segun el caso) en GET:

Código php:
Ver original
  1. $ordenar = array('campo1' => 'Descripcion del campo1', 'campon' => 'Descripcion del campo n');
  2. $item = (isset($_GET['var'])) ? $_GET['var'] : '';
  3. $definicion = (isset($_GET['ad'])) ? $_GET['ad'] : '';
  4.  
  5. foreach($ordenar as $ok => $ov) {
  6.     $ad = '';
  7.     if($ok == $item) {
  8.          if($definicion == '')
  9.               $ad = '&ad=DESC';
  10.          else
  11.               $ad = '';
  12.     }
  13.     echo "<td><a href=\"home.php?var=$ok$ad\">$ov</a></td>
  14. }
__________________
- León, Guanajuato
- GV-Foto
  #5 (permalink)  
Antiguo 26/02/2009, 08:08
 
Fecha de Ingreso: junio-2005
Mensajes: 343
Antigüedad: 18 años, 10 meses
Puntos: 10
Respuesta: Ordenar registros de modo ascendente y descendente en un solo click

Hay un script por ahí que se llama TableKit (en javascript.

Y dada una tabla, te la pagina, de la ordena y hace maravillas.

Buscalo, creo que te servirá mejor que lo que te han propuesto.

NOTA: Personalmente creo que es más eficiente para MySQL que se ordene en servidor y devuelva solo lo que se necesita. Pero si no hay demasiados registros (me refiero a miles de registros no a centenares) prefiero utilizar el TableKit.
  #6 (permalink)  
Antiguo 26/02/2009, 08:51
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
Respuesta: Ordenar registros de modo ascendente y descendente en un solo click

Pues ahí tienes un par de ejemplos:

Uno utiliza sesiones para no complicarse pasando una variable más ni en la construcción de enlaces. Y el otro utiliza el paso de una variable más y la construcción de enlaces para no complicarse con las sesiones. :p

Sería bueno que les dieras una mirada y entendieras ambos. Incluso si decides implementar una solución distinta como lo que propone jorgivaz. Claro, si lo que te interesa es aprender.

Saludos,
  #7 (permalink)  
Antiguo 26/02/2009, 21:04
 
Fecha de Ingreso: julio-2008
Mensajes: 37
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Ordenar registros de modo ascendente y descendente en un solo click

Probe de rapido los codigos de Axel y de Pinedo, el de triby checo y les digo, pero me quedaron dudas,

veamos el codigo de axel:

Este code me da error en la linea 4

$order = $_GET['ASC']; // Aqui se establece si es ASC o DESC


Me da este error:

Parse error: syntax error, unexpected T_VARIABLE in /home/dedit/public_html/prueba.php on line 4

Axel puso que el GET obtuviera el valor de Order, pero me arrojo el mismo error, no se exactamente a que se refiera ese $order, pero intente asignarle el valor ASC, pero con el mismo resultado.

Tambien tengo la duda de que variable se le asignaria al mysql_query, intente con el ORDER BY $item $param

Código PHP:
<?php
include("conexion.php");
$item=$_GET['$var']
$order $_GET['ASC']; // Aqui se establece si es ASC o DESC
$param "$order=='ASC'?'DESC':'ASC'";  
$item=$_GET['var'];
$var[0]="id";
$var[1]="cod_producto";
$var[2]="descripcion";
$var[3]="precio";
$var[4]="exento";
$var[5]="unidad_medida";
$var[6]="inventariable";
$var[7]="observacion";
$var[8]="cambio_de_sujeto";
$result mysql_query("SELECT * FROM producto ORDER BY $item $param");
while (
$file=mysql_fetch_array($result)){
echo 
"<table border '0'>
<tr>
<td width='100'><a href='prueba.php?var=$var[1]&amp;order=$param'>Codigo Producto</a></div></td>
<td width='100'><a href='prueba.php?var=$var[2]&amp;order=$param'>Descripcion</a></div></td>
<td width='100'><a href='prueba.php?var=$var[3]&amp;order=$param'>Precio</a></div></td>
<td width='100'><a href='prueba.php?var=$var[4]&amp;order=$param'>Exento</a></div></td>
<td width='100'><a href='prueba.php?var=$var[5]&amp;order=$param'>Unidad Medida</a></div></td>
<td width='100'><a href='prueba.php?var=$var[6]&amp;order=$param'>Inventariable</a></div></td>
<td width='100'><a href='prueba.php?var=$var[7]&amp;order=$param'>Observacion</a></div></td>
<td width='100'><a href='prueba.php?var=$var[8]&amp;order=$param'>Cambio Sujeto</a></div></td>
</tr>
<tr>
<td width='100'>$file[1]</td>
<td width='100'>$file[2]</td>
<td width='100'>$file[3]</td>
<td width='100'>$file[4]</td>
<td width='100'>$file[5]</td>
<td width='100'>$file[6]</td>
<td width='100'>$file[7]</td>
<td width='100'>$file[8]</td>
</tr>
</table>"
}
?>
Y en el codigo de Pinedo, me marco este error...

Código PHP:
Parse errorsyntax errorunexpected T_ENCAPSED_AND_WHITESPACEexpecting T_STRING or T_VARIABLE or T_NUM_STRING in /home/dedit/public_html/prueba1.php on line 37 
la linea 37 tiene esto....

Código PHP:
$result "mysql_query('SELECT * FROM producto ORDER BY '.$_SESSION['ultimo_item'].' '.$_SESSION['ultimo_sentido'].'')"
code completo:

Código PHP:
<?php
include(conexion.php);
session_start();
$var[0]="id";
$var[1]="cod_producto";
$var[2]="descripcion";
$var[3]="precio";
$var[4]="exento";
$var[5]="unidad_medida";
$var[6]="inventariable";
$var[7]="observacion";
$var[8]="cambio_de_sujeto";
if (isset(
$_GET['var'])){
    
$item $_GET['var']; // Aquí faltaría comprobar si $_GET['var'] tiene un valor permitido.
} else {
    
// Valores por defecto y re-seteo de la sesión.
    
$item 'item_1';
    
$_SESSION['ultimo_item'] = '';
}

if (!isset(
$_SESSION['ultimo_item']) || $_SESSION['ultimo_item'] != $item) {
    
// Si es la primera vez que carga la página
    // o se está cambiando el item por el que se ordena
    
$_SESSION['ultimo_item'] = $item;
    
$_SESSION['ultimo_sentido'] = 'asc';
} else {
    
// Si se hizo clic en el mismo que ya estaba ordenado antes
    // Sólo hay que cambiar el sentido:
    
if ($_SESSION['ultimo_sentido'] == 'asc') {
        
$_SESSION['ultimo_sentido'] = 'desc';
    } else {
        
$_SESSION['ultimo_sentido'] = 'asc';
    }
}

//-----------------------------------------------------------------------
$result "mysql_query('SELECT * FROM producto ORDER BY '.$_SESSION['ultimo_item'].' '.$_SESSION['ultimo_sentido'].'')";
while (
$file=mysql_fetch_array($result)){
echo 
"<table border '0'>
<tr>
<td width='100'><a href='prueba.php?var=$item_1&amp;order=$param'>Codigo Producto</a></div></td>
<td width='100'><a href='prueba.php?var=$item_2&amp;order=$param'>Descripcion</a></div></td>
<td width='100'><a href='prueba.php?var=$item_3&amp;order=$param'>Precio</a></div></td>
<td width='100'><a href='prueba.php?var=$item_4&amp;order=$param'>Exento</a></div></td>
<td width='100'><a href='prueba.php?var=$item_5&amp;order=$param'>Unidad Medida</a></div></td>
<td width='100'><a href='prueba.php?var=$item_6&amp;order=$param'>Inventariable</a></div></td>
<td width='100'><a href='prueba.php?var=$item_7&amp;order=$param'>Observacion</a></div></td>
<td width='100'><a href='prueba.php?var=$item_8&amp;order=$param'>Cambio Sujeto</a></div></td>
</tr>
<tr>
<td width='100'>$file[1]</td>
<td width='100'>$file[2]</td>
<td width='100'>$file[3]</td>
<td width='100'>$file[4]</td>
<td width='100'>$file[5]</td>
<td width='100'>$file[6]</td>
<td width='100'>$file[7]</td>
<td width='100'>$file[8]</td>
</tr>
</table>"
};
?>
  #8 (permalink)  
Antiguo 26/02/2009, 22:10
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
Respuesta: Ordenar registros de modo ascendente y descendente en un solo click

Estás cometiendo varios errores simplemente por tratar de agarrar y usar el código, sin entenderlo bien.

El código que te puse yo, funciona por sí sólo. Haz un archivo que tenga sólo eso y ejecútalo. Trata de entender cómo funciona y entonces adáptalo al tuyo.

Tus errores:
Código PHP:
    // Valores por defecto y re-seteo de la sesión.
    
$item 'item_1'
"item_1" era un valor de ejemplo. Ni siquiera existe en tu caso. En lugar de "item_1" tienes que poner el valor por defecto por el que se debe ordenar.

Código PHP:
$result "mysql_query('SELECT * FROM producto ORDER BY '.$_SESSION['ultimo_item'].' '.$_SESSION['ultimo_sentido'].'')"
Esto sí no hace falta explicarlo mucho. mysql_query() es una función, no debe ir dentro de la cadena. En mi ejemplo, te mostraba la consulta en pantalla para que veas cómo iba cambiando.

Código PHP:
href='prueba.php?var=$item_1&amp;order=$param' 
Otra vez, en tu caso no existe ninguna variable llamada $item_1. En lugar de eso van los nombres de los campos. Y tampoco existe ninguna variable llamada $param, que para eso estamos utilizando la sesión.

- Otro error que estás cometiendo es meter toda la tabla dentro del "while" con lo que generarías tooooda la tabla para cada registro. Hay que sacar la definición de la tabla y la primera fila (con los títulos). Sólo deja dentro del while la fila que se va a construir varias veces.

El código debería quedar algo así:
Código PHP:
<?php
session_start
();
include(
conexion.php);

$var[0] = 'id';
$var[1] = 'cod_producto';
$var[2] = 'descripcion';
$var[3] = 'precio';
$var[4] = 'exento';
$var[5] = 'unidad_medida';
$var[6] = 'inventariable';
$var[7] = 'observacion';
$var[8] = 'cambio_de_sujeto';

if (isset(
$_GET['var'])){
    
$item $_GET['var']; // Aquí faltaría comprobar si $_GET['var'] tiene un valor permitido.
} else {
    
// Valores por defecto y re-seteo de la sesión.
    
$item 'cod_producto'
    
$_SESSION['ultimo_item'] = '';
}

if (!isset(
$_SESSION['ultimo_item']) || $_SESSION['ultimo_item'] != $item) {
    
// Si es la primera vez que carga la página
    // o se está cambiando el item por el que se ordena
    
$_SESSION['ultimo_item'] = $item;
    
$_SESSION['ultimo_sentido'] = 'asc';
} else {
    
// Si se hizo clic en el mismo que ya estaba ordenado antes
    // Sólo hay que cambiar el sentido:
    
if ($_SESSION['ultimo_sentido'] == 'asc') {
        
$_SESSION['ultimo_sentido'] = 'desc';
    } else {
        
$_SESSION['ultimo_sentido'] = 'asc';
    }
}

//-----------------------------------------------------------------------

echo '<table border="0">
    <tr>
    <td width="100"><a href="prueba.php?var=cod_producto">Codigo Producto</a></td>
    <td width="100"><a href="prueba.php?var=descripcion">Descripcion</a></div></td>
    <td width="100"><a href="prueba.php?var=precio">Precio</a></td>
    <td width="100"><a href="prueba.php?var=exento">Exento</a></td>
    <td width="100"><a href="prueba.php?var=unidad_medida">Unidad Medida</a></td>
    <td width="100"><a href="prueba.php?var=inventariable">Inventariable</a></td>
    <td width="100"><a href="prueba.php?var=observacion">Observacion</a></td>
    <td width="100"><a href="prueba.php?var=cambio_de_sujeto">Cambio Sujeto</a></td>
    </tr>'
;


$result mysql_query('SELECT * FROM producto ORDER BY '.$_SESSION['ultimo_item'].' '.$_SESSION['ultimo_sentido']);
while (
$file mysql_fetch_array($result)){
echo 
'<tr>
        <td width="100">'
.$file[1].'</td>
        <td width="100">'
.$file[2].'</td>
        <td width="100">'
.$file[3].'</td>
        <td width="100">'
.$file[4].'</td>
        <td width="100">'
.$file[5].'</td>
        <td width="100">'
.$file[6].'</td>
        <td width="100">'
.$file[7].'</td>
        <td width="100">'
.$file[8].'</td>
    </tr>'
;

}
echo 
'</table>';
?>
Saludos,
  #9 (permalink)  
Antiguo 27/02/2009, 16:19
 
Fecha de Ingreso: julio-2008
Mensajes: 37
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Ordenar registros de modo ascendente y descendente en un solo click

Gracias Pinedo, si ya entendi como funciona, si le interesa a alguien ver como quedo, aqui lo pueden ver cm-desarrolloeditorial.com/prueba1.php

Ahora lo que quiero es que a un costado de cada link que se ordena aparezca una como flecha que apunte hacia arriba si esta en modo asc y abajo si esta en modo desc, checo y les aviso.
  #10 (permalink)  
Antiguo 27/02/2009, 20:28
 
Fecha de Ingreso: julio-2008
Mensajes: 37
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Ordenar registros de modo ascendente y descendente en un solo click

Una duda Pinedo, espero puedas ayudarme, ya hize lo del ordenador ASC y DESC, pero como este sistema tendra incluida una paginacion, es necesario que despues del Order by, tenga un Limit, la funcion que tengo esta asi...

86 $result = mysql_query("SELECT * FROM producto ORDER BY '.$_SESSION['ultimo_item'].' '.$_SESSION['ultimo_sentido'].' LIMIT $desde, $numpag");

Me marca el siguiente error...


Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /home/dedit/public_html/home.php on line 86

Intente en esta parte

ORDER BY '.$_SESSION['ultimo_item'].' '.$_SESSION['ultimo_sentido'].'

asignarle el '.,.' al inicio y final de cada $_SESSION, pero sigue igual, no se como ponerle la correcta sintaxis.
  #11 (permalink)  
Antiguo 28/02/2009, 09:04
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 15 años, 9 meses
Puntos: 416
Respuesta: Ordenar registros de modo ascendente y descendente en un solo click

Cita:
$result = mysql_query("SELECT * FROM producto ORDER BY '.$_SESSION['ultimo_item'].' '.$_SESSION['ultimo_sentido'].' LIMIT $desde, $numpag");
Empiezas con comillas dobles, pero luego para salir utilizas comillas simples. Reemplaza las comillas simples por dobles.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:40.