IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Supprimer des "trous" d'un array [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut Supprimer des "trous" d'un array
    Bonjour,

    Je me permet de poster cette demande afin de me dépêtrer d'un problème me faisant mal à la tête.

    A) Contexte :

    J'ai développé un module basique de gestion de catégories et de sous catégories en PHP couplé avec MySQL. Ce module permet de créer, modifier, supprimer une Catégorie et d'y associer des sous-catégories que l'on peut également modifier et supprimer. Les sous-catégories peuvent être classées dans l'ordre voulu de l'utilisateur via un champ "position"

    B) Problème :

    Imaginons la catégorie "test de matériel". Cette dernière contient trois sous catégories :

    • Vélos
    • Vêtement
    • Bivouac


    Ces trois sous catégories ont une position, cette position permet de modifier le positionnement côté visiteur.

    • Vélos a donc la position 1
    • Vêtements a la position 2
    • Bivouac a la position 3


    Imaginons maintenant que l'utilisateur supprime la seconde sous catégorie.
    On se retrouve avec un "trou" entre la catégorie "vélos" ayant la position 1 et "bivouac" ayant la position 3.

    C) Question :

    Comment faire pour tester ce type de trou sachant que le trou peut aussi bien affecter la première sous catégorie (et donc commencer à 2), une autre en plein milieu voir à plusieurs endroits en même temps ?

    D) Code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    //exemple, nous récupérons trois sous catégories
    			$nbre_liste = 3;
    			//positions	
    			$tableau_position = array();
    			for ($i=1; $i<=$nbre_liste;$i++)
    			{
    				$position = intval($_POST['position_'.$i.'']);
    				$id_position = intval($_POST['id_position_'.$i.'']);
    				$tableau_position[$id_position] = $position;
    			}
     
    			//on tests s'il n'y à pas de doublons dans les positions que l'on a récupérer et on fait une mise à jour de la position
    			if ($tableau_position == array_unique($tableau_position))
    			{
    				foreach($tableau_position as $id_position => $new_position)
    				{
    					$update_position ='UPDATE ref_type_groupe SET position = \''.$new_position.'\' WHERE id = \''. $id_position .'\'';
    					mysql_query($update_position);
    				}
    			}
    			else
    			{
    				echo'<script type="text/javascript"> alert("Vous ne pouvez pas mettre deux fois la même position")</script>';
    			}
    			echo '<center><b style="color:red"> Mise à jour effectuée</b></center><br />';

    Il faudrait donc pouvoir faire appel à une fonction qui supprimerai ces "trous" en modifiant les positions avant l'update . pouvez-vous me donner des axes de réflexions ?

    Par avance merci.

  2. #2
    Membre actif Avatar de Retrokiller069
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2010
    Messages : 217
    Points : 296
    Points
    296
    Par défaut
    Bonjour,

    je ne penses pas que la modification des positions se situe lorsque tu ajoutes mais plutôt lorsque tu supprimes.

    Du coup lorsque tu supprimes tu devrais mémoriser ca position et modifie toutes les positions suivantes en prenant leur position actuelle -1 (Dans ta requête mettre par exemple toutes les positions supérieures à celle supprimer prennent leur valeur actuelle -1 )

    En espérant t'avoir aider
    Ce n'est pas ce que nous voulons faire qui est impossible mais ce sont les moyens à sa mise en oeuvre qui peuvent le paraître

    Ps: N'oubliez pas SVP

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    Effectivement, il serait peut être plus opportun de modifier toutes les positions après une suppression si et seulement si la suppression ne concerne pas la dernière position.

    Et comme tu le dis,


    Si je fait ça :

    1
    2
    3 => Suppression
    4
    5

    Il faut faire ça :

    1 => 1
    2 => 2
    4 => 3
    5 => 4

  4. #4
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Hello

    Le mieux à faire est de renuméroter ta table de catégories.Vu qu'on a pas 500 éléments à changer, on se fiche pas mal d'envoyer autant de requêtes qu'il y a de sous catégories...

    Bref, ça ressemblerait à quelque chose du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if (mysql_query("DELETE FROM categories WHERE id_cat='$id'")) {
      $results = mysql_query("SELECT id_cat FROM categories");
      $current_pos = 0;
      while ($row = mysql_fetch_assoc($results)) {
         mysql_query("UPDATE categories SET pos='" . ($current_pos ++) . "' WHERE id_cat='{$row['id_cat']}'");
      }
    }
    Avec quelques contrôles en plus


    -- Edit, on pourrait optimiser un peu mieux en ne renumérotant qu'a partir du numéro supprimé. Je te laisse imaginer à quoi ça ressemblerait

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    Bonsoir et merci pour votre réponse

    J'ai finalement réussi mais je n'ai pas appliquée la méthode qui consiste à tout modifier même si elle était largement valable.

    Je modifie que lorsque la position est supérieur à celle supprimée.

    Et voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    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
    		//on veut supprimer une catégorie ?
    		if(!empty($_GET['id_categorie_suppr']))
    		{
    			$categorie_suppr = intval($_GET['type_categorie']);
    			$id_categorie_suppr= intval($_GET['id_categorie_suppr']);
    			$position_suppr = intval($_GET['position_suppr']);
     
    			//position maximum
    			$sql_max_position = mysql_query('SELECT max(position) AS max FROM ref_type_groupe WHERE type_categorie =\'' .$categorie_suppr. '\'');
    			$table_max_position = mysql_fetch_array($sql_max_position);
    			$max_position = intval($table_max_position['max']);
     
    			//si c'est la valeur max on fait que supprimer
    			if($position_suppr == $max_position)
    			{
    				$sql_delete_categorie = mysql_query('DELETE FROM ref_type_groupe WHERE id =\'' .$id_categorie_suppr. '\'');
    			}
    			//sinon il faut faire -1 après le chiffre supprimé
    			else
    			{
    				//on fait une mise à jour des positions
    				$maj_position_after_delete = mysql_query('SELECT id, position FROM ref_type_groupe where type_categorie=\'' .$categorie_suppr. '\' AND position > \'' .$position_suppr. '\' ');
    				while ($tab_maj_after_delete = mysql_fetch_array($maj_position_after_delete))
    				{
    					$old_position = $tab_maj_after_delete['position'];
    					$id_sous_cat = $tab_maj_after_delete['id'];
    					$new_position = $old_position - 1;
     
    					$update_position ='UPDATE ref_type_groupe SET position = \''.$new_position.'\' WHERE id = \''. $id_sous_cat .'\'';
    					echo $update_position;
    					mysql_query($update_position);
    				}
     
    				//on supprime
    				$sql_delete_categorie = mysql_query('DELETE FROM ref_type_groupe WHERE id =\'' .$id_categorie_suppr. '\'');
    			}
    		}
    Un grand merci et à très bientôt pour de nouvelles aventures

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo