Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/06/2011, 14h21   #1
Membre actif
 
Homme
Inscription : avril 2011
Messages : 426
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 426
Points : 171
Points : 171
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 :
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.
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 15h31   #2
Membre confirmé
 
Avatar de Retrokiller069
 
Homme Bertrand
Étudiant
Inscription : octobre 2010
Messages : 216
Détails du profil
Informations personnelles :
Nom : Homme Bertrand
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2010
Messages : 216
Points : 268
Points : 268
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
Retrokiller069 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/06/2011, 15h53   #3
Membre actif
 
Homme
Inscription : avril 2011
Messages : 426
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 426
Points : 171
Points : 171
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
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 18h48   #4
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 011
Points : 5 011
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 :
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
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/06/2011, 19h48   #5
Membre actif
 
Homme
Inscription : avril 2011
Messages : 426
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 426
Points : 171
Points : 171
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 :
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
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h07.


 
 
 
 
Partenaires

Hébergement Web