Foros del Web » Programando para Internet » PHP »

-Aporte- Función AutoID

Estas en el tema de -Aporte- Función AutoID en el foro de PHP en Foros del Web. Saludos, Compañeros hoy no vengo a consultarles o preguntarles algo, el motivo de este foro será darles un aporte de código de PHP. Les explico ...
  #1 (permalink)  
Antiguo 21/01/2010, 12:06
Avatar de De_la_Cuesta_13  
Fecha de Ingreso: abril-2009
Ubicación: Cali, Colombia.
Mensajes: 265
Antigüedad: 15 años
Puntos: 14
Información -Aporte- Función AutoID

Saludos,

Compañeros hoy no vengo a consultarles o preguntarles algo, el motivo de este foro será darles un aporte de código de PHP. Les explico un poco de que se trata:

En días pasados, cansado de la poca utilidad y óptimo uso que se puede tener utilizando un campo como autoincrement en alguna tabla de MySQL, decide escribir una función que me hiciera eso que aquella función hace, pero con más usabilidad. Por ejemplo:

Tengo los siguientes ID gracias al autoincrement: 1-2-3. Por supuesto que el siguiente será 4. Pero si tengo: 1-3, el próximo será: 4. Además, si borrase todos mis datos de la tabla que trabaja con autoincrement (suponiendo que mis ID eran: 1-2-3), con la tabla vacía insertando un nuevo dato su ID será 4. A diferencia, el código que les presento busca los ID faltantes (en el caso que tuviéramos: 1-3, el nuevo ID será: 2), o en caso que no hayan datos (sea que recién creaste la tabla o la BD, o borraste todos los datos que existían) el nuevo ID será: 1. - Espero haberme hecho entender correctamente-

A continuación les presento su uso:

conexion.php
Código PHP:
Ver original
  1. <?php
  2. /*
  3. Autor: De|aCuesta.
  4. Comentario: Enjoy it. ;-)
  5. */
  6.  
  7. function Conectarse(){
  8.  
  9. ##============================================================================================
  10. ## Configurar Conexión
  11. ##============================================================================================
  12.  
  13. $server="localhost";    ##Servidor
  14. $user="";               ##Usuario
  15. $password="";       ##Password
  16. $database="";           ##Base de Datos
  17.  
  18. ##============================================================================================
  19.  
  20. $conn=@mysql_connect("$server","$user","$password");
  21. $conn_db=@mysql_select_db("$database",$conn);
  22.  
  23. if(!$conn){
  24. echo "<br/><div align='center'
  25. style='font-family: Verdana; font-size:22px;font-weight: bold;color:red;'>
  26. ERROR CONECTANDO A LA BASE DE DATOS</div>";
  27. exit();
  28. }
  29.  
  30. if (!$conn_db){
  31. echo "<br/><div align='center'
  32. style='font-family: Verdana; font-size:22px;font-weight: bold;color:red;'>
  33. ERROR SELECCIONANDO LA BASE DE DATOS</div>";
  34. exit();
  35. }
  36.  
  37. return $conn;
  38.  
  39. }
  40.  
  41. Conectarse();
  42.  
  43. ?>
Nota: El anterior código se conecta con la BD.

funct_autoID.php
Código PHP:
Ver original
  1. <?
  2. /*
  3. Autor: De|aCuesta.
  4. Comentario: Enjoy it. ;-)
  5. */
  6.  
  7. include("conexion.php"); ## Fichero para conectarnos a la BD.
  8.  
  9. ## $tabla_bd: Es el valor que se recibe como nombre de la tabla donde vamos a obtener nuestro nuevo ID.
  10. ## $campo_bd: Es el campo numérico (de tipo entero) que vamos a consultar para tener el nuevo ID.
  11.  
  12. function funct_autoID($tabla_bd,$campo_bd){
  13.  
  14. $conn=Conectarse();## Nos conectamos a la BD.
  15.  
  16. ## Consultamos los ID existentes
  17. $ssql  = "SELECT $campo_bd FROM $tabla_bd order by $campo_bd";
  18. $rs = mysql_query($ssql,$conn);
  19.  
  20. $i=0;
  21.  
  22. if (mysql_num_rows($rs)!=0){
  23.  
  24.     while ($row=mysql_fetch_array($rs)){
  25.    
  26.         $datos[$i]=$row["$campo_bd"];
  27.         $i++;
  28.     }
  29. }
  30.  
  31. $val_max=$datos[$i-1];      ## Valor máximo de ID existentes.
  32. $total_val=count($datos);   ## Total de datos existentes.
  33. $p=0;$l=0;
  34.  
  35. ## Buscando ID disponibles
  36. for($j=1;$j<=$val_max;$j++){
  37.    
  38.     for($k=0;$k<$total_val;$k++){
  39.    
  40.         if($j==$datos[$k])
  41.             break;
  42.            
  43.         else
  44.             $p++;
  45.        
  46.         if($p==$total_val){
  47.             $val_disp[$l]=$j;
  48.             $l++;
  49.             }          
  50.     }
  51.     $p=0;
  52. }
  53.  
  54. ## Asignamos el nuevo ID
  55. if(count($val_disp)==0)
  56.     $id_new=$val_max+1;
  57. else
  58.     $id_new=$val_disp[0];
  59.  
  60. return ($id_new);  
  61.  
  62.  
  63. }
  64. ?>
Nota: Creo que queda claro cual es el uso del código anterior.

Y ahora el uso:
index.php
Código PHP:
Ver original
  1. <?
  2. /*
  3. Autor: De|aCuesta.
  4. Comentario: Enjoy it. ;-)
  5. */
  6.  
  7. include("funct_autoID.php"); ## Fichero que nos dará el nuevo ID.
  8.  
  9. $tabla_bd = "autoinc_dlc";
  10. $campo_tabla = "id";
  11.  
  12. $idnew_bd = funct_autoID($tabla_bd,$campo_tabla);
  13. //$idnew_bd = funct_autoID("autoinc_dlc","id");
  14. echo "El nuevo ID será: <b>".$idnew_bd."</b>"."<br/>".
  15.     "...by <b>De|aCuesta</b>";
  16.  
  17. ?>

Como pueden ver es mu fácil su uso. Sólo indicamos a que tabla y de cual campo de ésta obtendremos el nuevo ID (el campo debe ser de tipo entero).

Espero que lo usen y que les sea de mucha utilidad.

De|aCuesta.
__________________
Sólo quien nunca nada hace, nunca se equivoca.
  #2 (permalink)  
Antiguo 21/01/2010, 12:14
Avatar de jackson666  
Fecha de Ingreso: noviembre-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 1.971
Antigüedad: 14 años, 5 meses
Puntos: 65
Respuesta: -Aporte- Función AutoID

Cita:
Iniciado por De_la_Cuesta_13 Ver Mensaje
[...]
Además, si borrase todos mis datos de la tabla que trabaja con autoincrement (suponiendo que mis ID eran: 1-2-3), con la tabla vacía insertando un nuevo dato su ID será 4.
[...]
Perdoname, pero es no es verdad. Si vas a borrar TODOS los datos de una tabla, usa la sentencia TRUNCATE y veras lo que te digo...
Lo que vos decis aca es si usas la sentencia DELETE, ahi si pasa eso.
__________________
HV Studio
Diseño y desarrollo web
  #3 (permalink)  
Antiguo 21/01/2010, 12:15
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: -Aporte- Función AutoID

magnifico aporte!!

aunque ya había visto la idea antes, incluso ahora no me convence...

- imagina que tenemos miles de registros... ¿que caso tiene hacer un gasto impresionante de recursos solo por obtener el ultimo ID si bien MySQL ya lo provee??

- imagina que se trata de un sistema donde los enlaces son indexados por algún buscador... dichos enlaces deberían permanecer intactos, pero no... porque al alterar los IDs se deforma todo el comportamiento del sistema...

vamos, si ya has borrado un elemento por ID, ¿que sentido tiene resucitar su ID??

aunque el tema pasado era de re-ordenar los IDs, este aporte apunta casi a lo mismo... no cuestiono su utilidad, solo puntualizo algunos detalles por lo cual deja de ser óptimo dicho concepto... (:
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #4 (permalink)  
Antiguo 21/01/2010, 12:17
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: -Aporte- Función AutoID

Yo no recomendaría tratar de "rellenar" los espacios en caso de que se elimine un registro. Pierdes la consistencia generando problemas cuando tienes referencias FK a ese campo. El AUTO_INCREMENT como tal ya cumple su función. Si quieres mostrar los datos con IDs sucesivos, ya es un problema de presentación que puede resolverse con una consulta y no un problema de almacenamiento.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #5 (permalink)  
Antiguo 21/01/2010, 15:23
Avatar de De_la_Cuesta_13  
Fecha de Ingreso: abril-2009
Ubicación: Cali, Colombia.
Mensajes: 265
Antigüedad: 15 años
Puntos: 14
Respuesta: -Aporte- Función AutoID

Compañeros agradezco por sus aportes (no conocía el concepto de TRUNCATE). Pero creo que si ya existía un ID, ¿Porqué no usarlo de nuevo? -Optimizas espacio en la BD- (que no necesariamente significa que vas a poner de nuevo lo que ya había). Y no creo creo que aproximadamente 36 líneas de código sea un gasto impresionante de recursos que te ponga a trabajar súper lento la máquina. Por último, no veo porque mencionas la falta consistencia cuando tienes referencias FK, se supone que cuando tienes un campo que es FK en otras tablas y lo eliminas, debes asegurarte que no afectará a tu BD (excusa, pero eso ya sería un problema gravísimo de programación y no tiene nada que ver con una función de autoID).

Espero que a la gente como yo, que aún no trabaja con miles de registros (y que algún día espera hacerlo) y que está en proyectos en entorno web que NO necesariamente serán indenxados en buscadores les sirva.

De|aCuesta.
__________________
Sólo quien nunca nada hace, nunca se equivoca.
  #6 (permalink)  
Antiguo 21/01/2010, 19:34
Avatar de Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años
Puntos: 406
Respuesta: -Aporte- Función AutoID

El punto de utilizar recursos de mas no se refiere a tus 36 lineas de codigo si no cuando una tabla contiene miles de registros, hay es cuando la maquina trabaja de mas, ahora, se supone que si utilizas un campo id en una tabla es para que ese registro sea unico en toda la tabla, asi, siempre que llames ese id sepas que te va a regresar, no tiene caso utilizar un id autoincrementable si vas a revivir id muertos, en ese caso es un problema de concepto en el diseño de tu aplicacion, ahora, con reutilizar id realmente no estas recuperando espacio perdido, con lo cual no estas optimizando, ya que en realidad el id autoincrementable esta haciendo su trabajo tal y como fue desarrollado, el cual da un id unico e irrepetible por cada registro ingresado y por ultimo ¿si hay un id existente porque no utilizarlo? por la simple razon que te di anteriormente, el id autoincrementable esta pensado para dar un id unico a cada registro, y darle de esa manera una identidad a la informacion guardada, si no es tu necesidad de un id entonses lo que tienes es un problema de diseño en tu aplicacion, al final, en un desarrollo grande, el revivir id's te va a traer mas problemas que veneficios

Al final, nadie esta diciendo que tu aporte este mal, al contrario, todo aporte es bueno, solo se comenta el porque vemos como inecesario o incluso contraproducente el implementarlo aun en proyectos pequeños ya que crea una idea erronea de como utilizar optimamente una tabla a personas que comienzan a programar
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)
  #7 (permalink)  
Antiguo 21/01/2010, 20:05
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: -Aporte- Función AutoID

Aquí dejo un aporte de gnzsoloyo al respecto del tema:
http://www.forosdelweb.com/f86/reord...7/#post3064993
Aunque en el tema se habló de reenumerar el campo, también aplica si se quiere reutilizar índices eliminados.

Saludos.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.

Etiquetas: aportes
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 04:28.