Réindexation de table

Description

Tentant d'être perfectionniste dans ce que je fais, ça m'agaçait de voir que quand je supprimais une ligne dans phpmyadmin, il y avait des écarts dans les id (ils ne se suivait plus).
J'ai alors décidé de créer une fonction simple qui allait ré-indéxer les id et de remettre la variable d'auto-incrémentation à sa valeur minimale (pour des insertions directement à la bonne valeur à partir de phpmyadmin)

Source / Exemple :


////////////////////////
// fichier config.php //
////////////////////////

<?php
$host = "localhost";	// votre serveur (chez free, sql.free.fr)
$database = "la_base";	// nom de votre base de données
$user = "root";		// nom d'utilisateur permettant de se connecter à la base de données
$password = "";		// mot de passe permetttant de valider le nom d'utilisateur

//Connexion à la base de données
$connexion = mysql_connect($host, $user, $password) or die("Impossible de se connecter : " . mysql_error());
mysql_select_db($database, $connexion); 
?>

--------------

//////////////////////////
// fichier fonction.php //
//////////////////////////

<?php
function REindex_MySQL($liste_table) {				// $liste_table doit être un tableau array()
	// Insertion du fichier de configuration
	include("config.php");
	foreach ($liste_table as $table => $id) {		//Association direct de la table et de son index
		// Verrouillage de la table pour empêcher une écriture simultanée
		mysql_query("LOCK `$table` WRITE");

		// Lecture de la table
		$ids = mysql_query("SELECT `$id` FROM `$table`");

				//Modification de la table
		$compte_id = mysql_num_rows($ids);
		for($i=0;$i<$compte_id;$i++) {
			$liste_id=mysql_result($ids,$i);
			$requete1 = mysql_query("UPDATE `$table` SET `$id` = $i+1 WHERE `$id` = $liste_id");
		}

		// Réinitialisation de la variable d'auto-incrémentation à sa valeur minimale
		$requete2 = mysql_query("ALTER TABLE `$table` AUTO_INCREMENT = 1");
	
		// Affichage d'un message concernant l'état de réindexation d'une table
		if ($requete1 && $requete2)
			echo '<div align="center" style="color:#0A0; font-weight:bold; ">La réindexation de la table `'.$table.'` s\'est déroulée avec succès !</div>'."\n";
		else
			echo '<div align="center" style="color:red; font-weight:bold; ">** ERREUR ** La réindexation de la table `'.$table.'` a échoué ! ** ERREUR **</div>'."\n";
			
		// Déverrouillage de la table
		mysql_query("UNLOCK `$table`");
	}
}
?>

--------------

/////////////////////////
// fichier re-indexer.php //
/////////////////////////

<?php
include("fonction.php")
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>Réindexation de table</title>
</head>

<body>

<?php
// Liste de la/des table(s) à réindexer
$liste_table = array("table1" => "id1","table2" => "id2","table3" => "id3");	// Mettre chaque table à indexer dans le array() en l'associant à son index et en les séparant par une virgule

// Réindexation
REindex_MySQL($liste_table);
?>

</body>
</html>

Conclusion :


Pour ceux qui aiment que tout soit bien rangé, n'hésitez pas à vous servir.

N'oubliez pas de paramétrer le fichier config.php et le tableau array dans re-indexer.php
Pour le tableau, associez chaque index à sa table.
  • Ce script n'est pas fait pour les tables ayant leur id en relation avec d'autres tables. *
  • Il empêchera les tables de se communiquer les bonnes informations. *

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.