recherche par date de derniere modification

Mammouth du PHP | 19672 Messages

27 avr. 2005, 14:24

Le problème que je vois, c'est que ta fonction récursive ne retourne rien. Si tu luis fais retourner le tableau contenant la liste des fichiers, ça devient exploitable pour ton affichage: J'aurais bien un début de réponse, mais le problème est que je n'aurai pas les adresses des fichiers.

Voici une base :
<?php
$dossier=opendir($_SERVER['DOCUMENT_ROOT'].'/EDC/Documents/');

// recurse_dir($dir) liste tous les fichiers du dossier (et des sous-dossiers) $dir
function recurse_dir($dir)
{
    global $i, $file_list;
    if ($dp = opendir($dir))
    {
        while ($file = readdir($dp))
        {
            if (($file != ".") && ($file != ".."))
            {
                $tmp = $dir."/".$file;
                if (is_dir($tmp))
                {
                    recurse_dir($tmp, $file) ;
                }
                else
                {
                    $file_list[$i] = $tmp;
                    $i++;
                }
            }
        }
        return $file_list;
    }
}



function taDateToTimestamp($date)
{
    $timestamp = -1;
    list($annee, $mois, $jour) = sscanf($date, "%d-%d-%d"); // exemple : 2004-12-23
    // un petit test pour verifier que la date est bonne
    if (checkdate($mois,$jour,$annee))
    {
        // la date est bonne
        // creation de la date avec mktime
        $timestamp = mktime(0,0,0,$mois, $jour, $annee);
    }
    else
    {
        $timestamp=-1;
    }
    return $timestamp;
}

$timestamp = taDateToTimestamp($date_derniere_modif);

while($fichier=readdir($dossier))
{
    $liste_fichiers =  recurse_dir($dossier);
    foreach($liste_fichiers as $fichier)
    {
        if($fichier!='.' && $fichier !='..' && filemtime($fichier)>$timestamp)
        {
            echo "<a href='/EDC/".$fichier."'>".$fichier."</a> a été modifié le : " . date ("F d Y H:i:s.", filemtime($fichier));
            echo '<br>';
        }
    }
}
closedir($dossier);
?> 
Tel quel, ça ne fonctionne sûrement pas, mais tu as un point de départ.
J'ai rajouté un return dans la fonction récursive et ensuite pour l'affichage, j'initialise un tableau avec le résultat. Pour chaque fichier, je l'affiche.
Il te reste à faire en sorte qu'on renvoie le nom du fichier avec le chemin pour le trouver.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 335 Messages

27 avr. 2005, 14:32

Merci bcp!

Pour toi ce sont lesquels lignes qui sont a modifier??

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

27 avr. 2005, 14:32

Je suis vraiment désolé, mais je ne comprend pas ce que tu veux qu'on fasse ?

Ta fonction n'affiche rien chez moi.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

27 avr. 2005, 14:34

Ca y est, j'ai tout relu et j'ai compris !!!

Je cherche !!!
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

27 avr. 2005, 14:36

Ca marche pas ce code !!!!

Il ne faut pas passer le résultat de opendir() mais directement le path du dossier à la fonction récursive !! Tu ne peux pas faire un opendir sur le résultat d'un opendir()

Du moins, ça ne marche pas chez moi !!!
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 335 Messages

27 avr. 2005, 14:38

Le code de qui?

Le mien ou celui de cyrano?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

27 avr. 2005, 14:39

Le tiens puis celui de Cyrano vu qu'il a juste déplacé la ligne !!!

J'ai un bout de résultat, je post quand ça aura avancé !!!!
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 335 Messages

27 avr. 2005, 14:42

Le mien (celui que j'ai posté au début) marche!!
Ca c'est sur!

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

27 avr. 2005, 15:01

Tadam !!! J'ai trouvé !!!

C'était uhn problème de passage de paramètre (ce que je disais avant !!!) il faut passer une chaine de caractères et non pas le retour d'un opendir().

Et j'ai créé une boucle de parcours du tableau retourné à partir de ta boucle d'affichage !!!

Chez moi, ça marche avec la racine de mon serveur et une date en dur (comme sur le code) :
<?php

// recurse_dir($dir) liste tous les fichiers du dossier (et des sous-dossiers) $dir
function recurse_dir($dir)
{
    global $i, $file_list;
    if ($dp = opendir($dir))
    {
        while ($file = readdir($dp))
        {
            if (($file != ".") && ($file != ".."))
            {
                $tmp = $dir."/".$file;
				$file_list[$i] = $tmp;
				$i++;
                if (is_dir($tmp))
                {
                    recurse_dir($tmp, $file) ;
                }
            }
        }
        return $file_list;
    }
}



function taDateToTimestamp($date)
{
    $timestamp = -1;
    list($annee, $mois, $jour) = sscanf($date, "%d-%d-%d"); // exemple : 2004-12-23
    // un petit test pour verifier que la date est bonne
    if (checkdate($mois,$jour,$annee))
    {
        // la date est bonne
        // creation de la date avec mktime
        $timestamp = mktime(0,0,0,$mois, $jour, $annee);
    }
    else
    {
        $timestamp=-1;
    }
    return $timestamp;
}

$timestamp = taDateToTimestamp("2005-04-27");

$liste_fichier =  recurse_dir($_SERVER['DOCUMENT_ROOT']);
for($compt = 0; $compt < count($liste_fichier); $compt++)
{
	if($liste_fichier[$compt]!='.' && $liste_fichier[$compt] !='..' && filemtime($liste_fichier[$compt])>$timestamp)
	{
		echo "<a href='/EDC/".$liste_fichier[$compt]."'>".$liste_fichier[$compt]."</a> a été modifié le : " . date ("F d Y H:i:s.", filemtime($liste_fichier[$compt]));
		echo '<br>';
	}
}

?>
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 335 Messages

27 avr. 2005, 15:16

A quoi sont du ces erreurs??

Notice: Undefined offset: 0

Eléphant du PHP | 335 Messages

27 avr. 2005, 15:21

Merci bcp ca marche impec' :wink:

Le seul probleme est que j'ai trois cette erreur en haut de ma page :
Notice: Undefined offset: 0

Comment cela se fait-il?
Que signifie cette erreur?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

27 avr. 2005, 15:22

J'en ai aucune idée !!! Pour l'erreur !!! Je penserais à un tableau mal rempli !!!

Sinon, je travaille sur les liens !!!
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 335 Messages

27 avr. 2005, 15:25

Oui c'est vrai que les liens ne marchent pas!

Je vais voir pour l'erreur.

Encore merci pour ton aide...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

27 avr. 2005, 15:29

J'ai aussi réussi à modéliser les liens.

J'ai créé une fonction qui enlève l'adresse de la racine de ton serveur et qui retourne donc l'adresse qu'il faut utiliser pour afficher le dossier ou le fichier via un browser internet !!!

Je te donne le code qui va bien !!!
<?php

// recurse_dir($dir) liste tous les fichiers du dossier (et des sous-dossiers) $dir
function recurse_dir($dir)
{
    global $i, $file_list;
    if ($dp = opendir($dir))
    {
        while ($file = readdir($dp))
        {
            if (($file != ".") && ($file != ".."))
            {
                $tmp = $dir."/".$file;
				$file_list[$i] = $tmp;
				$i++;
                if (is_dir($tmp))
                {
                    recurse_dir($tmp, $file) ;
                }
            }
        }
        return $file_list;
    }
}

//Cette fonction extrait le chemin du serveur du chemin du fichier
// PRE : le fichier est dans l'arborescence du serveur
// POST : retourn une chaine du type "dossier/dossier/fichier.ext"
function NomSurServeur($cheminServeur, $cheminFichier)
{
	$a_racine = explode("/", $cheminServeur);
	$i_profServeur = count($a_racine);
	
	$a_fichier = explode("/", $cheminFichier);
	$i_profFichier = count($a_fichier);
	
	$index == 0;
	for($i = $i_profServeur; $i < $i_profFichier; $i++)
	{
		$a_result[$index] = $a_fichier[$i];
		$index++;
	}
	
	return (implode($a_result, "/"));
} 

function taDateToTimestamp($date)
{
    $timestamp = -1;
    list($annee, $mois, $jour) = sscanf($date, "%d-%d-%d"); // exemple : 2004-12-23
    // un petit test pour verifier que la date est bonne
    if (checkdate($mois,$jour,$annee))
    {
        // la date est bonne
        // creation de la date avec mktime
        $timestamp = mktime(0,0,0,$mois, $jour, $annee);
    }
    else
    {
        $timestamp=-1;
    }
    return $timestamp;
}

$timestamp = taDateToTimestamp("2005-04-27");

$a_racine = explode("/", $_SERVER['DOCUMENT_ROOT']);
$i_profondeur = count($a_racine);

$liste_fichier =  recurse_dir($_SERVER['DOCUMENT_ROOT']);
for($compt = 0; $compt < count($liste_fichier); $compt++)
{
	if($liste_fichier[$compt]!='.' && $liste_fichier[$compt] !='..' && filemtime($liste_fichier[$compt])>$timestamp)
	{
		$a_fichier = explode("/", $liste_fichier[$compt]);
		$i_index = count($a_fichier) - 1;
		echo "<a href='/".NomSurServeur($_SERVER['DOCUMENT_ROOT'], $liste_fichier[$compt])."'>".$a_fichier[$i_index]."</a> a été modifié le : " . date ("F d Y H:i:s.", filemtime($liste_fichier[$compt]));
		echo '<br>';
	}
}

?>
J'ai mis longtemp à comprendre ce que tu voulais mais je suis content de moi !!!
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

27 avr. 2005, 15:31

J'y pense, si tu veux afficher tout le path et pas seulement le nom du fichier, remplace
echo "<a href='/".NomSurServeur($_SERVER['DOCUMENT_ROOT'], $liste_fichier[$compt])."'>".$a_fichier[$i_index]."</a> a été modifié le : " . date ("F d Y H:i:s.", filemtime($liste_fichier[$compt]));
Par
echo "<a href='/".NomSurServeur($_SERVER['DOCUMENT_ROOT'], $liste_fichier[$compt])."'>".$liste_fichier[$compt]."</a> a été modifié le : " . date ("F d Y H:i:s.", filemtime($liste_fichier[$compt]));
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer