Connaitre et supprimer les doublons dans une table

Ce code montre ou se trouve les doublons dans votre table. A chaque doublon trouvé un lien va s'afficher ou vous pourrez supprimer le doublon.

Ce code ne nettoie pas massivement mais individuellement chaque enregistrement. Si votre table fait des miliers d'enregistrements, pour dedoublonner la table, je vous conseil de faire une copie de votre table ou les champs a dedoublonner seront passés en valeur UNIQUE dans la table, ce qui dedoublonnera la table.

  Voir en MySQLi un code identique : Cherche et trouve les doublons dans une table en MySQLi


Information sur les mises à jour

Dernière mise à jour :

11 Sept 2019
fonctionnement du code vérifié

16 696  vues
Compatibilité du code
PHP 4, PHP 5
A savoir

Ces fonctions sont utilisées dans ce code source:
mysql_connect()    mysql_fetch_array()    mysql_query()    mysql_select_db()   

Ces extensions étaient obsolètes en PHP 5.5.0, et ont été supprimées en PHP 7.0.0.
à la place, vous pouvez utiliser l'extension MySQLi ou l'extension PDO_MySQL.
Voir aussi MySQL : choisir une API du guide et ces entrées de la FAQ pour plus d'informations.
Alternatives à cette fonction :
mysqli_connect() et PDO::__construct()

  code classé dans   MySQL
  code source classé dans   MySQL
 
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
                    
<?php
/*------------------------------*/
/*
Titre : Connaitre et supprimer les doublons dans une table

Auteur : KOogar
Date édition : 12 Jan 2009
Date mise a jour : 11 Sept 2019

Rapport de la maj:
- fonctionnement du code vérifié
*/
/*------------------------------*/

/*******************************************************************************
* connection sql + valeur de la table
***************************************************************************/

$link = mysql_connect("","","")
or die("Excusez nous mais la connection est interrompue pour quelques instants."
);
mysql_select_db("",$link);


$table_sql = ""; // nom de la table sql
$champ_id = ""; // nom de votre identifiant (id,idx...
$champ_recherche_sql = ""; // nom du champ sur lequel on effectue la
// recherche


/*******************************************************************************
* suppression des doublons
***************************************************************************/

if ($_GET['sup'] == 'ok')
{
$idx = trim($_GET['id']);
mysql_query("DELETE FROM $table_sql WHERE `$table_sql`.`$champ_id`='$idx'",$link
);
echo '<font color="red">Suppression terminé !!</font> <br />';
}


/*******************************************************************************
* place tous les champs neccessaires de la table dans un tableau
***************************************************************************/

$tab_match = array();
$tab_match_copie = array();
$q = mysql_query("SELECT $champ_id,$champ_recherche_sql FROM $table_sql",$link);
$i=0;

$tab_match = array();
while ($r = mysql_fetch_array($q)) {
$tab_match[$i] = trim(strtolower($r[$champ_id]));
$i++;
// Place tous les mots d'une chaine dans un tableau
$tab_match[$i] = trim(strtolower($r[$champ_recherche_sql]));
$i++;
}

$tab_match_copie = $tab_match;


/*******************************************************************************
* l'algo
***************************************************************************/

$i = 1;
while ($i < sizeof($tab_match)) {
// on prend un champ du tableau
$check = $tab_match[$i];
$j = 1;
$duplicate = 0;
while ($j < sizeof($tab_match_copie)) {
if ($check == $tab_match_copie[$j]) {
$duplicate++;
if ($duplicate == 2 AND $tab_match_copie[$j-1] != $tab_match[$i-1]) {
echo'duplicate : '.$check.' - id:'.$tab_match_copie[$j-1].' avec '.$tab_match[$i
-1].'';
echo'<a href="'.$_SERVER['PHP_SELF'].'?sup=ok&id='.$tab_match_copie[$j-1].
'">Sup</a>';
}
}
$j =$j + 2;
}
$i = $i + 2;
}

?>
<?php
/*------------------------------*/
/*
Titre : Connaitre et supprimer les doublons dans une table

Auteur : KOogar
Date édition : 12 Jan 2009
Date mise a jour : 11 Sept 2019

Rapport de la maj:
- fonctionnement du code vérifié
*/
/*------------------------------*/

/*******************************************************************************
* connection sql + valeur de la table
***************************************************************************/

$link = mysql_connect("","","")
or die("Excusez nous mais la connection est interrompue pour quelques instants."
);
mysql_select_db("",$link);


$table_sql = ""; // nom de la table sql
$champ_id = ""; // nom de votre identifiant (id,idx...
$champ_recherche_sql = ""; // nom du champ sur lequel on effectue la
// recherche


/*******************************************************************************
* suppression des doublons
***************************************************************************/

if ($_GET['sup'] == 'ok')
{
$idx = trim($_GET['id']);
mysql_query("DELETE FROM $table_sql WHERE `$table_sql`.`$champ_id`='$idx'",$link
);
echo '<font color="red">Suppression terminé !!</font> <br />';
}


/*******************************************************************************
* place tous les champs neccessaires de la table dans un tableau
***************************************************************************/

$tab_match = array();
$tab_match_copie = array();
$q = mysql_query("SELECT $champ_id,$champ_recherche_sql FROM $table_sql",$link);
$i=0;

$tab_match = array();
while ($r = mysql_fetch_array($q)) {
$tab_match[$i] = trim(strtolower($r[$champ_id]));
$i++;
// Place tous les mots d'une chaine dans un tableau
$tab_match[$i] = trim(strtolower($r[$champ_recherche_sql]));
$i++;
}

$tab_match_copie = $tab_match;


/*******************************************************************************
* l'algo
***************************************************************************/

$i = 1;
while ($i < sizeof($tab_match)) {
// on prend un champ du tableau
$check = $tab_match[$i];
$j = 1;
$duplicate = 0;
while ($j < sizeof($tab_match_copie)) {
if ($check == $tab_match_copie[$j]) {
$duplicate++;
if ($duplicate == 2 AND $tab_match_copie[$j-1] != $tab_match[$i-1]) {
echo'duplicate : '.$check.' - id:'.$tab_match_copie[$j-1].' avec '.$tab_match[$i
-1].'';
echo'<a href="'.$_SERVER['PHP_SELF'].'?sup=ok&id='.$tab_match_copie[$j-1].
'">Sup</a>';
}
}
$j =$j + 2;
}
$i = $i + 2;
}

?>

      Fonctions du code - Doc officielle PHP

   php.net  
Description
Versions PHP
    array
Crée un tableau
PHP 4, 5, 7 et 8
    die
Alias de la fonction exit
PHP 4, 5, 7 et 8
    echo
Affiche une chaîne de caractères
PHP 4, 5, 7 et 8
    mysql_connect Ouvre une connexion à un serveur MySQL - (PHP 4, PHP 5, PECL mysql:1.0)   !  OBSOLèTE en PHP 5.5.0, supprimée en PHP 7.0.0
    mysql_fetch_array Retourne une ligne de résultat MySQL sous la forme d'un tableau - (PHP 4, PHP 5, PECL mysql:1.0)   !  OBSOLèTE en PHP 5.5.0, supprimée en PHP 7.0.0
    mysql_query Envoie une requête à un serveur MySQL - (PHP 4, PHP 5, PECL mysql:1.0)   !  OBSOLèTE en PHP 5.5.0, supprimée en PHP 7.0.0
    mysql_select_db Sélectionne une base de données MySQL - (PHP 4, PHP 5, PECL mysql:1.0)   !  OBSOLèTE en PHP 5.5.0, supprimée en PHP 7.0.0
    sizeof
Alias de count
PHP 4, 5, 7 et 8
    strtolower
Renvoie une chaîne en minuscules
PHP 4, 5, 7 et 8
    trim
Supprime les espaces en début et fin de chaîne
PHP 4, 5, 7 et 8

[1]

  • avatar

    Bemale

    09 Mars 2009 à 19:27

    Question pour alléger le code ne vaudrait il pas mieux faire travailler le SGBD que de faire travailler le serveur papache ?
    avec au lieu de

    Code:
    SELECT $champ_id,$champ_recherche_sql FROM $table_sql
    cette requête
    Code:
    SELECT count($champ_id),$champ_recherche_sql
    FROM $table_sql
    GROUP BY $champ_recherche_sql
    HAVING count($champ_id)>2
    Cette dernière requête ne ramènera que les $champ_recherche_sql présent plus d'une fois dans la table
    par contre on ne connait pas les différent $champ_id
    Voili voila.

Minimum 10 mots. Votre commentaire sera visible après validation.


 Autres snippets qui pourraient vous intéresser

Cherche et trouve les doublons dans une table en MySQLi

Compatibilité : PHP 7, PHP 8

A chaque doublon trouvé un lien s'affiche qui permet de supprimer l'enregistrement ou se trouve le doublon.

Enlève les doublons dans une requête MySQL

Compatibilité : PHP 5, PHP 7, PHP 8

Détecte les doublons dans une requête et les enlève si leur nombre est supérieur à 1.

* Requêtes exécutées avec Recherche Contextuelle

  Les derniers scripts

PHP 8.5.5

logo PHP
Langue langue us
Date 12 Avril
Taille 32 Mo
Catégorie PHP

PHP 8.4.20

logo PHP
Langue langue us
Date 12 Avril
Taille 30 Mo
Catégorie PHP

Serendipity 2.6.0

logo Serendipity
Langue langue fr
Date 11 Avril
Taille 15 Mo
Catégorie Blogs

Drupal 11.3.6

logo Drupal
Langue langue us
Date 11 Avril
Taille 34 Mo
Catégorie CMS

TYPO3 14.2.0

logo TYPO3
Langue langue fr
Date 10 Avril
Taille 38 Mo
Catégorie CMS

Dolibarr ERP 23.0.1

logo Dolibarr ERP
Langue langue fr
Date 09 Avril
Taille 89 Mo
Catégorie Logiciels
avatar

KOogar

  12 Jan 2009

  SOURCE   Télécharger

Information sur les mises à jour

Dernière mise à jour :

11 Sept 2019
fonctionnement du code vérifié

16 696 Vues
Compatibilité du code
PHP 4, PHP 5