Probleme php mysql

Résolu/Fermé
audi68 Messages postés 571 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 5 août 2015 - 4 oct. 2012 à 22:36
audi68 Messages postés 571 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 5 août 2015 - 11 oct. 2012 à 22:02
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

KiKiLeMMerDeuR Messages postés 284 Date d'inscription dimanche 6 décembre 2009 Statut Membre Dernière intervention 6 décembre 2013 36
Modifié par KiKiLeMMerDeuR le 5/10/2012 à 11:08
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.
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
5 oct. 2012 à 13:39
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
0
audi68 Messages postés 571 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 5 août 2015 9
6 oct. 2012 à 18:52
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
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
8 oct. 2012 à 09:39
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>';
}
?>
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
audi68 Messages postés 571 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 5 août 2015 9
8 oct. 2012 à 19:04
Merci je vais tester
0
audi68 Messages postés 571 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 5 août 2015 9
8 oct. 2012 à 21:39
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
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
Modifié par Alain_42 le 9/10/2012 à 09:49
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
0
audi68 Messages postés 571 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 5 août 2015 9
9 oct. 2012 à 20:58
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
0
audi68 Messages postés 571 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 5 août 2015 9
9 oct. 2012 à 21:07
c est cette ligne qui pose probleme

list($width, $height, $type, $attr) = getimagesize($image);
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
9 oct. 2012 à 22:01
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;
0
audi68 Messages postés 571 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 5 août 2015 9
9 oct. 2012 à 22:13
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
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
9 oct. 2012 à 22:35
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); 

0
audi68 Messages postés 571 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 5 août 2015 9
10 oct. 2012 à 20:02
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
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
10 oct. 2012 à 22:16
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.
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
11 oct. 2012 à 09:41
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.
0
audi68 Messages postés 571 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 5 août 2015 9
11 oct. 2012 à 20:32
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
0
Alain_42 Messages postés 5361 Date d'inscription dimanche 3 février 2008 Statut Membre Dernière intervention 13 février 2017 894
11 oct. 2012 à 20:59
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 ?
0
audi68 Messages postés 571 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 5 août 2015 9
11 oct. 2012 à 22:02
merci oui c est plus clair je vois un peu mieux
0