Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
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 21/07/2011, 14h20   #1
Membre du Club
 
Inscription : janvier 2008
Messages : 705
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 705
Points : 66
Points : 66
Par défaut tableau imbrique repete ma liste trop de fois

Bonjour,



voila j'ai une liste des catégories présente dans ma table avec une case a cocher a côté de chaque catégorie,je doit faire un formulaire et cocher donc les categories de membres.

donc dans mon code php:
1) je recupere les categories du membres selctionner.
2) je créer la liste de categories avec les cases et le coche si il sont dans le 1tableau.

pb en fesant cela fonctionne mais si par exemple j'ai le membre qui possede 2 categories alors il met la liste des categories entière 2 fois.

Comment faire?

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
 
 
<?php
	$i = 0;	
	foreach ($managerCategorie->getListeSupCategorieActiver() as $ItemListeCategorie)
	{
		$body.='<tr><td style="font-weight:bold;color:black;border:1px solid #999999;background-color:#E2E2E2" colspan="6">'.$ItemListeCategorie->getTitreCategorie().'</td></tr>';
 
 
		$ItemListeCategorieCentre=$managerMembreCentre->getListCentreByMembre($_SESSION['id_membre']);
		foreach($ItemListeCategorieCentre as $ListCentreId)
		{
			$RefCentreAChercher = $ListCentreId->getIdCategorie();
 
 
				foreach($managerCategorie->getListeSousCategorieByIdActiver($ItemListeCategorie->getIdCategorie()) as $infosC) 
				{
 
					$selected = ($RefCentreAChercher == $infosC->getIdCategorie()) ? " CHECKED" : null;
 
					if ($i%3 == 0) 
					{
						$body.='
 
	<tr>
	</tr>';
					}
					$body.='<td><input type="checkbox" name="ref_centre[]" id="ref_centre[]" value=\"'.$infosC->getIdCategorie().'\"'. $selected .'" /></td><td>'. $infosC->getTitreCategorie().'</td>';
 
					$i++;
				}
 
		}
	}
?>


MERCI.
kate59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2011, 21h17   #2
Membre Expert
 
Avatar de gene69
 
Inscription : janvier 2006
Messages : 951
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : janvier 2006
Messages : 951
Points : 1 063
Points : 1 063
c'est parce que tu ne separes pas le traitement des données et celui de l'affichage. Radin.

tu fais une méthode/fonction qui liste les catégories et qui met tout dans un tableau. Au passage doit y avoir une methode magique/interface qui permet de trier/comparer automatiquement les objets avec un simple sort().
  1. donc tableau de categorie
  2. array_unique()
  3. affichage.
__________________
PHP fait nativement la validation d'adresse électronique Vous êtes perdu en PHP? rassurez-vous ici (en)
Utilisez le bouton résolu!
gene69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2011, 22h58   #3
Membre du Club
 
Inscription : janvier 2008
Messages : 705
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 705
Points : 66
Points : 66
bonjour,
voici ma fonction qui me sort le premier tableau:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public function getListCentreByMembre($ref_membre)
	{
 
		$ListMembreByActivite = array();
 
		$sql = 'SELECT * FROM
				((membre_centre INNER JOIN categorie_ovip ON membre_centre.id_categorie = categorie_ovip.id_categorie)
				INNER JOIN membre_ovip ON membre_centre.id_membre = membre_ovip.id_membre)
				where membre_centre.id_membre='.$ref_membre.'';
 
 
		$requete = $this->db->query($sql);
 
		while ($Activite = $requete->fetch(PDO::FETCH_ASSOC))
		$ListMembreByActivite[] = new Categorie ($Activite);
 
		$requete->closeCursor();
 
 
		return $ListMembreByActivite;
 
 
	}
donc je doit faire une autre fonction avec sort() c'est bien ca que tu veut dire?
et je doit donc ne mettre qu'un foreach, maisj'ai dut mal a comprendre comment applique ce systeme de tri?

merci de ton aide.
kate59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2011, 01h06   #4
Membre Expert
 
Avatar de gene69
 
Inscription : janvier 2006
Messages : 951
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : janvier 2006
Messages : 951
Points : 1 063
Points : 1 063
Dans le forum mysql, il y a un des membres les plus actifs qui a marqué une signature défendant contre la guerre des étoiles. Select * dans du code c'est très dangereux.

bon en fait il y a une solution bien plus simple que le usort et l'implem de la méthode à mettre pour son call back.

imaginons que dans le tableau $Activite il y ait $Activite['id'] ou $Activite['nom'] qui soit definit. Disons que c'est $Activite['nom']

proposition 1, le constructeur de Categorie ne fait rien, on peut se permettre d'en gaspiller.
Code php :
1
2
3
4
5
 
while ($Activite = $requete->fetch(PDO::FETCH_ASSOC))
{
		$ListMembreByActivite[$Activite['nom']] = new Categorie ($Activite);
}


proposition 2, le constructeur de Categorie rame à fond
Code php :
1
2
3
4
5
6
7
while ($Activite = $requete->fetch(PDO::FETCH_ASSOC))
{
		if (!isset($ListMembreByActivite[$Activite['nom']]) )
		{
			$ListMembreByActivite[$Activite['nom']] = new Categorie ($Activite);
		}
}

proposition 1,2 +
Code php :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
// tri par callback sur une fonction de comparaison statique du genre 
/* public static compareTo(Object a,Object b)
{
 if ( is_a($a,'categorie')  and is_a($b,'categorie'))
  { 
   return $a->compare(b);
  } 
  else 
  { 
    return 0; 
  }
}
*/
usort($ListMembreByActivite, 'Categorie::compareTo');
 
// ou sinon un simple ordre lexicographique suffit
ksort($ListMembreByActivite)
proposition 3, on deviens fort en SQL, il y a vraiment besoin des 3 tables pour construire la categorie???
Code sql :
1
2
3
4
5
6
7
8
9
 
SELECT  
	DISTINCT c.id_categorie,
	c.nom
FROM
	membre_centre INNER JOIN categorie_ovip AS c ON membre_centre.id_categorie = c.id_categorie
	INNER JOIN membre_ovip ON membre_centre.id_membre=membre_ovip.id_membre
WHERE membre_centre.id_membre=:value
ORDER BY c.nom

1) utilises plus d'accolades, c'est fou le nombre d'erreur que ça evite.
2) utilises des prepared statement ce que tu fais pour passer ta variable à la requete ne vaut rien, empêche diverses optimisations, produit une faille de sécurité, provoque la fonte de la banquise et massacre les gentils dauphins.
__________________
PHP fait nativement la validation d'adresse électronique Vous êtes perdu en PHP? rassurez-vous ici (en)
Utilisez le bouton résolu!
gene69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2011, 10h47   #5
Membre du Club
 
Inscription : janvier 2008
Messages : 705
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 705
Points : 66
Points : 66
je me suis lancer la 3 proposition:
mais cela n'a rien changer je n'ai toujours que la derniere categorie cocher et pas les autres:

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
public function getListCentreByMembre($ref_membre)
	{
 
		$ListMembreByActivite = array();
 
		$sql = 'SELECT  
	DISTINCT c.id_categorie,
	c.titre_categorie
FROM
	membre_centre INNER JOIN categorie_ovip AS c ON membre_centre.id_categorie = c.id_categorie
	INNER JOIN membre_ovip ON membre_centre.id_membre=membre_ovip.id_membre
WHERE membre_centre.id_membre='.$ref_membre.'
ORDER BY c.titre_categorie';
 
 
		$requete = $this->db->query($sql);
 
		while ($Activite = $requete->fetch(PDO::FETCH_ASSOC))
		$ListMembreByActivite[] = new Categorie ($Activite);
 
		$requete->closeCursor();
 
 
		return $ListMembreByActivite;
 
 
	}
la page :

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
foreach ($managerCategorie->getListeSupCategorieActiver() as $ItemListeCategorie)
	{
		$body.='<tr><td style="font-weight:bold;color:black;border:1px solid #999999;background-color:#E2E2E2" colspan="6">'.$ItemListeCategorie->getTitreCategorie().'</td></tr>';
 
 
		$ItemListeCategorieCentre=$managerMembreCentre->getListCentreByMembre($_SESSION['id_membre']);
		foreach($ItemListeCategorieCentre as $ListCentreId)
		{
			$RefCentreAChercher = $ListCentreId->getIdCategorie();
 
		}	
				foreach($managerCategorie->getListeSousCategorieByIdActiver($ItemListeCategorie->getIdCategorie()) as $infosC) 
				{
 
					$selected = ($RefCentreAChercher == $infosC->getIdCategorie()) ? " CHECKED" : null;
 
					if ($i%3 == 0) 
					{
						$body.='
 
	<tr>
	</tr>';
					}
					$body.='<td><input type="checkbox" name="ref_centre[]" id="ref_centre[]" value=\"'.$infosC->getIdCategorie().'\"'. $selected .'" /></td><td>'. $infosC->getTitreCategorie().'</td>';
 
					$i++;
				}
 
 
	}
merci de ton aide.
kate59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/07/2011, 10h41   #6
Membre du Club
 
Inscription : janvier 2008
Messages : 705
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 705
Points : 66
Points : 66
je n'ai toujours pas trouver de solution si quelqu'un pouvez m'aidez ca serait geniale.
kate59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 10h10   #7
Membre du Club
 
Inscription : janvier 2008
Messages : 705
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 705
Points : 66
Points : 66
j'ai continuer de chercher mais meme avec tous les modification que j'ai faites, je n'ai rien trouver.

la je desespere car j'aimerai savoir comment je pourrai m en sortir pour ne pas refaire la meme erreur la prochaine fois.

si quelqu'un a une solution, je serai super heureuse.

merci.
kate59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h39.


 
 
 
 
Partenaires

Hébergement Web