Galerie photo dans une requete sql

Le problème exposé dans ce sujet a été résolu.

Bonjour,

J'ai une requête sql qui m'affiche une liste d'avis avec des photos.

Pour voir les photos en plus grand, j'ai trouvé une lightbox que j'avais commencé à adapter mais j'ai un problème que je ne comprends pas.

La lightbox fonctionne mais uniquement sur le 1er avis, quand je clique sur une photo d'un autre avis, la lightbox s'ouvre mais avec les photos du 1er avis.

Savez-vous pourquoi ? Et comment régler le problème ?

Merci de votre aide

Salut !

 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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
$req = $bdd->prepare('SELECT *,  DATE_FORMAT(date_avis, \'%d/%m/%Y\') AS date FROM modale WHERE campings_id = ? ORDER BY date_avis DESC');
    $req->execute(array($_GET['campings_id']));
    while ($donnees = $req->fetch())
    {
    ?>
<article id="photos">
                <section>
                    <?php echo '<a href="#photo_0"><img src ="photos/'.unserialize($donnees['photo_0']).'" alt = ""/></a>';?>
                    <?php echo '<a href="#photo_1"><img src ="photos/'.unserialize($donnees['photo_1']).'" alt = ""/></a>';?>
                    <?php echo '<a href="#photo_2"><img src ="photos/'.unserialize($donnees['photo_2']).'" alt = ""/></a>';?>
                    <?php echo '<a href="#photo_3"><img src ="photos/'.unserialize($donnees['photo_3']).'" alt = ""/></a>';?>
                    <?php echo '<a href="#photo_4"><img src ="photos/'.unserialize($donnees['photo_4']).'" alt = ""/></a>';?>
                    <ul>
                    <li>
                        <div class="lb-overlay" id="photo_0">
                            <?php echo '<img src = "photos/'.unserialize($donnees['photo_0']).'" alt = "" />';?>
                            <div>
                                <a href="#photo_4" class="lb-prev">Prev</a>
                                <a href="#photo_1" class="lb-next">Next</a>
                            </div>
                            <a href="#photos" class="lb-close">x Close</a>
                        </div>
                    </li>
                    <li>
                        <div class="lb-overlay" id="photo_1">
                            <?php echo '<img src = "photos/'.unserialize($donnees['photo_1']).'" alt = "" />';?>
                            <div>                           
                                <a href="#photo_0" class="lb-prev">Prev</a>
                                <a href="#photo_2" class="lb-next">Next</a>
                            </div>
                            <a href="#photos" class="lb-close">x Close</a>
                        </div>
                    </li>
                    <li>
                        <div class="lb-overlay" id="photo_2">
                            <?php echo '<img src = "photos/'.unserialize($donnees['photo_2']).'" alt = "" />';?>
                            <div>                           
                                <a href="#photo_1" class="lb-prev">Prev</a>
                                <a href="#photo_3" class="lb-next">Next</a>
                            </div>
                            <a href="#photos" class="lb-close">x Close</a>
                        </div>
                    </li>
                    <li>
                        <div class="lb-overlay" id="photo_3">
                            <?php echo '<img src = "photos/'.unserialize($donnees['photo_3']).'" alt = "" />';?>
                            <div>                           
                                <a href="#photo_2" class="lb-prev">Prev</a>
                                <a href="#photo_4" class="lb-next">Next</a>
                            </div>
                            <a href="#photos" class="lb-close">x Close</a>
                        </div>
                    </li>

                    <li>
                        <div class="lb-overlay" id="photo_4">
                            <?php echo '<img src = "photos/'.unserialize($donnees['photo_4']).'" alt = "" />';?>
                            <div>                           

                                <a href="#photo_3" class="lb-prev">Prev</a>
                                <a href="#photo_0" class="lb-next">Next</a>
                            </div>
                            <a href="#photos" class="lb-close">x Close</a>
                        </div>
                    </li>
                </ul>        
                </section>
            </article>
<?php
    }
    $req->closeCursor();
?>

J'ai juste viré le reste de l'affichage pour que ce soit moins long.

Pour le code, j'ai juste modifier les liens pour que tu vois le code d'origine.

Je pense que le problème vient peut être des id des photos dans la class="lb-overlay", mais j'ai un id sur article et ça ne pose pas de problème. Du coup je sais pas.

+0 -0

Salut, Je suppose que derrière tu utilise du jaascript (jquery ?) pour ta lightbox. Et je suppose que dans ce script du fait un truc du genre $("#photo_0").lightbox() je me trompe ?

Si c'est le cas, c'est normal que ça ne marche pas, car tu a plusieurs div avec un id photo_0, ce qui n'est jamais bon. Par principe, un id doit être unique. jQuery se base sur ce principe, et lorsque tu fait un $("#photo_0"), jQuery lit le code source de ta page html, et dès qu'il trouve un élément avec id="photo_0", il s'arrête et te retourne l'élément en question.

Ce qui faudrait, c'est faire en sorte que les id soient différent, par exemple :

1
div class="lb-overlay" id="<?php echo $donnees['article_id'] ?>photo_3">

Et de même, ta balise article doit avoir son propre id, car là si ta requête SQL te retourne 5 élements, tu aura 5 <article id="photos"> ce qui n'est pas bon.

T'ai-je aidé ? :)

J'ai un seul article id=photos dans la requête mais effectivement, il y en a plusieurs au final puisse que c'est dans une boucle, mais cet id là ne pose pas de problème puisque ça fonctionne nickel.

Et non, je n'utilise ni JS, ni JQuery, la lightbox est en full css

+0 -0

Comme le dit ShellBash, c'est bien ta boucle avec les id=photo_0, id=photo_1 le soucis, puisque tu vas avoir plusieurs photos avec les mêmes id.

Dans ton cas, tu peux faire par exemple :

1
2
3
<div class="lb-overlay" id="photo_0_<?php $donnees['id'] ?>">
...
<div class="lb-overlay" id="photo_1_<?php $donnees['id'] ?>">

C'est à dire mettre l'ID de l'avis dans l'ID de la div, comme ça tu es sûr de ne jamais avoir plusieurs div avec le même ID.

Merci à vous deux :)

J'avais bien pensé à me servir de l'id de l'avis mais sans savoir comment.

J'avais pas tilté sur la réponse de Shelbash :)

Ca fonctionne nickel maintenant, mais j'ai un autre petit problème avec mes photos qui du coup se répercute dans la lightbox.

En fait, dans l'affichage de mes avis j'ai de 0 à 5 photos à afficher. Pour 5 pas de soucis, mais dès que c'est <5 j'ai les textes alternatifs qui s'affichent… Donc à part sur FF, c'est forcement moche!

Donc ce que je voudrai, c'est que ma requête n'affiche que le nombre voulu de <img> en fonction du contenu de ma bdd mais je ne sais pas comment m'y prendre.

Une ligne sans photo de ma bdd se présente comme ça:

s:0:""; N; N; N; N;

Merci de votre aide

J'obtiens ça:

s:20:"100-chats-166205.jpg"; s:20:"100-chats-166208.jpg"; s:21:"100-chats-1662011.jpg"; s:21:"100-chats-1662013.jpg"; s:21:"100-chats-1662018.jpg";

Ca veut dire que pour faire un count(), il faut que j'ai une table séparée pour mes photos ?

+0 -0

Personnellement, oui, j'aurai mis une autre table pour les photos de mes avis.

Dans ton cas actuel, j'ai l'impression que tu as essayé de sérialiser les urls de tes images de façon exotique ^^

Comment fais-tu pour récupérer uniquement les URL des images ?

+0 -0

De façon exotique LOL

En fait j'enregistre seulement le nom dans la bdd et j'ai un dossier($path) dans lequel toutes les photos sont enregistrées après la vérif de l'upload

1
if(move_uploaded_file($_FILES['profil']['tmp_name'], $path.$_FILES['profil']['name']))

Et avant l'insert into bdd, j'ai fais comme ça

1
$photo_0 = serialize($_FILES['photos']['name'][0]);

et j'enregistre tout le form y compris les photos dans une seule table

+0 -0

Avec ta façon de sérialiser les photos, tu perds en facilité d'utilisation.

J'imagine que tu fais ceci :

1
2
3
4
5
6
<?php

$photo_0 = serialize($_FILES['photos']['name'][0]);
$photo_1 = serialize($_FILES['photos']['name'][1]);
...
// Enregistrement en BDD de $photo_0 . $photo_1 . ...

Le plus simple serait de créer un array AVANT de l'enregistrer en BDD, puis de le sérialiser :

1
2
3
4
5
<?php

$photos = array($_FILES['photos']['name'][0],$_FILES['photos']['name'][1],...);
$seralized_photos = serialize($photos);
//Puis enregistrement en BDD de serialized_photos

Lorsque tu souhaites récupérer le tout, tu récupères la lignes en BDD, et tu désérializes :

1
2
3
4
<?php

// Récupération en BDD des photos sérialisées
$photos = unserialize($photos_provenant_de_la_bdd);

Et là tu récupères un array propre. Tu peux donc le parcourir avec un foreach :

1
2
3
4
5
6
<?php

foreach ($photos as $key => $value)
{
  echo '<a href="#photo_' . $key . '"><img src ="photos/' . $value  . '" alt = ""/></a>';
}

et si tu veux compter combien tu as de photos sur cet avis :

1
2
3
<?php

$nbr_photos = count($photos);
+1 -0

J'ai fais ce que tu m'as proposé et effectivement, c'est plus simple et je n'ai plus de problème avec les textes alternatifs puisque juste le nombre de balise image se créent donc c'est cool.

Mais évidement un problème réglé en entraine un autre !

Je n'arrive plus à naviguer dans ma lightbox.

Je ne sais pas comment donner la bonne valeur aux ancres prev et next parce qu'il faudrait que ce soit $value +1 et $value -1.

J'ai essayé avec les fonctions prev() et next(), mais ça m'a envoyé les noms des photos dans l'url et pas dans la lightbox.

Je sais pas si c'est possible.

Edit: Je viens de me rendre compte que j'ai plusieurs listes au lieu d'une seule, donc déjà j'ai une histoire de html à règler…

+0 -0

Voilà le 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
38
39
40
41
42
43
<?php

// J'imagine ici que tu récupères un avis que tu stocke dans $donnees

// $donnees['id'] = ID de l'avis
// $donnees['photos'] = photos de l'avis

$photos = unserialize($donnees['photos']);

$nbr_photos = count($photos);
// $max_key est la valeur max de la clé qu'on retrouvera dans le tableau des photos
$max_key = $nbr_photos - 1;

foreach ($photos as $key => $value)
{
    echo '<a href="#photo_' . $key . '_' . $donnees['id'] . '"><img src ="photos/' . $value  . '" alt = ""/></a>';
}

echo '<ul>';

foreach ($photos as $key => $value)
{
    // détermination des photos precedentes et suivantes
    // si on est a la derniere, la prochaine est la 0
    $next_key = ($key === $max_key) ? 0 : $key + 1;
    // si on est à la premiere, la precedente est la derniere (max)
    $prev_key = ($key === 0) ? $max_key : $key - 1;
    ?>
    <li>
        <div class="lb-overlay" id="photo_0">
            <?php echo '<img src = "photos/'. $value . '" alt = "" />';?>
            <div>
                <?php
                echo '<a href="#photo_' . $prev_key . '_' . $donnees['id']. '" class="lb-prev">Prev</a>';
                echo '<a href="#photo_' . $next_key . '_' . $donnees['id']. '" class="lb-next">Next</a>';
                ?>
            </div>
            <a href="#photos" class="lb-close">x Close</a>
        </div>
    </li>
    <?php
}
echo '</ul>';

Désolé pas trop le temps de commenter, dis-moi si tu as des soucis. Le code est fonctionnel excepté pour ce qui sort de la BDD.

+0 -0

Salut,

Désolée j'ai pas eu le temps d'appliquer, je le ferai demain.

Je pense avoir compris le principe: tu comptes le nb de photos pour récupérer le nb de clés du tableau et ensuite faire une boucle en fonction du nb de clés pour créer la liste.

Ce que je n'ai pas compris c'est la fin de ce que tu donnes comme valeur à next_key et prev_key.

? 0 : $key + 1; et ? $max_key : $key - 1

Que veulent dire les "?" et les ":"

En tout cas merci pour ton aide, c'est vraiment sympa :)

C'est bien ça.

Alors, les '?' et ':', ce sont des ternaires

Ces 2 lignes sont égales à ça :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

// $next_key = ($key === $max_key) ? 0 : $key + 1;
if ($key === $max_key)
{
  $next_key = 0;
}else
{
  $next_key = $key + 1;
}

...

// $prev_key = ($key === 0) ? $max_key : $key - 1;
if ($key === 0)
{
  $prev_key = $max_key;
}else
{
  $prev_key = $key - 1;
}

C'est quand même plus rapide mes 2 petites lignes non ? ;)

Pas de quoi ;)

Ca marche nickel !!

Je m'étais juste emmêlée les pinceaux avec les liens, j'avais pas mis $key et $donnees dans le même sens partout, donc forcément ça foirait.

C'est trop cool, j'y serai jamais arrivé sans toi :)

Niveau JS, je te préviens j'y connais vraiment rien. C'est un upload que j'ai trouvé et plus ou moins adapté parce que j'avais eu un problème en php.

Je t'explique mon problème: j'ai 2 uploads, un pour les photos et un pour une photo de profil sur lesquels j'ai mis une alerte qui s'ouvre quand le format n'est pas bon.

Pour l'up multiple ça fonctionne nickel mais pour l'up de profil, j'ai caché le input sous une image par défaut.

Du coup quand je referme l'alerte, je n'ai plus rien pour pouvoir reposter une autre image.

Ce que je voudrai donc c'est qu'à la fermeture de l'alerte la photo par défaut avec l'input revienne.

Voilà le code de l'alerte

  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
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/**
     * Created by Elvis Konjoh 
     *
    **/
var confirmOnLeave = function(msg) {

    window.onbeforeunload = function (e) {
        e = e || window.event;
        msg = msg || '';

        // For IE and Firefox
        if (e) {e.returnValue = msg;}

        // For Chrome and Safari
        return msg;
    };

};
var cancelConfirmOnLeave = function() {

    window.onbeforeunload = true;

};


var alertConfig={
            boxBgClass:"",//Background class
            boxBgColor:"",
            boxBtnCloseClass:"",//Button close class
};
/**
 * created by Konjoh Elvis
 *
 */

window.alert = function(alertMessage,title)// On  declare la fonction qui va redesigner l'alerte de base en testant s'il s'agit bien d'une fenêtre alert()
{   
        if(title==undefined)
         title="Oups !";
        var _body = document.getElementsByTagName('body') [0];
        var _layer = document.createElement('div');
        var _box = document.createElement('div');
        var _box_title = document.createElement('h1');
        var _box_text = document.createElement('p');
        var _title = document.createTextNode(title);
        var _text = document.createTextNode(alertMessage);
        var _btn_text = document.createTextNode('OK');
        var _btn =document.createElement('button');
        var _close_btn = document.createElement('span');
        var _close_icon = document.createTextNode(String.fromCharCode(215));


        _close_btn.appendChild(_close_icon);
        _box_title.appendChild(_title);
        _box_title.appendChild(_close_btn);

        if(typeof(alertMessage)=="string")
         _box_text.innerHTML=HTMLentities(alertMessage);
        else
           _box_text.innerHTML=alertMessage;

        _btn.appendChild(_btn_text);

        _box.appendChild(_box_title);
        _box.appendChild(_box_text);
        _box.appendChild(_btn);
        _body.appendChild(_box);
        _body.appendChild(_layer);
        // Background layer image
        var _bg_layer_img = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAFoEvQfAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDY2RDlEMDc2NkU3MTFFMkFBQjJEN0JEQ0M0NjM3Q0IiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDY2RDlEMDg2NkU3MTFFMkFBQjJEN0JEQ0M0NjM3Q0IiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0NjZEOUQwNTY2RTcxMUUyQUFCMkQ3QkRDQzQ2MzdDQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0NjZEOUQwNjY2RTcxMUUyQUFCMkQ3QkRDQzQ2MzdDQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvElfFoAAAANSURBVHjaY2BgYPAFAABSAE5KPdTrAAAAAElFTkSuQmCC';
        // Set layer style
        _layer.setAttribute('style','z-index:9998;position:fixed;height:100%;width:100%;top:0;left:0;background: url(data:image/png;base64,'+_bg_layer_img+') repeat top left');

        // Set box class for style
        if( alertConfig.boxBgClass!=undefined && alertConfig.boxBgClass !="" )
            _box.className='alert_box '+alertConfig.boxBgClass;
        else
            _box.className = 'alert_box';

        var _boxBgColor="ghostwhite";
        if(alertConfig.boxBgColor!=undefined && alertConfig.boxBgColor !="")
            _boxBgColor=alertConfig.boxBgColor;
        // Set box position
        _box.setAttribute('style', 'background-color:'+_boxBgColor+';position:absolute;z-index:9999;top:'+parseInt((window.innerHeight/2)-_box.offsetHeight)+'px;left:'+parseInt((window.innerWidth/2)-(_box.offsetWidth/2))+'px;');

        //set btn class
        if(alertConfig.boxBtnCloseClass!=undefined && alertConfig.boxBtnCloseClass !="" )
            _btn.className=alertConfig.boxBtnCloseClass;
        else
            _btn.className="button";
        // Layer on click event
        _layer.addEventListener("click", function(){
            _box.className = _box.className+' alert_box_important';
            setTimeout(function(){
                    if( alertConfig.boxBgClass!=undefined && alertConfig.boxBgClass !="" )
                        _box.className='alert_box '+alertConfig.boxBgClass;
                    else
                        _box.className = 'alert_box';
            },100);
        }, false);

        // Button on click event
        _btn.addEventListener("click", function(){
            _body.removeChild(_box);
            _body.removeChild(_layer);
            if(typeof urlToGo == 'string'){
                cancelConfirmOnLeave("");
                //window.location.href = urlToGo;
            }
           // alert("btn close");
            cancelConfirmOnLeave("");

        }, false);

        // Window resize event
        window.onresize = function(event) {
            // Set box position
            _box.setAttribute('style', 'background-color:'+_boxBgColor+';position:absolute;z-index:9999;top:'+parseInt((window.innerHeight/2)-_box.offsetHeight)+'px;left:'+parseInt((window.innerWidth/2)-(_box.offsetWidth/2))+'px;');
        };

        // Document keypress event
        document.onkeypress = function(event) {
            if(event.keyCode == 13){
                _body.removeChild(_box);
                _body.removeChild(_layer);
                if(typeof urlToGo == 'string'){
                    //window.location.href = urlToGo;
                    //window.onbeforeunload = true;

                }
                cancelConfirmOnLeave("");
            }
        };

        _close_btn.addEventListener("click",function(){


            _body.removeChild(_box);
            _body.removeChild(_layer);
           // window.onbeforeunload = true;
            cancelConfirmOnLeave("");
        });

        confirmOnLeave("test");
};

Et la partie de l'up qui affiche l'alerte

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
else{
                 alertConfig={
                   boxBgClass:"myButton", //Background class
                   boxBgColor:"darkcyan",
                   boxBtnCloseClass:"myButton", //Button close class
                }
                alert('Le fichier uploadé n\'est pas une image !</br>Formats acceptés: jpeg, png, jpg ou gif.');

            }

 Et ça sur le input: onchange="document.getElementById('ph_profil').innerHTML = ''"

Bon courage :)

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte