Récupère la place perdu dans une base de données mysql

Soyez le premier à donner votre avis sur cette source.

Snippet vu 3 881 fois - Téléchargée 17 fois

Contenu du snippet

En supprimant des données dans une table MySQL on se retrouve avec de la place perdue. Dans phpMyAdmin, la liste des tables contient la colonne "Perte" qui indique la taille perdue.
Ce script permet donc d'optimiser toutes les tables d'une base de données et de gagner un peut de place

Source / Exemple :


$sql_serveur = "à renseigner"; // Serveur mySQL 
$sql_base = "à renseigner"; // Base de données mySQL 
$sql_login = "à renseigner"; // Login de connection a mySQL 
$sql_password = "à renseigner"; // Mot de passe pour mySQL

$lk = @mysql_connect($sql_serveur, $sql_login, $sql_password) or die(mysql_error
());
@mysql_select_db($sql_base, $lk) or die(mysql_error());
?> 
<html>
<head>
<title>Récupère la place perdu dans une base de données MySQL</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<?php
//on prépare la requête
$sql = "OPTIMIZE TABLE ";
//on recherche toutes les données des tables
$req = mysql_query('SHOW TABLE STATUS', $lk);
while($data = mysql_fetch_assoc($req)) {
    //on regarde seulement les tables qui affichent des pertes
    if($data['Data_free'] > ) {
        //et on l'inclut si elle comporte des pertes
        $sql .= '`'.$data['Name'].'`, ';
        echo $data['Name'] . "<br>\n";
    }
}
//on enlève le ', ' de trop
$sql = substr($sql, , (strlen($sql)-2));
//et on optimise
mysql_query($sql, $lk);
mysql_close($lk);
?>
</body>
</html>

A voir également

Ajouter un commentaire

Commentaires

Vonscott
Messages postés
62
Date d'inscription
vendredi 6 janvier 2006
Statut
Membre
Dernière intervention
19 septembre 2011

ouias, pas convaincu, peut etre utile pour des clients n'ayant pas acces au phpmyadmin.
Quant au niveau initié, faudrait voir à pas pousser mémé dans les orties non plus, un code de débutant que l'on trouve partout.
Une page html pour ca ? Le code aurait pu etre integrer dans une fonction appellée par la page.
mountainmagazin
Messages postés
6
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
29 décembre 2008

Pour retirer un virgule en fin de chaine, tu peux utiliser :

rtrim ( $sql, ", ");
pgassie
Messages postés
12
Date d'inscription
mardi 28 octobre 2003
Statut
Membre
Dernière intervention
13 décembre 2006

Certainement des problèmes d'éditeur font que le code proposé ne marche pas.
J'ai donc ré-écrit le code suivant :
------------------------------------------------------------------------
<?php
//utilisation http://localhost/[test]/optibase.php[?b= mabase]
// [test] étant l'allias de votre connexion PHP locale

// Serveur mySQL à renseigner
$serveur = "localhost";
// Base de données mySQL à renseigner
if((isset($_GET['b']))&&(!empty($_GET['b'])))$base = $_GET['b']; else $base = "mysql";
// Login de connexion à renseigner
$utilisateur = "root";
// Mot de passe pour mySQL à renseigner
$mot_de_passe = "";
?>
<html>
<head>
<title>Récupère la place perdue dans une base de données MySQL</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style>
table, td, th {border:4px inset grey;margin:0 auto;}
h1 {text-align:center;}
</style>
</head>

Optimisation de la Base <?php echo $base ;?>

Nom de la table |Place perdue |Traitée |
<?php
$connexion = @mysql_connect($serveur, $utilisateur, $mot_de_passe)
or die(\"
\nCONTINUER\".mysql_error().\"\n\n</html> \");
//'retour.html' à renseigner
$ok=false;
//on prépare la requête
$requete= \"OPTIMIZE TABLE \";
//on recherche toutes les données des tables
$resultat = mysql_query('SHOW TABLE STATUS FROM '.$base.';');
while($ligne = mysql_fetch_assoc($resultat)) {
echo \"----
".$ligne['Name'] . ", ". $ligne['Data_free'].", ";
if($ligne['Data_free'] >0 ) {//on ne garde que les tables qui affichent des pertes
echo "oui, \n\";
$ok=true;
$requete .= '`'.$ligne['Name'].'`, ';
}else echo \"non</td>\n\";
}
echo"\n
\n";
//on enlève le ', ' de trop - peut-être à améliorer
$requete = substr($requete, 0, (strlen($requete)-2));
if ($ok) { //et on optimise
echo "
\n
\n
\nTraitement : `".$requete . "` effectué.
\n";
mysql_query($requete, $connection);
} else echo "
\n
\n
\nAucun traitement à faire.
\n";
mysql_close($connection);
?>

</html>
------------------------------------------------------------------------

Spécialement pour Vavavlp,j'ai amélioré la fonction die ( qui ne revenant pas, fabrique une page mal formée ).
Quelques autres petites astuces pour grands débutants.
J'utilise <table> qui n'est pas du tout "deprecated".
Inutile de gérer les lettres accentuées, ce programme est fait pour être en local ; par contre le $serveur peut commencer par "http:" et optimiser une base en ligne.

Plus là : http://www.phpcs.com/forum/sujet-SAVOIR-QUAND-ON-DOIT-OPTIMISER-TABLE-MYSQL_483594.aspx

Programmez, prenez de la peine...

Amusez-vous bien !
Vavavlp
Messages postés
16
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
27 avril 2009

Mince il y a pas de fonction édit ^^'

Là je sais pas si ça vient du code ou du site mais faudrait indenter aussi.
Vavavlp
Messages postés
16
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
27 avril 2009

But du code intéressant, pouvant être utile sur des sites utilisant le sql pour stocker des données temporaires.

Toutefois quelques remarques:
- Tu oublies le <?php de départ,
- die(mysql_error()); avant même d'avoir afficher la balise <html> :s
- mysql_ pdo serai mieux quand même,
- pas de xHTML,
- if($data['Data_free'] > ) on a le droit ?? faut pas un zéro (je suis pas sur jamais essayer ^^).

Voila avec ces quelques amélioration ça fera un code bien pratique ;)

Cordialement,
Vavavlp

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.