Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: дٳŦ٭ en 13 Julio 2009, 19:41 pm



Título: Ordenar registros
Publicado por: дٳŦ٭ en 13 Julio 2009, 19:41 pm
Hola PHPecheros,

Tengo una duda, que más que duda siento es error de lógica:

Tengo una tabla "banner":

Código:
mysql> describe banner;
+---------------+------------------+------+-----+---------+----------------+
| Field         | Type             | Null | Key | Default | Extra          |
+---------------+------------------+------+-----+---------+----------------+
| id_banner     | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| nombre        | varchar(45)      | YES  |     | NULL    |                |
| archivo       | varchar(200)     | YES  |     | NULL    |                |
| thumbnail     | varchar(200)     | YES  |     | NULL    |                |
| ventana_nueva | tinyint(1)       | YES  |     | NULL    |                |
| url           | varchar(255)     | YES  |     | NULL    |                |
| activo        | tinyint(1)       | YES  |     | 1       |                |
| borrado       | tinyint(1)       | YES  |     | 0       |                |
| altura        | int(11)          | NO   |     |         |                |
| anchura       | int(11)          | NO   |     |         |                |
| defront       | tinyint(1)       | NO   |     |         |                |
| slot          | int(10) unsigned | NO   | UNI |         |                |
+---------------+------------------+------+-----+---------+----------------+
12 rows in set (0.00 sec)

En donde verán un campo llamado slot(int) que sirve para almacenar de 1 a N (sin que se repitan), esto se hace para ordenar de forma visual mis registros. La duda radica es cómo hacer un manager para controlar el orden.

Lo que hice fue hacer una lista con un par de flechas por cada registro, si es el slot==1 no pongo la flecha hacia "arriba", y de igual forma si es el último slot no pongo la que apunta hacia abajo.

La funcionalidad de "subir" ya quedó OK, sin embargo la bajada nop..  :-\

Los parámetros que mando por cada registro en el link son:

Código:
order=down&id_banner=1&slot=1&idnextslot=2

Donde id_banner es el ID del registro, el slot es el número de slot que tiene y el idnextslot es el slot siguiente.

En mis querys tengo lo siguiente:

Código
  1. //--------------------------------------------------------------+
  2. // Case Down |
  3. //--------------------------------------------------------------+
  4. if($var['order']=="down"){
  5. //--------------------------------------------------------------+
  6. // First get the next Number ID slot and ID_banner |
  7. //--------------------------------------------------------------+
  8. $DBQuery->attrib['query'] = "SELECT id_banner, slot FROM `banner` WHERE `id_banner` ='".$var['idnextslot']."'";
  9. //echo $DBQuery->attrib['query']."<br>";
  10. $getNextSlot = $DBQuery->RunQuery();
  11.  
  12. //--------------------------------------------------------------+
  13. // Update the original entry with the new id_slot |
  14. //--------------------------------------------------------------+
  15. $DBQuery->attrib['query'] = "UPDATE `banner` SET `slot` = '".$var['idnextslot']."' WHERE `id_banner` ='".$var['id_banner']."'";
  16. //echo $DBQuery->attrib['query']."<br>";
  17. $downSlot=$DBQuery->RunQuery();
  18.  
  19. //--------------------------------------------------------------+
  20. // Update the entry target with the old slot |
  21. //--------------------------------------------------------------+
  22. $DBQuery->attrib['query'] = "UPDATE `banner` SET `slot` = '".$var['slot']."' WHERE `id_banner` ='".$getNextSlot[0]['id_banner']."'";
  23. //echo $DBQuery->attrib['query']."<br>";
  24. $downSlot=$DBQuery->RunQuery();
  25.  
  26. }
  27.  

Simplemente no funciona.. me actualiza los registros mal  :xD  :-\, me pone slot's elevados y a veces menores. A ver si me podeis echar un cable.. gracias  :)


Título: Re: Ordenar registros
Publicado por: дٳŦ٭ en 13 Julio 2009, 20:05 pm
Ya pude xDDDD

Se los dejo por si lo llegan a usar:

Código
  1. <?php
  2. //--------------------------------------------------------------+
  3. // Include module settings |
  4. //--------------------------------------------------------------+
  5. require_once("settings.php");
  6. //--------------------------------------------------------------+
  7. // Case Up |
  8. //--------------------------------------------------------------+
  9. if($var['order']=="up"){
  10. //--------------------------------------------------------------+
  11. // First get the pre Number ID slot |
  12. //--------------------------------------------------------------+
  13. $DBQuery->attrib['query'] = "SELECT slot FROM `banner` WHERE `id_banner` ='".$var['idpreslot']."'";
  14. //echo $DBQuery->attrib['query'];
  15. $getPreSlot = $DBQuery->RunQuery();
  16.  
  17. //--------------------------------------------------------------+
  18. // Update the pre item with last number ID slot |
  19. //--------------------------------------------------------------+
  20. $DBQuery->attrib['query'] = "UPDATE `banner` SET `slot` = '".$var['slot']."' WHERE `id_banner` ='".$var['idpreslot']."'";
  21. //echo $DBQuery->attrib['query'];
  22. $upPreSlot=$DBQuery->RunQuery();
  23.  
  24. //--------------------------------------------------------------+
  25. // As finaly, update the item with pre number ID slot |
  26. //--------------------------------------------------------------+
  27. $DBQuery->attrib['query'] = "UPDATE `banner` SET `slot` = '".$getPreSlot[0]['slot']."' WHERE `id_banner` ='".$var['id_banner']."'";
  28. //echo $DBQuery->attrib['query'];
  29. $upSlot=$DBQuery->RunQuery();
  30. }
  31. //--------------------------------------------------------------+
  32. // Case Down |
  33. //--------------------------------------------------------------+
  34. if($var['order']=="down"){
  35. //--------------------------------------------------------------+
  36. // First get the next Number ID slot and ID_banner |
  37. //--------------------------------------------------------------+
  38. $DBQuery->attrib['query'] = "SELECT id_banner, slot FROM `banner` WHERE `slot` ='".$var['idnextslot']."'";
  39. //echo $DBQuery->attrib['query']."<br>";
  40. $getNextSlot = $DBQuery->RunQuery();
  41.  
  42. //--------------------------------------------------------------+
  43. // Update the original entry with the new id_slot |
  44. //--------------------------------------------------------------+
  45. $DBQuery->attrib['query'] = "UPDATE `banner` SET `slot` = '".$var['idnextslot']."' WHERE `id_banner` ='".$var['id_banner']."'";
  46. //echo $DBQuery->attrib['query']."<br>";
  47. $downSlot=$DBQuery->RunQuery();
  48.  
  49. //--------------------------------------------------------------+
  50. // Update the entry target with the old slot |
  51. //--------------------------------------------------------------+
  52. $DBQuery->attrib['query'] = "UPDATE `banner` SET `slot` = '".$var['slot']."' WHERE `id_banner` ='".$getNextSlot[0]['id_banner']."'";
  53. //echo $DBQuery->attrib['query']."<br>";
  54. $downSlot=$DBQuery->RunQuery();
  55.  
  56. }
  57.  
  58. Location("index.php?action=".$lo_mod_name.".banshort");
  59. ?>
  60.  

Igual y no le entienden porque es parte de un FM que estoy haciendo pero bueno, cualquier consejo es bienvenido  :)


Título: Re: Ordenar registros
Publicado por: [u]nsigned en 13 Julio 2009, 20:56 pm
No te entendi bien..

Si lo que querias hacer era mostrar los registros en forma creciente o decreciente respecto a SLOT, no hubiera bastado con esto?:
Citar
...ORDER BY slot [ASC / DESC]


Y para decidir si poner la flecha o no, y si para arriba o para abajo usar algo del tipo:
Código
  1. $cont = mysql_num_rows($result);
  2. $control = $cont;
  3. while(mysql_fetch_assoc($result)
  4. {
  5.   /*printar demas datos del registro*/
  6.   if($cont == $control)///motrar solo flecha arriba
  7.   elseif($cont > $control && $control >0)//mostrar amabas
  8.   else //mostrar solo flecha abajo
  9.   $control--;
  10.  
  11. }

Y asi lo unico que cambias es la QUERY (de hecho solo una parte de ella) y te ahorras de codear dos veces basicamente lo mismo?  :huh: claro que mi ejemlo deberia adaptarse al trabajo en POO y a tu FM..

Saludos


Título: Re: Ordenar registros
Publicado por: дٳŦ٭ en 13 Julio 2009, 23:43 pm
Citar
Si lo que querias hacer era mostrar los registros en forma creciente o decreciente respecto a SLOT, no hubiera bastado con esto?:

mmm sí, ahí no tengo problema.

El problema es por la lógica que hago en los querys.. un amigo me dice que primero dependiendo de el lado (arriba o abajo) revisar si hay registros con ese numero de slot, traerlo y borrarlo, después mover el que quieres subir, osea editar su # de slot y añades el anterior slot en la posicion de el seleccionado.

Saludos.


Título: Re: Ordenar registros
Publicado por: ^Tifa^ en 24 Julio 2009, 17:37 pm
Esta super :)

usar oder by sin ninguna condicion por defecto se coloca el orden de registro ascendente. Ahora en relacion a la estructura de tu tabla (Que no digo que este mal) solo en tu caso no estas utilizando ninguna de las formas de normalizacion que implica diseno de tabla (Pero obviare esa parte eres un desarrollador no un DBA)

pero de consejo seria recomendable al menos usar la forma de normalizacion numero uno, no dejes registros con valores nulos por defecto esto relantiza la busquedad en las tablas a la hora de consultas   ;) las DB relacionales guardan direccion en memoria para un tipo de dato primitivo (int, char, varchar, decimal, etc...) sin embargo NULL no pertenece a un tipo de dato del cual se reservo espacio para el... Asigna un valor por default a cada registro en caso que vayan a dejar nulos.

Varchar(255)... bueno es lo estandar, pero recuerda que varchar guarda datos texto de tamano variable.. imagina que de esos 255 solo se inserte 80 caracteres en 1 registro, luego en la segunda insercion 125 caracteres, luego en otra insercion 200 caracteres.... al varchar ser de tamano variable quedan registros de distintos tamanos reservados en memoria, sin embargo datos tipo char de 255 insertas data de 80, 20, 200 caracteres y el resto es rellenado de ceros :) por ende le saca ventaja al espacio asignado, y es mas optimizado y estable char que varchar.. pero para gustos.



Título: Re: Ordenar registros
Publicado por: дٳŦ٭ en 24 Julio 2009, 20:16 pm
Esta super :)

usar oder by sin ninguna condicion por defecto se coloca el orden de registro ascendente. Ahora en relacion a la estructura de tu tabla (Que no digo que este mal) solo en tu caso no estas utilizando ninguna de las formas de normalizacion que implica diseno de tabla (Pero obviare esa parte eres un desarrollador no un DBA)

pero de consejo seria recomendable al menos usar la forma de normalizacion numero uno, no dejes registros con valores nulos por defecto esto relantiza la busquedad en las tablas a la hora de consultas   ;) las DB relacionales guardan direccion en memoria para un tipo de dato primitivo (int, char, varchar, decimal, etc...) sin embargo NULL no pertenece a un tipo de dato del cual se reservo espacio para el... Asigna un valor por default a cada registro en caso que vayan a dejar nulos.

Varchar(255)... bueno es lo estandar, pero recuerda que varchar guarda datos texto de tamano variable.. imagina que de esos 255 solo se inserte 80 caracteres en 1 registro, luego en la segunda insercion 125 caracteres, luego en otra insercion 200 caracteres.... al varchar ser de tamano variable quedan registros de distintos tamanos reservados en memoria, sin embargo datos tipo char de 255 insertas data de 80, 20, 200 caracteres y el resto es rellenado de ceros :) por ende le saca ventaja al espacio asignado, y es mas optimizado y estable char que varchar.. pero para gustos.



En efecto, tienes toda la razón corazón  :), ya las he cambiado. Saludos