opendir() qui ne marche pas

Eléphant du PHP | 58 Messages

07 avr. 2013, 13:37

Bonjour.

Je souhaites lister des fichiers se trouvant dans un dossier, pour cela j'utilise le code suivant:

Code : Tout sélectionner

<?php $nb_fichier = 0; echo '<ul>'; $mondossier='/mondossier'; if($dossier = opendir($mondossier)) { while(false !== ($fichier = readdir($dossier))) { $nb_fichier++; // On incrémente le compteur de 1 echo '<li><a href=".$dossier' . $fichier . '">' . $fichier . '</a></li>'; } echo '</ul><br />'; echo 'Il y a <strong>' . $nb_fichier .'</strong> fichier(s) dans le dossier'; closedir($dossier); } else echo 'Le dossier n\' a pas pu être ouvert'; ?>
Je reçois une erreur:
Warning: opendir(http://www.monsite.com/mondossier) failed to open dir: not implemented in...
pourtant "mon dossier" existe, exactement à l'emplacement que ça me donne dans l'erreur. Avez vous une idée du pourquoi ce cette erreur?

Invité
Invité n'ayant pas de compte PHPfrance

07 avr. 2013, 20:31

essai comme ça
<?php

$nb_fichier = 0;
echo '<ul>';
$mondossier='mondossier/';
if($dossier = opendir($mondossier))
  {
   while(false !== ($fichier = readdir($dossier)))
      {
       $nb_fichier++; // On incrémente le compteur de 1
       echo '<li><a href=".$dossier' . $fichier . '">' . $fichier . '</a></li>';
      }
echo '</ul>
';
echo 'Il y a <strong>' . $nb_fichier .'</strong> fichier(s) dans le dossier';
  
closedir($dossier);
  
  }
  
else
     echo 'Le dossier n\' a pas pu être ouvert';

?>


Eléphant du PHP | 58 Messages

08 avr. 2013, 08:56

ça ne change rien.

Eléphant du PHP | 86 Messages

08 avr. 2013, 10:26

Si tue essai comme ça qu'est ce que sa t'affiche ?
<?php
   $nb_fichier = 0;
   echo '<ul>';
   $mondossier='mondossier/';
   
   if(is_dir($mondossier))
   {
      if($dossier = opendir($mondossier))
      {
         while(false !== ($fichier = readdir($dossier)))
         {
            $nb_fichier++; // On incrémente le compteur de 1
            echo '<li><a href=".$dossier' . $fichier . '">' . $fichier . '</a></li>';
         }
         echo '</ul>';
         echo 'Il y a <strong>' . $nb_fichier .'</strong> fichier(s) dans le dossier';
 
         closedir($dossier);
      }
      else
         echo 'Le dossier n\' a pas pu être ouvert';
   }
   else
      echo($mondossier." n'est pas un dossier.");
?>
 

Eléphant du PHP | 58 Messages

08 avr. 2013, 17:41

"n'est pas un dossier." Comment est-ce possible?

Mammouth du PHP | 571 Messages

08 avr. 2013, 18:07

en réalité ton script doit marcher sans problème.
qu'est ce que t'as comme OS? je présume que c'est windows.

passe en paramètre de basename le nom du dossier.
    $mondossier=basename('mondossier/');

Eléphant du PHP | 58 Messages

08 avr. 2013, 18:50

Je suis sous Windows 7 mais quel rapport? le dossier est sur FTP

Mammouth du PHP | 571 Messages

08 avr. 2013, 20:26

parce-que sous windows le style de chemin utilisé est l'anti-slash (\).

j'aurai dû mettre realpath à place de basename (prévu pour les fichiers) bien sûr que sous unix ça n'aurait rien changé car tout est fichier.Ton script est-il dans le même dossier que mondossier?
 $nb_fichier = 0;
   echo '<ul>';
   $mondossier=realpath('mondossier/');
   
   if(is_dir($mondossier))
   {
      if($dossier = opendir($mondossier))
      {
         while(false !== ($fichier = readdir($dossier)))
         {
            $nb_fichier++; // On incrémente le compteur de 1
            echo '<li><a href=".$dossier' . $fichier . '">' . $fichier . '</a></li>';
         }
         echo '</ul>';
         echo 'Il y a <strong>' . $nb_fichier .'</strong> fichier(s) dans le dossier';
 
         closedir($dossier);
      }
      else
         echo 'Le dossier n\' a pas pu être ouvert';
   }
   else
      echo($mondossier." n'est pas un dossier.");
rappel: ton script marche très bien chez moi
si ça ne marche pas regardes les droits de mondossier.

Eléphant du PHP | 58 Messages

08 avr. 2013, 21:53

Je ne vois pas ce que vient faire l'OS de mon ordinateur dans l'histoire, puisque le PHP est exécuté sur un serveur O_o

Cela dit je vais plus explicité code, je pensais que le simplifier facilitera le debug mais si ça se trouve le problème vient de là. En ce moment j'ai ça:
<?php

$nb_fichier = 0;
echo '<ul>';
$mondossier=realpath('/alex/vue/catalogue/complements');

   if(is_dir($mondossier))
   {
      if($dossier = opendir($mondossier))
      {
         while(false !== ($fichier = readdir($dossier)))
         {
            $nb_fichier++; // On incrémente le compteur de 1
            echo '<li><a href=".$dossier' . $fichier . '">' . $fichier . '</a></li>';
         }
         echo '</ul>';
         echo 'Il y a <strong>' . $nb_fichier .'</strong> fichier(s) dans le dossier';
 
         closedir($dossier);
      }
      else
         echo 'Le dossier n\' a pas pu être ouvert';
   }
   else
      echo($mondossier." n'est pas un dossier.");
?>
 

Mammouth du PHP | 571 Messages

08 avr. 2013, 23:34

Le problème est que la function is_dir dans ton cas renvoie toujours false donc il y a forcement un problème de chemin lié au système de gestion de fichier propre à windows.
essaies de tester ces bouts codes pour voir lequel correspond à windows:
//en précédant le slash(/) par le point(.)
 $mondossier=is_dir(realpath('./alex/vue/catalogue/complements'));
var_dump($mondossier); //renvoie t-il TRUE?

//chemin absolu style windows
 $mondossier=is_dir('c:\ .......\alex\vue\catalogue\complements');
var_dump($mondossier); //renvoie t-il TRUE?
si aucun bout de code renvoie TRUE tu peux voir à la page ci-dessous il y a quelqu'un qui a écrit une méthode(UnRealPath()) pour ça:
http://www.php.net/manual/fr/function.r ... .php#77968

autre alternative pour lire le contenu d'un dossier :
$dir=scandir(realpath('./alex/vue/catalogue/complements'));
vard_ump($dir);

Eléphant du PHP | 58 Messages

09 avr. 2013, 08:55

Pour le premier: bool(false)

Dois-je vraiment essayer le deuxième code? Mon site est en ligne, le dossier est sur FTP, le PHP est exécuté sur le serveur et non en local sur mon ordinateur, donner une adresse sur mon disque dur est incompréhensible pour moi.

Pour la solution alternative (à la fin de ta réponse), ça me donne ceci:
"Warning: scandir() [function.scandir]: Directory name cannot be empty in..."
"Fatal error: Call to undefined function vard_ump() in... "

Mammouth du PHP | 571 Messages

09 avr. 2013, 11:34

c'est var_dump($dir) et non vard_ump($dir) devrais-je écrire je m'en excuse.
$dir=scandir(realpath('./alex/vue/catalogue/complements'));
var_dump($dir); //retourne t-il tableau contenant les noms des fichiers?
encore une fois ton code je viens de le ré-tester en local(avec un mac) et sur un serveur en ligne(unix/debian) ça passe sans problème.
J'ai l'air peut être de ne pas comprendre certains des aspects liés à tes serveurs car tu parles de windows 7(donc forcement du local) et d'un serveur en ligne: le serveur(en ligne) sur lequel est exécuté ton code est-il un windows ou un linux?

Eléphant du PHP | 58 Messages

09 avr. 2013, 12:28

Warning: scandir() [function.scandir]: Directory name cannot be empty in ... on line 2
bool(false)
Je suis hébergé sur ipage, je ne sais pas quel est leur OS.

Eléphant du PHP | 58 Messages

11 avr. 2013, 16:10

UP

Mammouth du PHP | 571 Messages

11 avr. 2013, 22:09

si une fonction php aussi basique que is_dir() ne marche pas c'est que y a forcement un problème chez ton hébergeur qui doit sans doute restreindre certaines directives apache.

si ton système est linux et que to bégergeur n'a pas bloqué la fonction exec tu peux essayer ceci:
$sortie=array();
exec('ls alex/vue/catalogue/complements/', $sortie);
if(!empty($sortie)
echo " il y a count($sortie) fichiers";
var_dump($sortie);