Nettoyer une table SQL via PHP

wng
Eléphanteau du PHP | 25 Messages

16 mai 2014, 18:02

Bonjour, pour ceux qui souhaite nettoyer leur table ( trier / arranger les 'id' ) puis modifier l'AUTO_INCREMENTE de leur table, je vous propose ce petit script :
/* votre connexion sql ... */
$mysqli= new mysqli("host", "user", "pw", "db");

$key = 1;
$q = $mysqli->query("SELECT id FROM matable");
foreach($q as $r) { // Utilisation d'un iterator intégrer depuis php 5.4

    if($r["id"] != $key) {
        $mysqli->query("UPDATE matable SET id='$key' WHERE id='{$r["id"]}'");
    }
    $key++;

}
$mysqli->query("ALTER TABLE matable AUTO_INCREMENT=$key");

$mysqli->close();
Explications :
- $key : Stock une clé de base qui s'incrémente à chaque boucle de manière continue ( 1, 2, 3, ... ), ce qui nous servira pour trier les id du type : 1, 2, 5, 6, 8, 12 ...
- On parcourt notre résultat dans un foreach grâce à un iterator disponible depuis php 5.4 pour traiter le résultat.
- On vérifie si l'id est différent de notre $key et si ils le sont alors ont met à jour la ligne en question !
- Une fois toutes les ligne traiter, on met à jour l'AUTO_INCREMENT de votre table à la dernière valeur de $key.

Et voila ! En esperant que cela vous sera utilise :D

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

16 mai 2014, 21:58

Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

wng
Eléphanteau du PHP | 25 Messages

17 mai 2014, 00:42

Pourquoi ne pas modifier un identifiant !

Chose vrai uniquement si cette 'id' ( référence unique ) est appelé ou lié à d'autre table voir base de donnée.

Hors ce script "peut" s’avérer utile pour une table n'utilisant l'id que pour l'auto incrémentation et non l'identification de la ligne, en outre par un exemple concret une table de type "news" avec un champ id en clé primaire auto_increment n'est pas forcement lié de quelque manière que ce soit à autre chose.

Donc lors de la possible suppression de multiple ligne, un "nettoyage" peut satisfaire, voir faire la requête de l'administrateur.

En outre ne pas laisser de manière volontaire ( dans la limite du possible ) des lignes "vides" peut être utile.

EDIT : J'utilise ce système sur mon site web, aussi bien pour les comptes utilisateur, que pour les actualité et même le contenu de ma php doc.
Ne pas oublier que modifier l'id n'est pas dangereux dans le cadre ou cette dite id n'est utiliser nulle part ailleurs. ( En ce qui me concerne je n'utilise jamais un id comme identifiant "unique" mais comme clé d'identification abrégé et c'est là ou son statu unique est réutilisable sans échec quelque soit sa valeur ).

DOUBLE EDIT :
A savoir que, en reprenant l'exemple donnée dans votre tutoriel, le dev as juste une ligne à rajouter :
/* votre connexion sql ... */
$mysqli= new mysqli("host", "user", "pw", "db");

$key = 1;
$q = $mysqli->query("SELECT id FROM matable");
foreach($q as $r) { // Utilisation d'un iterator intégrer depuis php 5.4

    if($r["id"] != $key) {
        $mysqli->query("UPDATE matable SET id='$key' WHERE id='{$r["id"]}'");
        // Ajouter les dépendance à la file .... EDIT ( ne pas oublier de faire une boucle si il y a plusieurs entrée !!! )
        $qq = $mysqli->query("SELECT * FROM dependance WHERE id_dep='{$r["id"]}'");
        foreach($qq as $rr) {
            $mysqli->query("UPDATE dependance SET id_dep='$key' WHERE id_dep='{$r["id"]}'");
        }
    }
    $key++;

}
$mysqli->query("ALTER TABLE matable AUTO_INCREMENT=$key");

$mysqli->close();
Avec sa ... même un forum ne perd pas sa cohérence, ces donnée et tous ce qui y est lié, il faut juste y pensé.
A manier tout de même avec précaution, prévoir un backup de votre base de donnée si vous n'êtes pas sur de ce que vous faite !

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

17 mai 2014, 18:03

Quelle est l'utilité de "nettoyer" une table ?
Ou, plutôt, quel est l'intérêt ?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

wng
Eléphanteau du PHP | 25 Messages

17 mai 2014, 20:12

En ce qui me concerne j'utilise ce système pour diminuer et facilité la gestion des sécurité lors de l'affichage des données, ni plus ni moins et cela fonctionne parfaitement.
Après si chacun y trouve sont compte ... y compris une utilité !

EDIT : Mais si je peut me permettre, dans le cadre d'une utilisation propre et fonctionnel, pourquoi ne pas alors l'appliquer surtout si cela ne change strictement rien au donnée d'accès et visuel pour l'utilisateur ?

Je n'ai pas vraiment d'exemple concret ou ce script aurait une utilité affirmer mais, admettons qu'un dev utilise une boucle générale du type for, avec de ce fait une clé spécifique avec lequel il doit traiter de l'info sql sans pouvoir passé les clé inexistante, j’entends par là que le script en question serait une dépense d'une interface, d'un objet ou autre.

C'est un cas ou ce type de script serait obligatoire pour traiter les différentes information.

Donc l'utilité existe selon le besoin du dev, l'utilité ? dans ce cas présent rendre un script fonctionnel ... ce qui selon les circonstance peut voir doit être une nécessité.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

17 mai 2014, 22:26

Tout ce que tu expliques depuis tout à l'heure n'est jamais une utilisé forte.

Parcourir toute une table ? Tu fais un select simple
Gestion de sécurité ? En quoi connaitre les ID améliore la sécurité ? J'ai même envie de dire que c'est l'inverse, puisque tes données deviennent très prévisible.
Accès visuel aux données ? l'identifiant est un code souterrain, pas une données publique.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

wng
Eléphanteau du PHP | 25 Messages

17 mai 2014, 22:38

Une utilité forte ? je n'ai jamais dit cela, mais je ne voie pas ou est le souci quand à proposer un script fonctionnel à des personne qui pourrait en avoir l'utilité ...

De plus et dans tous les cas c'est au choix d'autrui d'en faire l'utilité donc tout à chacun à son avantage ou non de l'utiliser.

Je ne pense pas devoir citer ma phrase mais bon : je n'utilise jamais les 'id' comme étant mon identifiant donc question sécurité ...

Et quand je dit accès visuel des donnée j’entends par là une fois quel sont traiter ...

Les donnée serait prévisible d'après vous ? pas plus que f=14&t=271093 ... ce qui de toute manière revient à la même chose mais bon.

Dans tous les cas mon script est fonctionnel, complète votre tutoriel en ce qui concerne la modification des id.

Mais bien qu'avoir répondue à votre question, pourriez-vous répondre à la mienne : dans le cadre d'une utilisation propre et fonctionnel, pourquoi ne pas alors l'appliquer surtout si cela ne change strictement rien au donnée d'accès et visuel pour l'utilisateur ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

17 mai 2014, 23:12

Mais bien qu'avoir répondue à votre question, pourriez-vous répondre à la mienne : dans le cadre d'une utilisation propre et fonctionnel, pourquoi ne pas alors l'appliquer surtout si cela ne change strictement rien au donnée d'accès et visuel pour l'utilisateur ?
Tout simplement parce que cette pratique est déconseillée si
Chose vrai uniquement si cette 'id' ( référence unique ) est appelé ou lié à d'autre table voir base de donnée.
Du coup, au lieu de prendre l'habitude de faire une opération tout aussi inutile que possiblement dangereuse, autant ne pas s'amuser à modifier les identifiants.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

wng
Eléphanteau du PHP | 25 Messages

17 mai 2014, 23:15

Disons simplement utilisateur averti ... :) , et donc pour complémenter ce que vous dite, ceux qui souhaite utiliser ce script si vous avez des dépendances pensez à faire les choses proprement ou alors ne l'utiliser pas :D