un lien qui affiche 2 variables avec $_GET

Eléphanteau du PHP | 14 Messages

14 juil. 2009, 16:24

Bonjour,
Vrai débutant en php, je n'arrive pas à solutionner le problème suivant : transformer mon code (pour une galerie photo) de telle manière qu'au clic d'une miniature photo, puisse s'afficher 2 variables > la photo en grand ET sa description...
Bien qu'ayant cherché dans les forums ou tutos, tout ce que je sais faire pour l'instant, c'est de mettre ces 2 éléments (ndlr description + source photo) dans la même variable $afficher, ce qui oblige à composer une valeur peu "élégante".
Un grand merci par avance à qui acceptera de m'aider.
Voici le code en question (affichant 3 photos pour faire simple) :
<?php
//fabrique l'adresse des grandes images en fonction du parametre
if (!isset($_GET['photo']))
$afficher = 'Après la racontée : enfants redécouvrant "Mer bleue"</p><img src="images/autour_de_merbleue.jpg" alt="" />';
else{
	if ($_GET['photo'] == 'autour_de_merbleue' )
	$afficher = 'Après la racontée : enfants redécouvrant "Mer bleue"</p><img src="images/autour_de_merbleue.jpg" alt="" />';
	else if($_GET['photo'] == 'avecbbchouette' )
	$afficher = 'Avec "Bébés chouettes"</p><img src="images/avecbbchouette.jpg" alt="" />';
	else if($_GET['photo'] == 'baleines' )
	$afficher = 'Une histoire de baleines...</p><img src="images/baleines.jpg" alt="" />';
	else
	$afficher = 'Après la racontée : enfants redécouvrant "Mer bleue"</p><img src="images/autour_de_merbleue.jpg" alt="" />';
}
?>
<div id="galerie_bigphotos">
	<!-- appelle les grandes images avec les miniatures -->
	<p class="descriptif"><?php echo $afficher ?>
</div>
<div>
	<p>
		<a href="galerie2.php?photo=autour_de_merbleue" title=""><img src="images/minis/autour_de_merbleue.jpg" width="68" height="89" alt="" /></a><br />
		<a href="galerie2.php?photo=avecbbchouette" title=""><img src="images/minis/avecbbchouette.jpg" width="68" height="48" alt="" /></a><br />
		<a href="galerie2.php?photo=baleines" title=""><img src="images/minis/baleines.jpg" width="68" height="49" alt="" /></a><br />
	</p>
</div>

ViPHP
ViPHP | 2291 Messages

14 juil. 2009, 17:22

Bonjour,

Je te propose d'utiliser un switch () .
Ici un exemple, fait à la va vite .
$photo = (isSet($_GET['photo'])) ? $_GET['photo'] : '';

        switch ($photo)
          {
           case 'autour_de_merbleue':
                echo 'Après la racontée : enfants redécouvrant "Mer bleue"</p><img src="images/autour_de_merbleue.jpg" alt="" />';
             break;

           case 'avecbbchouette':
                echo 'Avec "Bébés chouettes"</p><img src="images/avecbbchouette.jpg" alt="" />';
             break;

           case 'baleines':
                 echo 'Une histoire de baleines...</p><img src="images/baleines.jpg" alt="" />';
             break;

           default:
             			$afficher = 'Après la racontée : enfants redécouvrant "Mer bleue"</p><img src="images/autour_de_merbleue.jpg" alt="" />';
             			echo  '<div id="galerie_bigphotos">

					    <p class="descriptif">'.$afficher.'
					</div>
					<div>
					    <p>
					        <a href="galerie2.php?photo=autour_de_merbleue" title=""><img src="images/minis/autour_de_merbleue.jpg" width="68" height="89" alt="" /></a><br />
					        <a href="galerie2.php?photo=avecbbchouette" title=""><img src="images/minis/avecbbchouette.jpg" width="68" height="48" alt="" /></a><br />
					        <a href="galerie2.php?photo=baleines" title=""><img src="images/minis/baleines.jpg" width="68" height="49" alt="" /></a><br />
					    </p>
					</div> ';

            break;


          }
Mais l'idée est là :wink:
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

Eléphanteau du PHP | 14 Messages

14 juil. 2009, 18:46

Bonjour Dunbar,

Merci pour ta disponibilité, mais euh.... je n'arrive pas à discerner dans ta réponse le moyen d'arriver à mes fins.
On est bien d'accord, ce que je souhaite obtenir au final c'est l'affichage de deux variables :
- l'une comprenant $afficherdescriptif = 'descriptif de la photo'
- l'autre comprenant $afficherphoto = 'photo_quelconque.jpg'
Chaque variable venant, au clic des miniatures, composer l'affichage des grandes images :
<div id="galerie_bigphotos">
<p><?php echo $afficherdescriptif ?></p>
<img src="images/<?php echo $afficherphoto ?>" alt="" />
</div>
Ta réponse contient-elle cette possibilité ? Et dans ce cas peux-tu m'aiguiller ?
Un grand merci.

ViPHP
ViPHP | 2291 Messages

14 juil. 2009, 18:51

Bonjour Dunbar,

Merci pour ta disponibilité, mais euh.... je n'arrive pas à discerner dans ta réponse le moyen d'arriver à mes fins.
On est bien d'accord, ce que je souhaite obtenir au final c'est l'affichage de deux variables :
- l'une comprenant $afficherdescriptif = 'descriptif de la photo'
- l'autre comprenant $afficherphoto = 'photo_quelconque.jpg'
Chaque variable venant, au clic des miniatures, composer l'affichage des grandes images :
<div id="galerie_bigphotos">
<p><?php echo $afficherdescriptif ?></p>
<img src="images/<?php echo $afficherphoto ?>" alt="" />
</div>
Ta réponse contient-elle cette possibilité ? Et dans ce cas peux-tu m'aiguiller ?
Un grand merci.
Fais un test avec le code et tu verra si c'est bien ça que tu souhaite :wink:
Le but du SWICTH est d'appliquer des option suivant la variable $_GET donc en gros si tu clique sur baleines tu a une case qui contient se que tu souhaite afficher pour baleines :wink:
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

ViPHP
AB
ViPHP | 5818 Messages

14 juil. 2009, 22:26

L'idée de Dunbar est de dire puisque les commentaires sont associés à la photo, tu ne devrais avoir besoin que de l'identifiant de la photo (ici son nom de fichier) à faire passer comme variable pour faire afficher ensuite son commentaire.

La méthode la plus courante serait sans doute de les associer dans une base de donnée, mais tu peux faire l'équivalent dans un tableau ex :
<?php
// Construction du tableau "$album" avec le nom des photos comme indice et les commentaires comme valeur

$album = array();

$album['autour_de_merbleue'] = 'Après la racontée : enfants redécouvrant "Mer bleue"';
$album['avecbbchouette'] = 'Avec "Bébés chouettes"';
$album['baleines'] = 'Une histoire de baleines..."';
//etc...


//Affichage (créé ici par une fonction pour faire plus propre dans le code html)
function affiche_grand_format($album) 
{
    if(isset($_GET['photo']) && array_key_exists($_GET['photo'],$album))
        {
        echo '<p class="descriptif">'.$album[$_GET['photo']].'</p><p><img src="images/'.$_GET['photo'].'.jpg" alt="" /></p>';
        }
}

?>
<div id="galerie_bigphotos">
    <!-- appelle les grandes images avec les miniatures -->
    <?php affiche_grand_format($album) ?>
</div>
<div>
    <p>
        <a href="?photo=autour_de_merbleue" title=""><img src="images/minis/autour_de_merbleue.jpg" width="68" height="89" alt="" /></a><br />
        <a href="?photo=avecbbchouette" title=""><img src="images/minis/avecbbchouette.jpg" width="68" height="48" alt="" /></a><br />
        <a href="?photo=baleines" title=""><img src="images/minis/baleines.jpg" width="68" height="49" alt="" /></a><br />
    </p>
</div> 
Modifié en dernier par AB le 15 juil. 2009, 19:21, modifié 1 fois.

ViPHP
AB
ViPHP | 5818 Messages

15 juil. 2009, 00:43

Ah oui pour répondre directement à ta question la syntaxe pour passer plusieurs variables sans l'url est de les séparer par '&' si l'url cible est faite par une redirection php et par '&' s'il sont passés dans le code html

<a href="page.php?var1=<?php echo $var1?>&var2=<?php echo $var2?>" >lien</a>

ou pour le contenu des variables en dur

<a href="page.php?var1=contenu_var1&var2=contenu_var2" >lien</a>

Dans ton cas puisqu'il s'agit de passer du texte comme argument, il serait utile d'employer les fonctions php urlencode() et urldecode() pour que les caractères spéciaux ne posent pas de problèmes dans la chaine de l'URL.
A savoir également que les chaines transmises dans l'URL sont limitées en nombre de caractères (min 255, dépend des navigateurs), et pour cette raison on évite souvent cette méthode pour transmettre du texte d'une page à l'autre.

Eléphanteau du PHP | 14 Messages

15 juil. 2009, 03:10

Merci à vous deux, AB et Dunbar, mais je crois que vous me surestimez...

Le code que j'ai initialement soumis reste a ma portée mais vos réponses me laissent hébété :shock:.
Bien sûr j'en devine la logique, mais je ne peux rien en faire d'autre que des essais par copier/coller, ce qui m'a entraîné vers des impasses :
Dunbar : en testant ta proposition, lorsque je clique sur une vignette pour afficher le descriptif et la photo en grand, ils apparaissent mais en revanche les vignettes disparaissent. De plus je reste toujours avec une variable incluant du code html, ce que précisément je voulais exclure grâce à deux variables concises ($afficherdescriptif = 'seulement le descriptif, puis $afficherphoto = 'seulement photo.jpg') à insérer dans le code html.
AB : la construction en tableau que tu proposes me conviendrait très bien (j'avais d'ailleurs essayé de me documenter en ce sens mais sans être capable de l'appliquer à mon cas), seulement en la testant j'ai obtenu l'erreur suivante : parse error in C:\wamp\www\essai1\galerie.php on line 13.
J'ai donc été voir cette ligne 13 :
$echo '<p class="descriptif">'.$album[$_GET['photo']].'</p><img src="images/'.$_GET['photo'].'.jpg" alt="" />';
Et là, eh bien en l'auscultant je me dis : qu'est-ce qu'elle a donc d'erronée cette ligne 13 ?
Ah ! peut-être le "&" devant echo ? Je l'enlève, mes vignettes s'affichent, je clique sur l'une et plouf, j'obtiens une page blanche. Ceci pour te dire à quel point je tâtonne...
Voili, voilà, je continue... mais si vous consentez à m'éclairer un peu plus, je mettrais un cierge sur l'autel du php en votre honneur !

PS : je comprend quand même la construction de $album et le rôle de function affiche_grand_format...

ViPHP
AB
ViPHP | 5818 Messages

15 juil. 2009, 03:57

Tu as bien corrigé, c'était une erreur d'étourderie. "echo" c'est pour afficher, ce n'est pas une variable.

Pour le reste j'ai recopié ton code html mais je pense qu'il comporte une erreur dans tes href. En effet tu mets l'adresse galerie2.php?... alors que tu me dis (dans le message d'erreur) que ta page se nomme galerie.php.
Avec cette correction cela devrait fonctionner.

Eléphanteau du PHP | 14 Messages

15 juil. 2009, 12:21

Bonjour AB,

J'avais effectivement déniché l'erreur (de "galerie2.php") après avoir édité mon dernier message. Dont acte.
Par contre, une fois les corrections faites, en affichant la galerie j'obtenais bien mes 3 vignettes mais en cliquant sur l'une ou l'autre l'erreur suivante apparaissait, que je ne comprend pas (nul en anglais, entre autre) :
Notice: Undefined variable: album in C:\wamp\www\essai1\galerie2.php on line 20
Warning: array_key_exists() [function.array-key-exists]: The second argument should be either an array or an object in C:\wamp\www\essai1\galerie2.php on line 20

La ligne 20 étant (je pense que tu t'en doutes) :
if(isset($_GET['photo']) && array_key_exists($_GET['photo'], $album))
De plus, j'ai essayé de trouver, sans succès bien sûr :?, où et quoi mettre comme code pour que la 1ère grande photo avec son commentaire s'affiche par défaut :
- à l'ouverture de la galerie
- ou si l'on saisit un nom de photo fantaisiste dans l'URL

Donc peut-être une dernière petite aide, et je devrais pouvoir mettre "résolu"...
Merci par avance.

ViPHP
AB
ViPHP | 5818 Messages

15 juil. 2009, 19:43

Oui ben c'est une autre erreur d'étourderie de plus... Je n'ai créé le code d'affichage sous forme de fonction qu'à la fin, au départ (et c'était plus simple comme exemple pour un débutant) j'avais prévu de mettre le code d'affichage dans ta partie html.
Et donc en transformant ce code d'affichage en fonction j'ai oublié de transmettre un paramètre.

J'ai édité mon précédent message qui contient l'ensemble du code et cette fois-ci je l'ai testé donc c'est ok :wink:


Maintenant pour une image par défaut qui s'affiche à l'ouverture de la page ou en cas d'URL fantaisite
on peut faire comme ceci :
<?php
// Construction du tableau "$album" avec le nom des photos comme indice et les commentaires comme valeur

$album = array();

$album['autour_de_merbleue'] = 'Après la racontée : enfants redécouvrant "Mer bleue"';
$album['avecbbchouette'] = 'Avec "Bébés chouettes"';
$album['baleines'] = 'Une histoire de baleines..."';
//etc...


//Affichage (créé ici par une fonction pour faire plus propre dans le code html)
function affiche_grand_format($album,$defaut) 
{

	$photo = (isset($_GET['photo']) && array_key_exists($_GET['photo'],$album))? $_GET['photo'] : $defaut;
	
	echo '<p class="descriptif">'.$album[$photo].'</p><p><img src="images/'.$photo.'.jpg" alt="" /></p>';

}

?>
<div id="galerie_bigphotos">
    <!-- appelle les grandes images avec les miniatures -->
    <?php affiche_grand_format($album,'autour_de_merbleue') ?>
</div>
<div>
    <p>
        <a href="?photo=autour_de_merbleue" title=""><img src="images/minis/autour_de_merbleue.jpg" width="68" height="89" alt="" /></a><br />
        <a href="?photo=avecbbchouette" title=""><img src="images/minis/avecbbchouette.jpg" width="68" height="48" alt="" /></a><br />
        <a href="?photo=baleines" title=""><img src="images/minis/baleines.jpg" width="68" height="49" alt="" /></a><br />
    </p>
</div> 
Tu remarque que la fonction qui appelle la fonction 'affiche_grand_format' dans ton code html a comme deuxième argument le nom de la photo qui doit s'afficher par défaut :
<?php affiche_grand_format($album,'autour_de_merbleue') ?>
donc dans cet exemple la photo par défaut est 'autour_de_merbleue'

Eléphanteau du PHP | 14 Messages

15 juil. 2009, 20:37

AB,

Je n'aurais jamais trouvé ça tout seul |*().

Par contre, les étapes des messages successifs aident à mieux comprendre les subtilités du code final :
- les corrigés des erreurs
- les modifs que tu as apporté aux url des liens
- l'ajout de l'affichage par défaut...

Bref, une très bonne leçon !
Je peux cliquer sur "résolu".

Un grand merci.
Tarak

PS: juste une petite chose : peux-tu m'apporter des précisions sur le "?" qui précède " ? $_GET['photo'] : $defaut " ? Au cas où je voudrais l'utiliser dans un autre contexte...

ViPHP
AB
ViPHP | 5818 Messages

15 juil. 2009, 21:40

L'explication est ici http://www.phpfrance.com/forums/voir_re ... .php#98297

Sinon pour comprendre les bases on a l'habitude de conseiller phpdebutant.org
Si ce n'est pas déjà fait, fais les tutos colonne de droite, c'est un bon exercice pour débuter.