Page 1 sur 1

Jonction SQL et conditions PHP

Posté : 26 avr. 2012, 10:34
par pixls
Bonjour,
Voici mon problème de façon simplifiée et en images. ( je pense que se sera plus parlant. )

Considérons 2 tables :

-Table1 :
Image


-Table2 :
Image

Et le code HTML/PHP suivant :
<div class="news">

	<div class="info_news">
		<?php echo $table1['date']?>
		<?php echo $table1['TitreNews']?>
		<?php echo $table1['TexteNews']?>
		<?php echo $table1['SousTitre']?>
	</div>
	
	<div class="diaporama_news">
	
		<ul id="Gallery<?php echo $table1['id']?>">
		
			<li><?php echo $table2['PhotoMax']?></li>
			<li><?php echo $table2['PhotoMin']?></li>
			<li><?php echo $table2['Titre']?></li>
			
		</ul>
		
	</div>
	
</div>

Voici la question :

Comment réussir a lier, trier et afficher les deux tables, pour que le résultat donne celui du schéma suivant : ( J'ai crée une colonne "NumNews" dans la table2 pour la lier avec l'ID de la table 1 )

Image

Ma logique serait de joindre les deux tables avec un INNER JOIN ayant pour liaison l'id de la table1 et le numnews de la table2.
De boucler avec un while la div class=news et à l'intérieur, boucler les <li> de manière à ce que le numnews (table2) et l'id (table1) soient correspondant.

Je ne sais pas comment m'y prendre en réalité, car j'ai essayé une multitude de possibilités...
Quelqu'un aurait t'il la solution à ce problème ?

Re: Jonction SQL et conditions PHP

Posté : 26 avr. 2012, 10:47
par moogli
salut,

première chose au niveau de ton code
<?php echo $table1['date']?>
                <?php echo $table1['TitreNews']?>
                <?php echo $table1['TexteNews']?>
                <?php echo $table1['SousTitre']?>
c'est totalement inutile d'ouvrir / fermer les tag a chaque ligne, ça grossis le fichier pour rien et on perd au niveau de la facilité de lecture.
<?php 
echo $table1['date'];
echo $table1['TitreNews'];
echo $table1['TexteNews'];
echo $table1['SousTitre'];
?>
tu auras la même chose.

idem pour la liste utilise la syntaxe heredoc ou la concaténation.

pour ton problème tu a deux choix
- la jointure et avoir des données "en trop" (titre et corps de la news)
- deux requêtes, dans le traitement de l'affichage des news tu fait une requête pour récupérer les images associées.

A près faut voir au niveau performance le 1er sera peu être le mieux vu que tu ne fait qu'une seule requête et non une requête + 1 requête X nombre de requête.

Dans le premier cas, il faut que tu organise une césure dans la boucle.

par exemple
<?php
$old=null;
echo 'le debut du div';
while($data = mysql_fetch_assoc($sql)){
if ($old === null) {
 $old = $data['idnews']; // pour l'init
// affichage du corps de news
}
if($old != $data['idnews']){
echo '</div><div debut du div news>';
//affichage du corps de news
}
//affichage des images
}
echo '</div>
?>
a tester mais le principe est la

@+

Re: Jonction SQL et conditions PHP

Posté : 26 avr. 2012, 11:04
par pixls
Je te remercie.

Je vais tenter d'appliquer ce principe à mon projet.
Je reviens en cas de succès ou si je pète les plombs lol ( car là c un niveau un peu plus complexe que ce que j'ai pu tester.)

Re: Jonction SQL et conditions PHP

Posté : 26 avr. 2012, 11:48
par pixls
Malheureusement, je ne vois pas précisément comment réussir à l'implanter.
J'avoue que je désespère...

Re: Jonction SQL et conditions PHP

Posté : 26 avr. 2012, 12:15
par moogli
Je ne fait pas de support par MP ;)

Qu'a tu fait ?
et où est ce que ça bloque ?

@+

Re: Jonction SQL et conditions PHP

Posté : 26 avr. 2012, 17:45
par pixls
Voilà l'adaptation de ton code dans mon exemple :
<?php
	try
	{
	$bdd = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', '');
	}
	catch(Exception $e)
	{
	die('Erreur : '.$e->getMessage());
	}
	
	
	$sql = $bdd->query('SELECT *
						FROM table1
						INNER JOIN table2
						ON table1.id = table2.NumNews
						');
						
						
					
	
	$old=null;
	$result = mysql_query($sql);
	echo 'le debut du div';						
	while ($data = mysql_fetch_assoc($result)) {
	if ($old === null) {
	$old = $data['id'];
	}
	if($old != $data['id']){
	echo '</div><div debut du div news>';
	?>				
						
<div style="float: left; width: 20%;" class="news">

        <div class="info_news">
                <?php
				echo $data['Date'];
                echo $data['TitreNews'];
                echo $data['TexteNews'];
                echo $data['SousTitre'];
				?>
        </div>
       
        <div class="diaporama_news">
       
                <ul id="Gallery<?php echo $data['id']?>">
               
                        <li><img style="width: 30%;" src="<?php echo $data['PhotoMax']?>"/></li>
                        <li><img style="width: 10%;" src="<?php echo $data['PhotoMin']?>"/></li>
                        <li><?php echo $data['Titre']?></li>
                       
                </ul>
               
        </div>
       
</div>
	
<?php
	}
	}
	echo '</div>';

	$sql->closeCursor();

?>
L'erreur retournée :

Image

Plusieurs interrogations :

-Comment les informations de la table2 dont le "NumNews" est 1 ( Cad les 4 premières entrées de la table2 ) peuvent-être associées à l'id de la table 1 ( en gros quand j'ai la News avec l'id 1, comment faire pour que les 4 entrées dont le NumNews est 1 y soit associées ?). Est-ce le rôle du INNER JOIN - ON ( qui associe l'id de la table 1 automatiquement aux NumNews dont la valeur est 1 ) ?

-De ce que j'ai compris dans mes recherches, le mysql_fetch_assoc () permet d'associer des données dans un array ? Mais à quoi cela sert-il et comment lire l'association dont je parlais à la ligne précédente ?

-La variable $old joue quel rôle ?

Mon but étant d'associer les infos de la table2, qui ont en commun leur NumNews, avec l'id de la table1 pour que quand la news avec l'id=1 apparait, les photos et autres infos, dont le NumNews est égale a 1(dans la table 2) apparaissent aussi. Comme le nombre d'informations (par ex : le nombre de photos) est variable suivant la news, comment réussir a gérer cette variable.

J'espère ne pas embrouiller la chose lol, mais comme je débute en PHP mySQL, j'ai besoin de comprendre.

Merci d'avance pour les éclaircissements

Re: Jonction SQL et conditions PHP

Posté : 26 avr. 2012, 18:13
par moogli
Tu mélange pdo et l'extension mysql c'est pas bon tu tout revois ton code, les messages d'erreur doivent y être liés.

1/ en gros oui je te suggère de lire un tuto ou deux sur le langage SQL ce n'est jamais du temp perdu (par exemple http://sqlpro.developpez.com

2/ mysql_fech_assoc ne peux pas être utilisée avec pdo. L'équivalent pdo est PDO::fetch(PDO::FETCH_ASSOC)

3/ $old permet de savoir qu'elle était la news au tour précédent du while et c'est pas la même ferme le div, on en ouvre un autre et on affiche la new. Sinon on ne tiens compte que de l'image.


@+

Re: Jonction SQL et conditions PHP

Posté : 27 avr. 2012, 15:08
par pixls
Merci pour ces nouvelles indications.

J'ai donc réarrangé la requête de connexion à mySQL ( j'ai laissé tomber le PDO et recodé de manière traditionnelle. Cette "boulette" étant due aux diverses sources que j'utilise, donc j'ai mélangé ...shame on me ! )
Maintenant la connexion fonctionne.
Ensuite j'ai utilisé ton morceau de code en faisant la césure dans ma boucle.

Du coup le résultat est PRATIQUEMENT opérationnel :

Image

Comme tu peux le voir, pour la galerie 1 tout fonctionne, mais la galerie 2 bug.

voici mon code :
<?php
	$db = mysql_connect('127.0.0.1', 'root', '');
	mysql_select_db('test',$db);
	$sql = 'SELECT *
			FROM table2
			INNER JOIN table1
			ON table2.NumNews = table1.id';

	$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); 
					
	$old=null;		
				
	while ($data = mysql_fetch_assoc($req)) {
		
	if ($old === null) {

	$old = $data['NumNews'];
?>	
	
<div class="news">
	<div class="info_news">
		<?php
			echo $data['Date'];
			echo $data['TitreNews'];
			echo $data['TexteNews'];
			echo $data['SousTitre'];
		?>
	</div>
       
	<div class="diaporama_news">	   
		<ul id="Gallery<?php echo $data['NumNews']?>">Galery <?php echo $data['NumNews']?>
			<?php 
				}
				if($old != $data['id']){
			?>
		</ul>
	</div>
</div>

<div class="news">
	<div class="info_news">
		<?php
			echo $data['Date'];
			echo $data['TitreNews'];
			echo $data['TexteNews'];
			echo $data['SousTitre'];
		?>
	</div>
       
	<div class="diaporama_news">
		<ul id="Gallery<?php echo $data['NumNews']?>">Galery <?php echo $data['NumNews']?>
		
			<?php
				}
			?>
					
			<li><?php echo $data['PhotoMax']?><?php echo $data['PhotoMin']?><?php echo $data['Titre']?></li>
                        
						
			<?php
				}
			?>					
		</ul>               
	</div>       
</div>
	
<?php
	mysql_close();
?>
Je pense que le bug vient soit d'une mauvaise césure de ma part dans la boucle, soit il manque une condition quand la boucle passe à la galerie 2 ( condition sur le $old ? )

Je bloque à nouveau à cet endroit, mais j'ai tellement l'impression d'être proche de la solution ( enfin !!! ) que j'ai encore besoin de tes lumières.

Merci d'avance :)

Re: Jonction SQL et conditions PHP

Posté : 27 avr. 2012, 15:31
par pixls
J'en ai profité pour mettre à jour mon schéma de départ car la structure était fausse. :)

Re: Jonction SQL et conditions PHP

Posté : 28 avr. 2012, 13:45
par pixls
J'ai réussi à faire fonctionner le script.

Pour ceux que ca intéresse, il faut ajouter "$old = $data['NumNews']" dans le deuxième if :
if($old != $data['id'] && $old = $data['NumNews']){ 
			?>
		</ul>
	</div>
</div>

<div style="float: left; width: 40%; background-color: #9797FF; height: auto; margin:10px;" class="news">
	<div class="info_news">
		<?php
			echo $data['Date'];
			echo $data['TitreNews'];
			echo $data['TexteNews'];
			echo $data['SousTitre'];
		?>
	</div>
       
	<div class="diaporama_news">
		<ul id="Gallery<?php echo $data['NumNews']?>">Galerie <?php echo $data['NumNews']?>
		
			<?php
				}
En tout cas merci encore mooglie pour tes lumières !!

Re: Jonction SQL et conditions PHP

Posté : 19 août 2012, 15:49
par maudpasse
Bonjour,

j'ai le même problème que toi, je viens de lire et d'essayer d'incorporer ton code au mien, mais cela ne fonctionne pas.
J'ai deux tables comme toi, une contenant mes news et une autre contenant les images reliées par id_news dans ma table news et num_news dans ma table images.

Seulement lors de l'affichage, cela n'affiche pas les news qui n'ont pas d'images et pas toutes les images, certaines news sont également répétées #-o

pourrais-tu me donner le lien de ton exemple pour que je vois le résultat final ?

Je te remercie,

Re: Jonction SQL et conditions PHP

Posté : 19 août 2012, 15:55
par moogli
salut,

utilise une jointure gauche ou droite plutôt qu'une naturelle.

je te conseil de créer une sujet à toi, avec ton code.

@+