Cuando en nuestro sitio web eliminamos un registro de la base de datos, el valor AUTO_INCREMENT se queda como estaba pero si hemos eliminado el último registro, a la hora de insertar uno nuevo nos creará un espacio entre el nuevo registro y el anterior, este espacio es el registro que eliminamos anteriormente. Por ejemplo, sería algo así:

-El último registro en nuestra tabla tiene el campo ID en AUTO_INCREMENT con el valor 200.

Entonces eliminamos éste registro, por lo que ahora nuestro último registro en nuestra tabla será el que tenga el ID 199, pero si insertamos un nuevo registro éste tendría la ID 201.

Esto a la hora de navegar en un sitio web queda muy feo, ya que si por ejemplo nuestro contenido tiene una dirección como esta:


http://www.miweb.com/200/como-plantar-patatas

Si por ejemplo hemos borrado 10 registros en la tabla, entonces daría un salto de 10. Por ejemplo:

De:


http://www.miweb.com/190/como-plantar-tomates

A:


http://www.miweb.com/200/como-plantar-patatas

Por lo que si entrásemos en la siguiente dirección, nos daría error ya que esa ID no existe en la tabla:


http://www.miweb.com/193/como-plantar-plátanos

Para solucionar ésto, he creado una clase en PHP la cuál tiene una función que ha de ser llamada cada vez que borremos un registro.

Esta clase lo que hace es comprobar el valor del AUTO_INCREMENT de la tabla especificada con el valor del último registro insertado de la tabla. Si los valores no coinciden reestablece el valor AUTO_INCREMENT para que tengan su orden correcto.

El código de la clase es el siguiente:

<?php
	
	/*

	#####################################################
	## CLASE PARA REESTABLECER EL VALOR AUTO_INCREMENT ##
	## DE UNA BASE DE DATOS MySQL CON PHP    		   ##
	#####################################################
	## MÁS SOBRE DESARROLLO WEB EN:					   ##
	## 												   ##
	## HTTP://BLOG.REACCIONESTUDIO.COM/                ##
	##												   ##
	#####################################################
	
	*/
	

	include("conexion.php");

	class bd_tools{

		var $mysql;

		//CONSTRUCTOR
		function __construct(){

			$this->mysql = new conectarMySQL();
			$this->mysql->conectar();

		}

		//REESTABLECER AUTO_INCREMENT
		function reestablecer_ai($basededatos,$tabla,$nombre_id_tabla){

			//obtenemos el valor de AUTO_INCREMENT
			$ai = $this->mysql->consultar("SHOW TABLE STATUS FROM ".$basededatos." LIKE '".$tabla."'");

			if($ai == true){

				$row = $this->mysql->obtener_consulta($ai);

				$ai = (int) $row['Auto_increment'];

			}else{

				$retorno = "Error al obtener el valor AUTO_INCREMENT. ".mysql_error();

			}

			//OBTENEMOS EL VALOR DEL ÚLTIMO ID INSERTADO
			$last_id = $this->mysql->consultar("SELECT max(".$nombre_id_tabla.") FROM media");

			if($last_id == true){

				$row = $this->mysql->obtener_consulta();

				$last_id = (int) $row[0];

			}else{

				$retorno = "Error al obtener el valor del último ID. ".mysql_error();

			}

			//COMPARAMOS LOS VALORES
			$comparar = $ai - $last_id;

			if($comparar == 1){

				//EL VALOR AUTO_INCREMENT ESTÁ CORRECTAMENTE
				$retorno = "El valor AUTO_INCREMENT est&aacute; correctamente.";

			}else{

				//NO COINCIDEN LOS VALORES, EDITAMOS EL VALOR AUTO_INCREMENT
				$sql = $this->mysql->consultar("ALTER TABLE ".$tabla." AUTO_INCREMENT = ".$comparar."");
				
				if($sql == true){

					//TODO CORRECTO.
					$retorno = true;

				}else{

					$retorno = "Error al reestablecer el valor AUTO_INCREMENT. ".mysql_error();

				}

			}

			return $retorno;

		}


	}

?>

Aquí podéis encontrar clase conexión que utilizo para conectarme a la base de datos.

El uso de la clase es muy sencillo, la incluimos en nuestro proyecto:

include("reestablecer_ai.php");

-Inicializamos la clase con los parámetros y comprobamos el resultado devuelto:

$bd = new bd_tools();

$j = $bd->reestablecer_ai("nombre_de_la_base_de_datos","nombre_de_la_tabla","nombre_del_campo_AUTO_INCREMENT");

if($j === true)

	echo "Valor AUTO_INCREMENT reestablecido correctamente.";

else

	echo $j;

Así de sencillo y fácil, cualquier duda tan sólo pregunten.

Sobre Reacción Estudio

Somos un estudio informático formado por jóvenes centrados en el desarrollo web, el diseño gráfico y la fotografía. Puedes solicitar presupuesto para tu proyecto a través de nuestra página web o por teléfono, pero en este blog hablaremos de todo lo que engloba el desarrollo web a día de hoy.


  • Nicolás Germone

    Buenas! Queria hacer una consulta acerca de esta clase que se estaría añadiendo a mi proyecto muy identico al ABM de Personaje que tienen en las clases de php con la misma clase Conexion pero no lo puedo ingresar en mi proyecto por problemas de requerir dos veces la clase conexion, como lo podria resolver? Muchas gracias

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies.     ACEPTAR