8721 sujets

Développement web côté serveur, CMS

Bonjour,
J'ai du mal avec une boucle foreach.

Donc, voilà, sur une page je doit faire afficher une série de sons, classé par carte puis par continents. Jusque là ça va.
Pour faire l'affichage des liens j'utilise un array dans lequel je stock le nom des cartes et les associer à un nom de dossier. Ensuite j'utilise une boucle Foreach pour faire l'affichage.

Visuellement tout semble normal, j'ai les bon sons aux bons endroits, mais je remarque que la page se charge longtemps... Quand j'ai regardé le code source général j'ai fait "Wouha!"

Pour chaque balise audio j'ai la liste complète des dossiers! Mais elle ne m'en affiche qu'un.

J'ai tenté de corrigé, en déplaçant ma boucle foreach, mais je n'arrive pas à faire un affichage correct.

page en ligne Vous pouvez voir le code source généré. (Carte de sons tout en bas de la page)

Puis mon code:
<div class="appeau carte left clear">
    	<h4 class="gradient-gray">Cartes de sons disponibles</h4>
    	<a href="/Images/photosProduits/Call/card.png"  rel="lightbox-camera" title="Carte de sons" >
			<img src="../../../Images/photosProduits/Call/card_mini.png" width="100" height="70" alt="">
		</a>
        <div class="right">
        <?php
		$req = mysql_query
					("SELECT DISTINCT
						A.`continents_id`,
						C.`nom` AS `continent`
			 		FROM continents C
					RIGHT JOIN caller A
						ON A.`continents_id` = C.`id`
					ORDER BY C.`nom`")
					or die("176 - ".mysql_error());
		while ($info = mysql_fetch_array($req)){
			$continent = $info['continent'];
			$cid = $info['continents_id'];
			?>
		<h5><?php echo $info['continent']; ?></h5>
        	<?php
			$requete = mysql_query("SELECT * FROM caller WHERE produits='Card' AND continents_id='$cid' AND nom NOT IN ('Card Duck') ORDER BY id")or die("190 - ".mysql_error());
			while ($data = mysql_fetch_array($requete)){
				$nom = $data['nom'];
			?>
        <div class="card">    
            <h6 class="gradient-gray"><?php echo $data['fr']; ?> (#<?php echo $nom; ?>)</h6>
            <ul>
            <?php
			$q = mysql_query("SELECT fichier FROM audio WHERE carte = '$nom'")or die("198 - ".mysql_error());
			while ($card = mysql_fetch_array($q)){
				$a = array('Card Whitetail'=>'whitetail', 
					'Card Whitetail2'=>'whitetail2', 
					'Card Moose'=>'moose', 
					'Card Moose2'=>'moose2', 
					'Card Predator'=>'predator', 
					'Card Predator2'=>'predator2', 
					'Card Turkey'=>'turkey', 
					'Card Goose'=>'goose', 
					'Card Duck'=>'duck', 
					'Card Elk'=>'elk',
 					'Card Predator EU'=>'predator-EU', 
					'Card Roe Deer EU'=>'roe-deer-EU', 
					'Card Crow/Wild Boar EU'=>'wild-boar-crow-EU');
			?>
            	<li>
                	<audio controls>
				  <?php
                  foreach($a as $key => $file){
                    ?>
						<source src="/sound-card/<?php echo $file.'/'.$card['fichier']; ?>.ogg" type="audio/ogg" />
						<source src="/sound-card/<?php echo $file.'/'.$card['fichier']; ?>.mp3" type="audio/mpeg"/>
                        <object type="application/x-shockwave-flash" data="/dewplayer/dewplayer-mini.swf" width="131" height="20" class="dewplayer">
                            <param name="movie" value="/dewplayer/dewplayer-mini.swf" />
                            <param name="wmode" value="transparent" />
                            <param name="flashvars" value="mp3=/sound-card/<?php echo $file.'/'.$card['fichier']; ?>.mp3" />
						</object>
					<?php
                  }
                  ?>
					</audio>
                </li>
            <?php
			}
			?>
            </ul>
        </div>
            <?php
			}
		}
		?>
        </div>
    </div>
Salut
le comportement de ton code est tout à fait normal.
Et là je vais interpeller deux points avec toi:

Le premier:
la """"solution"""" à ton problème qui puisse te débloquer rapidement, est de déplacer la définition du tableau $a en dehors des boucles while, avant ta première requête, car de cette façon le tableau est défini à chaque fois que la boucle est exécutée, disant 13 (cards)*4(files)=52 (times), que tu définis le tableau $a, alors que tu as besoin de le définir une seule fois.
ça dans un premier temps, l'étape suivante, est de supprimer la boucle foreach, car selon ta demande tu en as pas besoin est c'est la source de ton problème, car c'est elle qui crée autant de source pour chaque balise audio; et tu dois la remplacer par:

$file=(isset($a[$nom])?$a[$nom]:'ici tu mets le chemin que tu veux si le nom de la carte n\'est pas défini dans ton tableau');

Et ici il y'a un souci dans je vais parler dans mon deuxième point.
Si tu faits ça tu auras pour chaque continent=>les cartes qui lui correspondent, et pour chaque carte=>liste des fichiers audio, et pour chaque fichier nous cherchons son path selon le nom de la carte dans un tableau que tu as déjà défini.

Mon deuxième point (je risque d'être un peu méchant Smiley langue ) ton code est mal fait et tu as des problèmes de conception bien visibles, et tu gaspilles des variables. Mais je n'ai pas le temps pour les citer maintenant, mais si tu es intéressé, tu n'as qu'à laisser un message et demain je te les citerai.

bonne courage.
Merci pour ta réponse unami.

Donc, j'ai laissé tomber la boucle foreach. J'ai plutôt ajouté une colonne dans ma table "caller" qui contient le nom du dossier pour chaque carte.

Mon nouveau code:
<div class="appeau carte left clear">
    	<h4 class="gradient-gray">Cartes de sons disponibles</h4>
    	<a href="/Images/photosProduits/Call/card.png"  rel="lightbox-camera" title="Carte de sons" >
		<img src="../../../Images/photosProduits/Call/card_mini.png" width="100" height="70" alt="">
		</a>
        <div class="right">
        <?php
	$req = mysql_query("
			SELECT DISTINCT
				A.`continents_id`,
				C.`nom` AS `continent`
			 FROM continents C
			RIGHT JOIN caller A
				ON A.`continents_id` = C.`id`
			ORDER BY C.`nom`")
			or die("174 - ".mysql_error());
	while ($info = mysql_fetch_array($req)){
		$continent = $info['continent'];
		$cid = $info['continents_id'];
		?>
		<h5><?php echo $info['continent']; ?></h5>
        	<?php
		$requete = mysql_query("SELECT * FROM caller WHERE produits='Card' AND continents_id='$cid' AND nom NOT IN ('Card Duck') ORDER BY id")or die("189 - ".mysql_error());
		while ($data = mysql_fetch_array($requete)){
			$nom = $data['nom'];
			?>
        <div class="card">    
            <h6 class="gradient-gray"><?php echo $data['fr']; ?> (#<?php echo $nom; ?>)</h6>
            <ul>
            <?php
			$q = mysql_query("SELECT fichier FROM audio WHERE carte = '$nom'")or die("198 - ".mysql_error());
			while ($card = mysql_fetch_array($q)){
			?>
            	<li>
                	<audio controls>
				<source src="/sound-card/<?php echo $data['file'].'/'.$card['fichier']; ?>.ogg" type="audio/ogg" />
				<source src="/sound-card/<?php echo $data['file'].'/'.$card['fichier']; ?>.mp3" type="audio/mpeg"/>
                        	<object type="application/x-shockwave-flash" data="/dewplayer/dewplayer-mini.swf" width="131" height="20" class="dewplayer">
                            		<param name="movie" value="/dewplayer/dewplayer-mini.swf" />
                            		<param name="wmode" value="transparent" />
                            		<param name="flashvars" value="mp3=/sound-card/<?php echo $data['file'].'/'.$card['fichier']; ?>.mp3" />
				</object>
			</audio>
                </li>
            <?php
			}
			?>
            </ul>
        </div>
            <?php
			}
		}
		?>
        </div>
    </div>


Ensuite, pour ce qui est de mon code mal construit... j'en suis parfaitement consciente, et encore tu n'a là qu'une partie de mon code pour cette page. Je suis loin d'être une pro, et je ne demande qu'à apprendre, je suis une autodidacte en la matière. J'ai suivi un cours ressemant, mais de base, il m'en faudrait plus poussé.

Donc je suis ouverte à toutes suggestions pour améliorer le tout. Si tu veux bien t'en donner la peinne! Entouka ça sera très apprécié!
Slaut Julie Smiley smile
a écrit :
... Si tu veux bien t'en donner la peinne! ...
, Oups ! tu était très défensive au point que j'allait m'excuser, en tout cas ce que j'ai dit c'était pour te mettre dans la vraie image, afin que tu puisses réellement avancée au lieu de croire qu'on avance, car ce sont deux choses différentes Smiley smile .

Bref, je crois que ton problème est résolu, et tu as réglé aussi un petit problème de conception qui est du path des fichiers correspondant à une carte, en le mettant dans ta table au niveau de la base de données.

Alors je crois que maintenant tu voudras que je te propose des améliorations à ton code. Donc premièrement nous allons parlé de la conception de tes tables, car selon ce que j'ai compris, un continent peut avoir 0 ou plusieurs cartes et une carte appartient à un seul continent; dans un deuxième niveau, tu as la carte qui pourrais avoir 0 ou plusieurs fichiers audio, et le fichier audio correspond à une seul carte alors ça doit donner quelques chose du genre: (Je ne sais pas vraiment qu'il sont les règles de gestion de ton système d'infos, mais je crois que tu devais mettre cartes dans une table toutes seules, mais c'est toi qui saches le mieux ton besoin)
upload/38089-concept.jpg
Alors côté conception, entre tes tables il y'a des liaisons alors, qui doivent se manifester sous forme des clés étrangers ce qui est le cas entre continents et cartes, mais entre cartes et fichiers tu utilises un attribut d'information comme clé, et c'est absolument déconseillé vu les problèmes que ça pourra causer. Tu pourras revérifier cela sur un cours Merise ou UML.
Et la question des chemins des fichiers que tu as réglé en la mettant dans la table cards ou caller, au lieu d u tableau $a que tu as évité dans ta deuxième version. ça était côté conception.

Niveau code, j'ai parlé de l'utilisation inapproprié des variables. Pour celle du tableau tu l'as corrigé, et dans cette façon de codage que tu as suivi tu utilises trois varaibles de plus dont tu n'as absolument besoin, $continent, $cid, $nom, à part si tu as besoin de la dernière valeur issue de te boucles pour un code ultérieure, mais j'en doute fort car sur ta page c'est la dernière chose avant la fin de page. Alors à chaque fois que tes boucles s'exécuteront, tu auras une instruction d'affectation et une occupation de mémoire supplémentaires, avant de passer au choses sérieuses. Oui nous pourrons dire que ici ce n'est pas vraiment important, et que ce ne sont que trois variables dans un site d'information, mais je vais dire que c'est à toi de choisir la qualité de ton approche de programmation, ce qui pourrait faire grandes différences dans des travaux compliqués et qui nécessitent une grande attention à la gestion des performances.

Mon point suivant est à propos de tes requêtes sql que tu pouvais rassembler dans une et seule requête vu ton besoin et aussi vu les liaison entre tes tables, et je vois que tu faits déjà recours aux jointures alors je crois que tu pourras la faire, de telle façon que ta requête ressemblera à (suivant bien sur le modèle en haut):
select co.nom,co.id_continent,ca.nom,ca.fr,ca.directory,a.fichier
from continents co
left join caller ca on ca.id_continent=co.id_continent
left join audio a on c.id_caller=a.id_caller
where ca.produits='Card' and nom!='Card Duck'
order by co.nom,ca.id_caller

Cela pourras peut être t'inspiré car je trouve du mal avec ton dictionnaire, et ta défintion de ton système, exemple que produits='Card', tu voudras peut être dire type="Card", en tout cas la signification des mots que tu as utilisé n'aide pas à comprendre ton travail.
Pour quoi une requête au lieu de trois, premièrement parce que c'est faisable dans ce cas Smiley biggol , deuxièmement et le plus imoprtant c'est qu'il faut économiser les appels mysql dans le code selon le possible, moins d'appels c'est plus de performances.

Alors un seul appel aux données, et et une seule boucle while, et quelques conditions dedans pour savoir quand nous allons mettre un nouveau continent et quand nous allons mettre une nouvelle carte, et pour cela et ici tu auras besoin de deux variable, qui te permettront de savoir si tu arrives à un nouveau continent ou une nouvelle carte dans ta source mysql.

Un autre point, penses à ça: htmlentities

Je te conseille aussi de jetter un coup d'oeil sur le MVC design pattern, comprendre le concept, t'aidera surement à amléiorer la structuration de ton code même en procédural.

Finalement accordes un peu plus d'attention à l'indentation dans tes scripts, pour que ce soit plus lisible en identifiant les nivueax du code Smiley smile

Alors là je crois que c'ets tout ce qui me vient à l'esprit actuellement.
bonne courage pour le restant Smiley biggrin .
unami a écrit :
Slaut Julie Smiley smile
Oups ! tu était très défensive au point que j'allait m'excuser, en tout cas ce que j'ai dit c'était pour te mettre dans la vraie image, afin que tu puisses réellement avancée au lieu de croire qu'on avance, car ce sont deux choses différentes Smiley smile .

T'inquiète je ne suis pas du tout sur la défensive. Smiley cligne

unami a écrit :
Donc premièrement nous allons parlé de la conception de tes tables, car selon ce que j'ai compris, un continent peut avoir 0 ou plusieurs cartes et une carte appartient à un seul continent; dans un deuxième niveau, tu as la carte qui pourrais avoir 0 ou plusieurs fichiers audio, et le fichier audio correspond à une seul carte alors ça doit donner quelques chose du genre: (Je ne sais pas vraiment qu'il sont les règles de gestion de ton système d'infos, mais je crois que tu devais mettre cartes dans une table toutes seules, mais c'est toi qui saches le mieux ton besoin)
upload/38089-concept.jpg

C'est à peut près ça.

unami a écrit :
Alors côté conception, entre tes tables il y'a des liaisons alors, qui doivent se manifester sous forme des clés étrangers ce qui est le cas entre continents et cartes, mais entre cartes et fichiers tu utilises un attribut d'information comme clé, et c'est absolument déconseillé vu les problèmes que ça pourra causer. Tu pourras revérifier cela sur un cours Merise ou UML.

Lors de mon cours on a survolé les clé étrangère et index, mais je n'ais pas réussi à le reproduire... ce qui fait qu'à l'heure actuelle c'est fait "manuellement"... Si tu peux m'aider sur le coup ça serait apprécié.
Pour le reste j'ai du mal à te suivre.

unami a écrit :
Niveau code, j'ai parlé de l'utilisation inapproprié des variables. Pour celle du tableau tu l'as corrigé, et dans cette façon de codage que tu as suivi tu utilises trois varaibles de plus dont tu n'as absolument besoin, $continent, $cid, $nom, à part si tu as besoin de la dernière valeur issue de te boucles pour un code ultérieure, mais j'en doute fort car sur ta page c'est la dernière chose avant la fin de page. Alors à chaque fois que tes boucles s'exécuteront, tu auras une instruction d'affectation et une occupation de mémoire supplémentaires, avant de passer au choses sérieuses. Oui nous pourrons dire que ici ce n'est pas vraiment important, et que ce ne sont que trois variables dans un site d'information, mais je vais dire que c'est à toi de choisir la qualité de ton approche de programmation, ce qui pourrait faire grandes différences dans des travaux compliqués et qui nécessitent une grande attention à la gestion des performances.

Je devrais donc évité ceci
$continent = $info['continent'];
$cid = $info['continents_id'];
et plutôt utiliser directement?
$info['continent']
$info['continents_id']


unami a écrit :
Mon point suivant est à propos de tes requêtes sql que tu pouvais rassembler dans une et seule requête vu ton besoin et aussi vu les liaison entre tes tables, et je vois que tu faits déjà recours aux jointures alors je crois que tu pourras la faire, de telle façon que ta requête ressemblera à (suivant bien sur le modèle en haut):
select co.nom,co.id_continent,ca.nom,ca.fr,ca.directory,a.fichier
from continents co
left join caller ca on ca.id_continent=co.id_continent
left join audio a on c.id_caller=a.id_caller
where ca.produits='Card' and nom!='Card Duck'
order by co.nom,ca.id_caller
Ça je savais, mais à chaque fois que j'ai tenté de faire comme ça, ça ne fonctionnait pas!
Faudrait que je me réessaie, ça tombe bien, j'ai un nouveau site à concevoir. ça va me permettre de repartir à neuf.

unami a écrit :
Cela pourras peut être t'inspiré car je trouve du mal avec ton dictionnaire, et ta défintion de ton système, exemple que produits='Card', tu voudras peut être dire type=&quot;Card&quot;, en tout cas la signification des mots que tu as utilisé n'aide pas à comprendre ton travail.
C'est complexe... mais Card est un produit en soit également...

unami a écrit :
Alors un seul appel aux données, et et une seule boucle while, et quelques conditions dedans pour savoir quand nous allons mettre un nouveau continent et quand nous allons mettre une nouvelle carte, et pour cela et ici tu auras besoin de deux variable, qui te permettront de savoir si tu arrives à un nouveau continent ou une nouvelle carte dans ta source mysql.
C'est là que je bloque...

unami a écrit :
Un autre point, penses à ça: htmlentities
Je connait mais je ne l'ais jamais utilisé correctement... Je prend note.

unami a écrit :
Je te conseille aussi de jetter un coup d'oeil sur le MVC design pattern, comprendre le concept, t'aidera surement à amléiorer la structuration de ton code même en procédural.
Là, je n'ais aucune idée de quoi tu parle!

unami a écrit :
Finalement accordes un peu plus d'attention à l'indentation dans tes scripts, pour que ce soit plus lisible en identifiant les nivueax du code Smiley smile
Normalement mes scripts sont correctement indenté, mais le copie/colle dans les balises code du forum détruit tout! Smiley langue

unami a écrit :
Alors là je crois que c'ets tout ce qui me vient à l'esprit actuellement.
bonne courage pour le restant Smiley biggrin .
C'est déjà beaucoup! Merci a toi!
re Smiley smile

Ok, alors dans cette intervention je vais essayer de poser un petit cahier de charges dans j'essaierai de prendre les mêmes contraintes mais dans la façon dont je l'aurais fait par moi même Smiley biggol , et je te réponderai sur quelques points évoqués dans ta réponse par suite:

Règles de gestion:
-Nous avons une liste des continents, reconnu par un nom
-Nous avons aussi des produits, dont un type est désigné par Carte (Selon ce que j'ai compris dans ta réponse, même si je crois que tu dois consacrer une table pour les cartes, à part si tu as vraiment une liste de produit qui rentrent dans d'autres interaction, là je crois que tu dois créer une table produit, ayant les attributs commun entre tes produit, et pour les cartes tu spécifies une autre table en liaison avec la table produit, qui contiendra les infos spécifique de la carte). Pour cet exemple je vais partir avec ta logique.
-Chaque carte correspond à un continent.
-Le continent alors pourrais avoir plusieurs cartes qui lui sont associées.
-Chaque carte pourrais avoir plusieurs fichiers audio.
-Et un fichier audio appartient nécessairement à une carte.
-La carte correspond aussi à une catégorie (Je crois que c'est ce que tu veux dire par 'fr')
-La catégorie est reconnu par un libellé.

Objectif:
-Récupérer la liste des continents, et pour chacun, afficher les cartes qui lui correspondent, par suite il va falloir afficher les fichiers audio qui correspondent à chaque carte.

Je travaille avec UML Smiley lol ce qui fait ici je vais poser un diagramme de classe mais sans évoqué les méthodes. Tu pourras dire que c'est MCD (Merise) mais avec une notation UML Smiley biggol .
Alors nous aurons cette figure:
upload/38089-concept.jpg
Alors au niveau de notre MLDR nous aurons :
upload/38089-concept2.jpg
J'espère que je n'ai pas oublié quelques choses.
Alors ton code deviendra:
<?php
		//La récupération des données ici
		$rs=mysql_query("select co.id_continent,p.id_produit,co.libelle as continent,ca.libelle as categorie,p.libelle as carte,p.path,f.name as fichier
						from continents co
						left join produits p on p.id_continent=co.id_continent
						left join categories ca on ca.id_categorie=p.id_categorie
						left join fichiers_audio f on f.id_produit=p.id_produit
						where p.type='Carte'
						order by co.libelle,ca.libelle");
	?>
	<div class="appeau carte left clear">
    	<h4 class="gradient-gray">Cartes de sons disponibles</h4>
    	<a href="/Images/photosProduits/Call/card.png"  rel="lightbox-camera" title="Carte de sons" >
		<img src="../../../Images/photosProduits/Call/card_mini.png" width="100" height="70" alt="">
		</a>
        <div class="right">
		<?php
			$continent=$carte='';
			while($rw=mysql_fetch_assoc($rs)){
				if($continent!=$rw['id_continent']){
					$continent=$rw['id_continent'];
		?>
			<h5><?php echo htmlentities($rw['continent'],ENT_QUOTES); ?></h5>
		<?php
				}
				
				if($carte!=$rw['id_produit']){
					if($carte!=''){
		?>
				</ul>
			</div>
		<?php
					}
		?>
			<div class="card">    
				<h6 class="gradient-gray"><?php echo htmlentities($rw['categorie'].'(#'.$rw['carte'].')',ENT_QUOTES); ?></h6>
				<ul>
		<?php
					$carte=$rw['id_produit'];
				}
		?>
					<li>
						<audio controls>
							<source src="/sound-card/<?php echo $rw['path'].'/'.$rw['fichier']; ?>.ogg" type="audio/ogg" />
							<source src="/sound-card/<?php echo $rw['path'].'/'.$rw['fichier']; ?>.mp3" type="audio/mpeg"/>
							<object type="application/x-shockwave-flash" data="/dewplayer/dewplayer-mini.swf" width="131" height="20" class="dewplayer">
								<param name="movie" value="/dewplayer/dewplayer-mini.swf" />
								<param name="wmode" value="transparent" />
								<param name="flashvars" value="mp3=/sound-card/<?php echo $rw['path'].'/'.$rw['fichier']; ?>.mp3" />
							</object>
						</audio>
					</li>
		<?php
			}
		?>
				</ul>
			</div>
        </div>
    </div>


Un peu d'effort et tu comprendras comment a marche.

Alors pour ta réponse:
a écrit :
Lors de mon cours on a survolé les clé étrangère et index, mais je n'ais pas réussi à le reproduire... ce qui fait qu'à l'heure actuelle c'est fait "manuellement"... Si tu peux m'aider sur le coup ça serait apprécié.
Pour le reste j'ai du mal à te suivre.

Sincèrement si tu n'as pas maîtrisé la conception, et l'analyse d'un système d'infos pendent ta formation, ça va être très difficile pour toi car c'est la partie la plus importante dans un projet Smiley sweatdrop . Alors comme on dit, ceux qui cherchent trouve Smiley smile une petite recherche sur google et tu trouveras des choses qui puissent t'aider:
Merise , ici tu trouveras comment nous devons procéder dans l'analyse d'un système d'infos, et comment concevoir notre application.

Pour ce que tu as proposé au niveau des variables, c'est exactement ça.

Pour les requêtes SQL c'est une chose très importante, tu dois maitriser un minimum qui te permettra de construire des requêtes propres et bien faites.
a écrit :
C'est complexe... mais Card est un produit en soit également...

Eliminer la complexité, en faisant recours à la simplicité, une bonne conception te le permettra.
a écrit :
C'est là que je bloque...

Le premier devoir d'un développeur est de trouver des solutions, disant que tu as laché les bras après la première difficultés Smiley lol .

a écrit :
Je connait mais je ne l'ais jamais utilisé correctement... Je prend note.

htmlentities et mysql_real_escape_string (Cette dernière sera obsolète dans les prochaines version, voir les alternatives) sont des fonctions très crucialeq pour la sécurité basique, et aussi pour assurer le bon affichage des textes.

a écrit :
Là, je n'ais aucune idée de quoi tu parle!

Un peu de recherche Smiley smile : http://phpmaster.com/the-mvc-pattern-and-php-1/

voilà je crois que j'ai fini Smiley biggol

Bon courage pour le restant
Hello!
unami a écrit :
Règles de gestion:
-Nous avons une liste des continents, reconnu par un nom
-Nous avons aussi des produits, dont un type est désigné par Carte (Selon ce que j'ai compris dans ta réponse, même si je crois que tu dois consacrer une table pour les cartes, à part si tu as vraiment une liste de produit qui rentrent dans d'autres interaction, là je crois que tu dois créer une table produit, ayant les attributs commun entre tes produit, et pour les cartes tu spécifies une autre table en liaison avec la table produit, qui contiendra les infos spécifique de la carte). Pour cet exemple je vais partir avec ta logique.
-Chaque carte correspond à un continent.
-Le continent alors pourrais avoir plusieurs cartes qui lui sont associées.
-Chaque carte pourrais avoir plusieurs fichiers audio.
-Et un fichier audio appartient nécessairement à une carte.
-La carte correspond aussi à une catégorie (Je crois que c'est ce que tu veux dire par 'fr')
-La catégorie est reconnu par un libellé.

Objectif:
-Récupérer la liste des continents, et pour chacun, afficher les cartes qui lui correspondent, par suite il va falloir afficher les fichiers audio qui correspondent à chaque carte.

Je travaille avec UML Smiley lol ce qui fait ici je vais poser un diagramme de classe mais sans évoqué les méthodes. Tu pourras dire que c'est MCD (Merise) mais avec une notation UML Smiley biggol .
Alors nous aurons cette figure:
upload/38089-concept.jpg
Alors au niveau de notre MLDR nous aurons :
upload/38089-concept2.jpg

fr, n'est pas une catégorie, mais fait plutôt référence à la langue à utiliser. Mes tables sont presque toujours construite avec ces 2 colonnes , fr(français) et en(anglais). Ça facilite la maintenance au niveau des 2 langues.

Donc une table Continents avec id, nom, et name (aussi utilisé ailleurs sur le site)
J'ai une table "produits" qui contient la liste complète de tous les produits, c'est là qu'est entré "Card", "Kit" et "Caller-kit" qui sont les 3 produits présent dans cette page.
La table "Caller" contient en fait les "sous-produits" de ces 3 derniers. Dans cette table donc:
-id
-continents_id (qui correspond au ID de la table continents)
-produits (qui "assigne" les sous-produits au produit Smiley biggol )
-nom (nom des sous-produits, ex: le nom des carte de sons, mais il est vrai que le nom de cette colonne ne convient peut-être pas)
-fr
-en (pour ces 2 dernières colonne... il s'agit de donner un nom plus compréhensible au sous-produits... ex: Card Whitetail, dans "fr" et "en" on indique qu'il s'agit du Cerf de Virginie)
-file (qui assigne le dossier à chaque carte)
Enfin la table "audio" qui contient la liste de tout les sons assignée à chaque carte. avec id, carte (qui fait référence à la colonne "nom" de la table "caller") et fichier (qui contient le nom de chaque son)

unami a écrit :
Un peu d'effort et tu comprendras comment a marche.
Je commence à comprendre comment ça marche Smiley cligne

unami a écrit :
Sincèrement si tu n'as pas maîtrisé la conception, et l'analyse d'un système d'infos pendent ta formation, ça va être très difficile pour toi car c'est la partie la plus importante dans un projet Smiley sweatdrop . Alors comme on dit, ceux qui cherchent trouve Smiley smile une petite recherche sur google et tu trouveras des choses qui puissent t'aider:
Merise , ici tu trouveras comment nous devons procéder dans l'analyse d'un système d'infos, et comment concevoir notre application.
Je pense qu'on s'est mal compris. Pour ce qui est de créer les table ça va. C'est quand il s'agit de créer des liens physique entre les tables (index?) à même phpMyAdmin que je ne parviens pas à reproduire... Cela dit je vais aller jeter un coup d'oeil à ton lien.

unami a écrit :
Le premier devoir d'un développeur est de trouver des solutions, disant que tu as laché les bras après la première difficultés Smiley lol .
J'ai pas lâché, juste mis de côté, faute de temps! Smiley langue Et je m'étais promis d'y revenir une fois les gros projets terminé... mais y'en a toujours d'autres qui arrivent entre temps! Smiley biggol

unami a écrit :
htmlentities et mysql_real_escape_string (Cette dernière sera obsolète dans les prochaines version, voir les alternatives) sont des fonctions très crucialeq pour la sécurité basique, et aussi pour assurer le bon affichage des textes.
Merci pour la précision!

unami a écrit :
Un peu de recherche Smiley smile : http://phpmaster.com/the-mvc-pattern-and-php-1/
Difficile de faire des recherches quand on sais pas quoi chercher exactement! Merci pour le lien!

Merci pour ton suivi! Smiley smile
Modifié par juliesunset (17 Apr 2013 - 15:34)