Blog Reacción Estudio

¡Tu zona de aprendizaje!

Clase PHP para reestablecer el valor AUTO_INCREMENT en MySQL

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.