IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Série d'images aléatoires toutes différentes [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 179
    Par défaut Série d'images aléatoires toutes différentes
    Bonjour à tous !

    J'ai une banque d'image dont les URL sont stockés dans une base de données mysql. Je voudrais afficher une série de 4 ou 5 images mais que celles-ci soient toutes différentes les unes des autres. J'ai juste réussi à afficher une image aléatoire mais je n'arrive pas à adapter ce script:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    // connection à la DB
    include("php/connexion.php");
     
    // requête SQL qui compte le nombre total d'images dans la table et qui
    //récupère tous leurs noms 
    $result = mysql_query('SELECT * FROM utilisateurs') or die ('Erreur : '.mysql_error() );
    $nbimages= mysql_num_rows($result);
     
    // si on a récupéré un résultat on l'affiche.
    if($nbimages) {
        // on remplit un tableau contenant les noms des images
        $numimage=1;
        while($row = mysql_fetch_array($result)) 
       {
           $urlimages[$numimage]=$row["urlavatar_utilisateur"];
           $numimage++;
       }
     
       // on recherche aléatoirement le numéro de la case du tableau contenant le nom de l'image à afficher
       srand((double)microtime()*1000000);
       $affimage=rand(1,$nbimages); 
     
    }
    Cependant l'autre probème avec ce script c'est qu'il choisi aléatoirement une URL mais j'aimerai plutot qu'il choisisse aléatoirement une ID d'utilisateur (déjà définie dans mysql), et qu'il aille chercher l'URL associée à cette ID.

    Comment puis-je procéder ? j'ai pensé à plusieurs boucles if imbriquées les une dans les autres mais c'est lourd..

    Merci d'avance !
    RedVivi

  2. #2
    Membre émérite
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    function DelKeyTable($valeur, &$tab)
    {
            $tmp = array();
            foreach($tab as $key => $val)
            {
                    if($key != $valeur)
                    {      
                            $tmp[] = $val;
                    }
            }
            return $tmp;
    }
     
    $result = mysql_query('SELECT * FROM utilisateurs') or die ('Erreur : '.mysql_error() );
    $nbimages= mysql_num_rows($result);
     
    $all = array();
    while($tmp= mysql_fetch_assoc($result))
    {
    	$all[] = $tmp;
    }
     
    $nb = 3;
    while($nb > 0 && count($all) > 0)
    {
    	$ret = mt_rand(0, count($all) - 1);
    	$retenu[] = $all[$ret];
    	$all = DelKeyTable($ret, $all);
    	$nb--;
    }
    C'est largement perfectible, mais ça donne un idée...

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 179
    Par défaut
    Oulà..je suis un peu perdu là...comment celà fonctionne -t-il exactement?

  4. #4
    Membre émérite
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Par défaut
    D'abord j'ai fait une fonction qui supprime un élément du tableau en fonction de sa clef (je sais pas si il en existe une native en PHP)

    Ensuite j'execute ta requete et met tous les resultats dans un tableau indexé normalement par des entiers consécutifs

    Puis je selectionne au hasard avec mt_rand(min, max) un element du tableau, min etant 0, max le nombre d'enregistrement dans ton tableau...

    A chaque fois que je sort un element aléatoirement du tableau, je l'efface du tableau et recommence autant de fois que je veux sortir d'enregistrement ($nb)

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 138
    Par défaut
    Je ne comprends pas le but de ton script. Corrige moi si je me trompe mais tu souhaites afficher aléatoirement une image dont l'url est contenu en bdd ?

    Si c'est le cas, pourquoi en pas inclure directement le random dans la requete SQL et utiliser la clause limit pour limiter le nombre de resultats à retourner ?

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $result = mysql_query('SELECT * FROM utilisateurs order by rand() limit 0,2') or die ('Erreur : '.mysql_error() );
    Cette requete te renverrait deux lignes de ta table utilisateur choisies aléatoirement.

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 179
    Par défaut
    Celà me parait délicat si je veux utiliser l'indexation de la base de donnée ? (j'ai un champ id_utilisateur dans la base sql). En fait en faisant ça tu utilise une autre indexation si j'ai bien compris ?

  7. #7
    Membre émérite
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Par défaut
    Citation Envoyé par Raideman Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $result = mysql_query('SELECT * FROM utilisateurs order by rand() limit 0,2') or die ('Erreur : '.mysql_error() );
    Excellent ! J'y avais jamais pensé a celle là :p

  8. #8
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 179
    Par défaut
    Citation Envoyé par Raideman Voir le message
    Je ne comprends pas le but de ton script. Corrige moi si je me trompe mais tu souhaites afficher aléatoirement une image dont l'url est contenu en bdd ?

    Si c'est le cas, pourquoi en pas inclure directement le random dans la requete SQL et utiliser la clause limit pour limiter le nombre de resultats à retourner ?

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $result = mysql_query('SELECT * FROM utilisateurs order by rand() limit 0,2') or die ('Erreur : '.mysql_error() );
    Cette requete te renverrait deux lignes de ta table utilisateur choisies aléatoirement.
    Celà dépend si les 2 url renvoyés sont distinctes, si oui c'est parfait sinon ce n'est pas ce que je cherche.

  9. #9
    Membre émérite
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Par défaut
    Citation Envoyé par redvivi Voir le message
    Celà dépend si les 2 url renvoyés sont distinctes, si oui c'est parfait sinon ce n'est pas ce que je cherche.
    Je vois pas trop ce que tu veux dire par url renvoyé sont distinct, mais le resultat est que ça te sort aléatoirement des enregistrement complte de ta table !

  10. #10
    Membre Expert

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 138
    Par défaut
    En gros si j'ai bien compris, si deux utilisateurs ont la meme image, cette image ne doit apparaitre qu'une fois ?

    Dans ce cas, rajouter une clause distinct:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT distinct ( urlavatar_utilisateur ) FROM utilisateurs order by rand() limit 0,2

  11. #11
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 179
    Par défaut
    Ben je suppose que tous les users ont une image différente par défaut, donc je ne voudrais pas que j'ai dans cette série d'image 2 images identiques !

  12. #12
    Membre Expert

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 138
    Par défaut
    Ben y'a un truc qui cloche (enfin de ma compréhension) dans ta remarque :

    tous les users ont une image différente par défaut, donc je ne voudrais pas que j'ai dans cette série d'image 2 images identiques
    Si deux utilisateurs ont une image différente, alors comment en choisissant deux utilisateurs différents peut-on afficher la même image ?

    Si comme je le pense, tu souhaites affichers les avatars de tes utilisateurs sans répéter l'utilisateur en question alors ma premiere requete devrait faire l'affaire, sinon ben faut que tu m'expliques plus précisément comment est organisé ta bdd et ce que tu souhaites faire (avec un exemple concret de préférence).

  13. #13
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 179
    Par défaut
    Citation Envoyé par Raideman Voir le message
    Ben y'a un truc qui cloche (enfin de ma compréhension) dans ta remarque :



    Si deux utilisateurs ont une image différente, alors comment en choisissant deux utilisateurs différents peut-on afficher la même image ?

    Si comme je le pense, tu souhaites affichers les avatars de tes utilisateurs sans répéter l'utilisateur en question alors ma premiere requete devrait faire l'affaire, sinon ben faut que tu m'expliques plus précisément comment est organisé ta bdd et ce que tu souhaites faire (avec un exemple concret de préférence).
    Ha je comprends mieux le problème, le truc c'est qu'avec mon script (cf premier post), je pouvais avoir 2 mêmes images (le même utilisateur pouvait sélectionné "aléatoirement" plusieurs fois).

    Dans ma BDD, j'ai une table utilisateurs avec les champs: id_utilisateur, login_utilisateur, password_utilisateur, urlavatar_utilisateur.

    Au début je voulais afficher aléatoirement une série de 4 images toutes différentes, j'ai lamentablement échoué (donc de 4 utilisateurs différents, on exclu le fait qu'ils aient pu mettre une image identique). Mais je me suis rendu compte qu'il ne fallait pas que je récupère seulement l'URL, mais que je récupère aléatoirement l'url de l'image de l'utilisateur et son login (c'est mieux).

    Exemple d'affichage de ce que je pouvais avoir avec mon premier script:


    /images/img3.jpg
    /images/img3.jpg
    /images/img2.jpg

    pas bien tout ça, il y a 2 fois la même image et je ne peux récupérer le login



    Exemple de ce que je voudrais:

    /images/img3.jpg - login 3
    /images/img4.jpg - login 4
    /images/img2.jpg - login 2
    /images/img1.jpg - login 1

    J'espère que j'ai été assez clair....

  14. #14
    Membre Expert

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 138
    Par défaut
    Okay, je crois que j'ai compris, essaie donc ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $result = mysql_query('SELECT * FROM utilisateurs order by rand() limit 0,4') or die ('Erreur : '.mysql_error() );
    if($result){
      while($liste_user=mysql_fetch_assoc($result)){
        echo $liste[urlavatar_utilisateur].' - '.$liste[login_utilisateur].'<br />';
      }
    }
    Si tu acceptes le fait que deux utilisateurs peuvent choisir le meme avatar, alors cette requete te renverra 4 utilisateurs différents avec le login et l'image associée.

    Est ce que celà répond à ton besoin ?

  15. #15
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 179
    Par défaut
    Ben je pense que je me suis cassé la tête pour rien...je ne pensais pas que la solution été si simple...c'est même désolant tellement c'est simple lol ! En tout cas merci c'est bien ce que je cherchais merci beaucoup pour votre aide !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Générer n valeurs entière aléatoires toutes différentes
    Par Stepsbysteps dans le forum MATLAB
    Réponses: 2
    Dernier message: 31/01/2013, 14h41
  2. Réponses: 11
    Dernier message: 01/06/2012, 10h49
  3. Série d'image: affichage simultané de toutes les images
    Par weedcat dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 07/06/2009, 15h53
  4. Réponses: 7
    Dernier message: 03/12/2004, 10h15
  5. Compression d'une série d'images jpeg
    Par Tchello dans le forum Langage
    Réponses: 3
    Dernier message: 31/08/2003, 19h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo