Probleme php mysql

Résolu
Bonjour a tous,

Je suis entrain de coder mon site

J ai un petit souci

J ai une base de donné comme ceci

id/date/image/dossier
1/201-05-27/222.jpg/1
2/201-05-27/333.jpg/1
3/2012-65-56/215.jpg/2

j aimerais afficher sur une page la photos avec le lien vers le dossier

Mais vu que j ai plusieurs fois le meme dossier j aimerais affihcer uniquement un dossier et une photos

Pour le dossier je fais comme ceci par contre je bloque pour prendre qu une seule image

<?php echo "\t\t<ul>\n";
include('config.php');
$req = mysql_query("SELECT DISTINCT dossier FROM exif ORDER BY date ASC") or die(mysql_error()); // Requête SQL
while($dnn = mysql_fetch_array($req))
{
?>

<li> <a href=" <?php echo "contenu3.php?dossier=$dnn['dossier']";?>"><img src="<?php echo $dnn['dossier'];?>/<?php echo $dnn['image'];?>" alt="Photo prise le <?php echo $dnn['datef'];?> à <?php echo $dnn['heure'];?> par <?php echo $dnn['personne'];?> ""/></a>

</li>

<?php
}
mysql_close();
?>
</ul>

Merci de votre aide

18 réponses

  1. avant dans la fonction quand la photo n'était pas en paysage la fonction s'appelait elle même (récursive) par la ligne :
    //on reboucle sur la fonction pour en "chercher" une autre
    image_aleatoire_paysage($dossier,$s_array_image,$cpt);

    donc elle s'exécute plusieurs fois
    et dans ce cas on "perdait" la réponse

    maintenant dans la fonction j'ai mis une boucle for($i
    ...

    qui recherche la photo paysage
    dès qu'elle est trouvée ça return les données image

    bon j'espère que c'est assez clair ?
    1. Merci super ca fonctionne c est ce que je voulais

      Je n ai pas essayer avec un echo car les photos sont juste

      Par contre je n es pas vraiement compris ce que tu as modifié

      Merci de ton aide

      Si tu pouvais un peu m expliquer ce serai super
      1. bon ce matin j'ai trouvé, cela venait de l'appel recursif de la fonction qui ne retournait pas la valeur vers l'appel original depuis la boucle foreach.

        J'ai changé un peu de methode dans la fct:

        <?php   
        //fonction php que tu mets au début du body   
        function image_aleatoire_paysage($dossier,$s_array_image){   
        	$nb_image_ds_dossier=sizeof($s_array_image); 
        	for ($i=0;$i<($nb_image_ds_dossier)*5;$i++){
        		//on limite la boucle à 5 fois le nombre de photos
        		//image aléatoire:   
        		$key_aleatoire=array_rand($s_array_image, 1);   
        		$donnees_image=$s_array_image[$key_aleatoire];   
        		$array_donnees_image = explode('|',$donnees_image);
        		$image=$array_donnees_image[0]; //recup du nom de l'image 
        		//recup des dimensions de l'image   
        		list($width, $height, $type, $attr) = getimagesize($dossier.'/'.$image);
        		if($width > $height){
        			return $array_donnees_image;
        		}
        	}
        	//au cas ou pas de photo paysage trouvée on retourne la derniere de la boucle
        	return $array_donnees_image;
        }	
        ?>


        et donc l'appel dans la boucle foreach devient:

        //image aléatoire au format paysage:
        	
         $array_donnees_image = image_aleatoire_paysage($clef,$s_array_image); 


        par contre pour l'erreur getimagesize vérifies par un echo que le chemin dossier/photo est bien bon
        et que le nomde la photo BDD correspond bien à celui du fichier photo dans le dossier.
        1. j'ai fait une petite bdd chez moi pour tester, effectivement il y a des pb de temps en temps, ce soir je suis un peu ko et pas l'esprit à réfléchir, je verrai ça demain matin.
          1. merci de ta reponse

            Mais plus rien ne s affiche il me met cette erreur

            Warning: getimagesize() [function.getimagesize]: Read error! in /mnt/113/sda/5/6/..........php on line 57

            merci de ton aide
            1. il manquait le chemin vers l'image pour getsizeimage c'est à dire le dossier

              modifies les lignes:

              //dans la fonction php
              function image_aleatoire_paysage($dossier,$s_array_image,$cpt){
              
              list($width, $height, $type, $attr) = getimagesize($dossier.'/'.$image);
              
              //on reboucle sur la fonction pour en "chercher" une autre   
                image_aleatoire_paysage($dossier,$s_array_image,$cpt);
              
              et dans la boucle foreach:
              
              //image aléatoire au format paysage:    
               $array_donnees_image = image_aleatoire_paysage($clef,$s_array_image,0); 
              
              
              1. merci de ta reponse

                je crois qu il manque le dossier

                il me met bien le nom de l image mais pas le dossier

                par contre si je rajoute $clef avant echo $image il ne me l affiche pas
                1. met un echo pour voir:

                  après la ligne
                  $image=$array_donnees_image[0]; //recup du nom de l'image

                  mets echo "chemin image= ".$image;
                  1. c est cette ligne qui pose probleme

                    list($width, $height, $type, $attr) = getimagesize($image);
                    1. Merci de ta reponse mais ca ne marche pas il m indique cet erreur

                      Warning: Division by zero in /mnt/113/sda/5/6/monsite/mondossier/page.php on line 70

                      Warning: getimagesize() [function.getimagesize]: Unable to access 0 in /mnt/113/sda/5/6/monsite/mondossier/page.php on line 70

                      il manquait aussi un point vrgule a une ligne mais la je ne vois pas.........

                      Oui les dates sont stocker sous cette forme avec l heure 2012-05-19 18:41:02 mais les resultats me semble juste

                      Merci
                      1. ce serait plus simple si tu les avait ds la bdd, mais bon avec php il ya tjs une solution

                        <?php   
                        //fonction php que tu mets au début du body   
                        function image_aleatoire_paysage($s_array_image,$cpt){   
                         $nb_image_ds_dossier=sizeof($s_array_image);   
                         //image aléatoire:   
                         $key_aleatoire=array_rand($s_array_image, 1);   
                         $donnees_image=$s_array_image[$key_aleatoire];   
                         $array_donnees_image = explode('|',$donnees_image);   
                         //si il n'y a pas d'image paysage la fct va boucler indefiniement donc on teste:   
                         $cpt++;   
                         if($cpt > $nb_image_ds_dossier ){   
                          return $array_donnees_image; // on quitte la fct en renvoyant l'image même si au format portrait ??   
                         }   
                         $image=$array_donnees_image[0]; //recup du nom de l'image   
                         //recup des dimensions de l'image   
                         list($width, $height, $type, $attr) = getimagesize($image);   
                         //au passage remarques que tu as aussi le type donc tu peux aussi tester et prendre seulement celles d'un ou plusieurs types jpg, png etc   
                         //vas voir sur G.... la fct getimagesize()   
                         if($width < $height){   
                          //on reboucle sur la fonction pour en "chercher" une autre   
                          image_aleatoire_paysage($s_array_image,$cpt)   
                         } else{   
                          //si format paysage on retourne l'array des donnees image   
                          return $array_donnees_image;   
                         }   
                        }   
                        ?>   
                        
                        <?php   
                        //....   
                        
                        foreach($array_donnees as $clef=>$s_array_image){   
                         //$clef=nom dossier   
                            
                         //image aléatoire au format paysage:    
                         $array_donnees_image = image_aleatoire_paysage($s_array_image,0);   
                         //genration des liens   
                         //..   
                        


                        autre remarque:

                        $req = mysql_query("SELECT * FROM exif ORDER BY date ASC")

                        j'espère que les dates du champ date sont au fromat mysql yyyymmdd ? sinon le tri ne sera pas bon
                        1. Merci ca fonctionne

                          C est ce que je voulais

                          Un derniere question

                          Est il possible de choisir uniquement les photos en paysage?

                          Par contre la dimension des photos ne sont pas stocker dans ma base de donnée

                          est ce un probleme?

                          Merci de votre aide
                          1. je ne vois pas de solution via la requette MYSQL

                            mais voici une idée en php avec un array (pas testé il peut y avoir des bugs)

                            <?php
                            // ....
                            
                            $req = mysql_query("SELECT * FROM exif ORDER BY date ASC") or die(mysql_error()); // Requête SQL sans dedoublonnement
                            //on va stocker les données dans un array a 2 dimensions
                            $array_donnees=array();
                            while($dnn = mysql_fetch_array($req))
                            {
                            $array_donnees[$dnn['dossier']][]=$dnn['image'].'|'.$dnn['datef'].'|'.$dnn['heure'].'|'.$dnn['personne']; // séparation des données image par un pipe |
                            // le [] permet l'incrémentation auto de l'index du sous array de chaque dossier
                            
                            }
                            //on va parcourir l'array et pour chaque dossier afficher aléatoirement  une image avec la fonction array_rand
                            foreach($array_donnees as $clef=>$s_array_image){
                            	//$clef=nom dossier
                            	
                            	//image aléatoire:
                            	$key_aleatoire=array_rand($s_array_image, 1);
                            	$donnees_image=$s_array_image[$key_aleatoire];
                            	$array_donnees_image = explode('|',$donnees_image);
                            	//genration des liens
                            	echo '<li>'; 
                            	echo '<a href="contenu3.php?dossier='.$clef.'"><img src="'.$clef.'/'.$array_donnees_image[0].'" alt="Photo prise le '.$array_donnees_image[1].' à '.$array_donnees_image[2].' par '.$array_donnees_image[3].' /></a>';
                            	echo '</li>';
                            }
                            ?>
                            1. Merci ca fonctionne

                              C est ce que je voulais par contre il me recupere la 1ere image dans la base y a t il moyen de dire qu il en prenne une aleatoirement?

                              Merci de votre aide
                              1. en procédant ainsi ta requette n'extrait pas tous les champs dont tu as besoin pour l'affichage ensuite:

                                donc essayes:

                                $req = mysql_query("SELECT * FROM exif GOUP BY dossier ORDER BY date ASC") or die(mysql_error()); // Requête SQL
                                1. utilise l'attribut LIMIT dans ta requete si tu veux un seul résultat : rajoute : LIMIT 0,1 (cela aura pour effet de prendre 1 résultat à partir du résultat 0, donc le premier résultat)
                                  Pour le moment, tu récupere une liste des dossiers avec ta requete, il faut faire une autre requete pour récupérer le reste : dans ton while:

                                  $sql = "SELECT * FROM exif WHERE dossier=".$dnn['dossier']." LIMIT 0,1)


                                  J'ai pas exactement compris si c'est ca que tu souhaites faire.