Une requête qui se construit en listant un dossier

Eléphant du PHP | 160 Messages

16 avr. 2006, 22:19

Bonjour,
J'ai bricolé cette requête qui fonctionne.
	 	$rep = "images/";
		$dir = opendir($rep); 
		while ($f = readdir($dir)) {
   if(is_dir($rep.$f)) {
	  $query = "SELECT * FROM evenements WHERE id = '".$f."' ORDER BY dd DESC";
	  $result = mysql_query($query);
	  $Record = mysql_fetch_object($result)
Je liste les noms de dossiers, ils portent chacun le numéro d'id des événements auxquels ils sont associés. Comme je n'ai pas d'info dans la base pour gérer les photos, et que je veux sortir tous les événements possédant un dossier photo je fais cette requête.
Mais j'ai un problème bizarre. Il me sort 2 événements inexistants. J'ai fait un echo sur les noms de dossier et j'ai vu qu'il trouvait . et ..
J'ai regardé par le ftp en affichant les fichiers cachés et rien, alors je me suis dit que comme le nom du dossier est forcément un chiffre, j'aurais pu préciser dans ma requête de ne prendre en compte que les chiffres pour éviter les erreurs, et surtout ces deux dossiers fantômes (. et ..)
Mais je ne vois pas du tout comment préciser ce genre de chose,
Merci pour votre aide

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

16 avr. 2006, 22:23

tu peux exclure ces deux données, un coup d'oeil dans la doc de readdir() (exemple 2) pour y voir:
if ($file != "." && $file != "..")

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 160 Messages

16 avr. 2006, 22:37

Merci,
C'est déjà rassurant de voir que c'est normal.
J'ai utilisé le code pour corriger, mais les deux événements sortent toujours, même si le . et le .. ont disparu de mes messages d'erreur.
Je vais encore essayer,
Le code :
if ($handle = opendir('images/')) {
   while (false !== ($file = readdir($handle))) {
       if ($file != "." && $file != "..") {
echo "$file\n";
       }
	  $query = "SELECT * FROM evenements WHERE id = '".$file."' ORDER BY dd DESC";
	  $result = mysql_query($query);
	  $Record = mysql_fetch_object($result);
Si vous avez une idée...
Merci

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

16 avr. 2006, 22:47

Hi hi, non mais l'exemple est la juste pour l'exemple faut pas faire un copier coller du tout :lol:

Faut tester les valeurs de file et si elles sont différentes de "." et ".." alors exécution du script:
if ($handle = opendir('images/')) 
{
   while (false !== ($file = readdir($handle))) 
  {
       if ($file != "." && $file != "..") 
      {
         $query = "SELECT * FROM evenements WHERE id = '".$file."' ORDER BY dd DESC";
         $result = mysql_query($query);
         $Record = mysql_fetch_object($result);
      }
   }
}
". " représente le dossier courant
".." représente le dossier parent

Par exemple pour remonter d'un niveau dans l'arborescence et aller dans le dossier "dossier1":
../dossier1

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 160 Messages

16 avr. 2006, 22:56

ça ne parche toujours pas, mais c'est vrai que je ne comprends pas pourquoi il sort un . et un .. en ouvrant mon dossier image.
Si tu peux essayer de m'expliquer,
Merci

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

16 avr. 2006, 23:04

". " représente le dossier courant
".." représente le dossier parent

Par exemple pour remonter d'un niveau dans l'arborescence et aller dans le dossier "dossier1":
../dossier1
pour appeler un fichier qui se trouve dans le même dossier que le script tu peux faire:
src = fichier.ext
src = ./fichier.ext
si tu veux appeler un fichier un niveau plus haut:
src = ../fichier.ext

Pour le script, affiches un message d'erreur sur l'exécution de la requete mysql_error() et affiche la requete générée:
echo $query;

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 160 Messages

16 avr. 2006, 23:19

Je te mets le lien j'ai enlevé la session pour que tu regardes :
http://www.lj-traiteur.com/escapades/ab ... leries.php
tu vois ce que ça fait, il liste bien le bon dossier mais sort toujours les deux enregistrements en plus, comme j'ai mis la vérification, ils ne sortent pas sur l'echo, mais c'est bien . et ..
J'avoue que je ne comprends pas bien et je sais que ../ sert à remonter d'un dossier mais je ne saisi pas le rapport ici...
Désolé si je suis pesant sur ce coup :oops:
Merci

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

17 avr. 2006, 00:23

je ne vois rien de particulier :?

Fait une simple vérification des dossier qui passent dans le test if($file ! = ...) en affichant le dossier:
if ($file != "." && $file != "..")
{ 
   echo 'le dossier est '.$file.'<br>';
}
Pour les répertoires. ils sont donc présent dans tous les dossiers

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 160 Messages

17 avr. 2006, 00:35

Tu as peut-être regardé pendant que je testais, je l'ai remis avec le echo et mon premier code pour que le problème soit visible.
On voit bien mes 5 événements numérotés, et au dessus, les . et ..
Je crois que je bloque,
Merci

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

17 avr. 2006, 00:40

Montre nous le code qui se rapporte à la lecture du dossier avec la boucle et l'affichage.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 160 Messages

17 avr. 2006, 00:41

Enfait, en regardant en bas d'un affichage d'enregistrement, je vois qu'il compte 5 choses dans les dossiers . et ..
Il compte donc ce qu'il y a dans le dossier images, soit les 5 dossiers de mes galeries.
Mais je ne vois pas comment empêcher ça, impossible d'intégrer ta prposition, j'y arrive pas,
Mais je ne vais pas lacher l'affaire
Merci

Eléphant du PHP | 160 Messages

17 avr. 2006, 00:44

Juste ça :
// Lister les dossiers contenus dans le dossier des galeries pour récupérer les noms de dossiers, donc les id		
	 	$rep = "images/";
		$dir = opendir($rep); 
		while ($f = readdir($dir)) {
   if(is_dir($rep.$f)) {
      echo "Nom : ".$f;
	  $query = "SELECT * FROM evenements WHERE id = '".$f."' ORDER BY dd DESC";
	  $result = mysql_query($query);
	 
	  $Record = mysql_fetch_object($result)
Ou toute ma page?
Merci

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

17 avr. 2006, 00:46

disons qu'à la base j'en voulais plus à me mettre sous la dent :lol:
mais rien que là on voit qu'il manque:
if ($file != "." && $file != "..") 
ce test a disparu :?

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 160 Messages

17 avr. 2006, 00:48

C'est que j'ai essayé de l'intégrer et ça ne marchait plus, j'ai dû me planter , je mets le reste (mais j'ai peur de me faire souffler dans les bronches :
<?
//session_start();
//if (session_is_registered('pseudo')) 
//{ echo 
?>
<HTML>
<HEAD>
<TITLE>administration</TITLE>
<META http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

<LINK rel="stylesheet" href="../style.css" type="text/css">
</HEAD>

<BODY bgcolor="#FFFFFF" text="#000000" link="#3366CC" vlink="#3366CC" alink="#3366CC">
<? 
$repere = 'Galerie';
require ('header_abonnes.php');
include ('../connexion.php');

		$commentaire = StripSlashes ($commentaire);
		$rdv = StripSlashes ($rdv);
		$description = StripSlashes ($description);
		$nom = StripSlashes ($nom);
// Lister les dossiers contenus dans le dossier des galeries pour récupérer les noms de dossiers, donc les id		
	 	$rep = "images/";
		$dir = opendir($rep); 
		while ($f = readdir($dir)) {
   if(is_dir($rep.$f)) {
      echo "Nom : ".$f;
	  $query = "SELECT * FROM evenements WHERE id = '".$f."' ORDER BY dd DESC";
	  $result = mysql_query($query);
	 
	  $Record = mysql_fetch_object($result)
         
	
		//$query = "SELECT * FROM evenements WHERE id = '".$f."' ORDER BY nom ASC";
		//$result = mysql_query($query);
	//if($result)
	//{
	 //	while($Record = mysql_fetch_object($result))
	//	{
?>
<TABLE width="800" border="0" cellspacing="3" cellpadding="0" align="center">
  <TR> 
    <TD width="30" rowspan="2" class="fond_gris"> 
      <?
			if ($Record->type == "decouverte")
				echo  '<img src="images/decouverte.gif" width="30" height="30" border=1>';
			elseif ($Record->type == "sport")
				echo '<img src="images/sport.gif" width="30" height="30" border=1>';
			elseif ($Record->type == "detente")
				echo '<img src="images/detente.gif" width="30" height="30" border=1>';
			else 
				echo '<img src="images/sejours.gif" width="30" height="30" border=1>';
	?>
    </TD>
    <TD width="270" class="fond_gris"> 
      <?=$Record->nom?>
      - ( 
      <?=$Record->type?>
      ) </TD>
    <TD width="500" align="right" class="fond_gris">Du <b> 
      <?=substr($Record->dd,8,2).'-'.substr($Record->dd,5,2).'-'.substr($Record->dd,0,4)?>
      </b> &agrave;<b> 
      <?=substr($Record->hd,0,5)?>
      </b>au <b> 
      <?=substr($Record->df,8,2).'-'.substr($Record->df,5,2).'-'.substr($Record->df,0,4)?>
      </b> &agrave; <b> 
      <?=substr($Record->hf,0,5)?>
      </b></TD>
  </TR>
  <TR> 
    <TD class="fond_gris"> REF : 
      <?=$Record->ref?>
      | PRIX : 
      <?=$Record->prix?>
      &euro; </TD>
    <TD class="fond_gris">LIEU RDV : 
      <?=$Record->rdv?>
    </TD>
  </TR>
  <TR> 
    <TD colspan="3" class="fond_gris">Places disponibles 
      <?
$dispo = $Record->maxi - $Record->reserve;
	if ($Record->maxi)
		echo '<B>'.$dispo.'</B>';
	else 
		echo '';
	?>
      | Maximum participants 
      <?=$Record->maxi?>
      | Minimum participants 
      <?=$Record->mini?>
      | R&eacute;servations 
      <?=$Record->reserve?>
    </TD>
  </TR>
  <TR> 
    <TD colspan="3" class="fond_gris">DESCRIPTION : 
      <?=$Record->description?>
    </TD>
  </TR>
  <TR> 
    <TD colspan="3" class="fond_gris">COMMENTAIRE : 
      <?=$Record->commentaire?>
    </TD>
  </TR>
  <TR align="right"> 
    <TD colspan="3" class="titre_gris"> 
      <?
//vérification de l'existence du dossier
//if(is_dir('../abonnes/images/'.$id.'/')) 
if(is_dir('images/'.$Record->id.'/'))
{
// on compte le nombre de photo dans le dossier
				$nb_f = 0;

$opdir = opendir('images/'.$Record->id.'/');
while ($c = readdir($opdir)) 
{
   if (!is_dir($c)) $nb_f++;
}

closedir($opdir);

echo ("LA GALERIE CONTIENT ".$nb_f." PHOTOGRAPHIES | ");
?>
      <a href="archives_galerie.php?id=<?=$Record->id?>">VOIR LES PHOTOS</a> 
      <?
				}    
			else
			{
				echo  'PAS DE GALERIE';
				}
	$compte = mysql_query("SELECT Count(*) FROM evenements WHERE id = '".$Record->id."' AND statut = 1");
    $okpanier = mysql_result($compte, 0);
	if ($okpanier)
	{
?>
      | <a href="galeries.php?pseudo=<?=$_SESSION['pseudo']?>&ref=<?=$Record->ref?>&ADD=1?>">SELECTIONNER</a> 
      <?
	  }

	  ?>
    </TD>
  </TR>
  <TR> 
    <TD colspan="3"> <hr></TD>
  </TR>
</TABLE>
<?
		}
	}
//	else{
//			echo"erreur de requête";
//}
mysql_close();
?>
<? //} else{
//header("location: http://www.lj-traiteur.com/escapades/index.php?pass=no");

//}
?>
</BODY>
</HTML>
Et tu as vu en suivant le lien?
Merci

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

17 avr. 2006, 00:53

Bon effectivement pas 200 lignes non plus :lol:

utilise ceci:
$rep = "images/";
$dir = opendir($rep);

while ($f = readdir($dir)) 
{
	//s'il s'agit d'un répertoire ET qu'il ne s'agit pas du courant ou parent
        if(is_dir($rep.$f) && $f != "." && $f != ".." ) 
	{
		echo "Nom : ".$f;
		$query = "SELECT * FROM evenements WHERE id = '".$f."' ORDER BY dd DESC";
		$result = mysql_query($query);
		
		$Record = mysql_fetch_object($result)
		
		... 

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute