Dateiausgabe funktioniert nicht

-Ener-

Erfahrenes Mitglied
Hallo, mit fogenem Script sollen aus einem Ordner 13 Dateien pro Seite aus einem Ordner angezeigt werden. Es zeigt zwar 13 Dateien an, aber die haben alle den selben Namen, woran könnte es liegen?

PHP:
<?php 
$uri = $_SERVER['REQUEST_URI']; 
$dir = '/home/www/web55/html/tomb2/gallery/'; 
$verz = opendir($dir); 
$files = array(); 
while($file = readdir($verz)) { 
    if($file != '.' and $file != '..'  and $file != 'dir.php') { 
   
$files[filemtime($dir.$file)] = $file;

    } 
    
} 

krsort($files);
closedir($verz); 

$count = "1";
$count2 = "1";
$zeilen_pro_seite = 13;
 
for ($i=1;$i<=13;$i++) {
foreach ($files as $file) {

$time = filemtime("gallery/$file/");
$date = date("d.m.Y", $time);
$count++;
$count2++;
if ($count > 2){

$style="bgcolor=f0fcfc";
$count = "0";
$count++;
}
else {
    $style = "";
}


$array=scandir("gallery/$file/");
$filecount=count($array)-2;


}

echo"<tr $style><td width=55% style=\"border:2px solid #F0FCFC\"> . <span class=text1>$file</span></td><td  style=\"border:2px solid #F0FCFC\"><span class=text1>Datum: $date</span></td><td style=\"border:2px solid #F0FCFC\"><span class=text1>Fotos: $filecount</span></td></tr>";
}

    

?>
 
http://de2.php.net/manual/de/function.readdir.php
PHP:
    /* Das ist der korrekte Weg, ein Verzeichnis zu durchlaufen. */
    while (false !== ($file = readdir($handle))) {
        echo "$file\n";
    }

    /* Dies ist der FALSCHE Weg, ein Verzeichnis zu durchlaufen. */
    while ($file = readdir($handle)) {
        echo "$file\n";
    }

Man beachte Php.net

was ist das für eine funktion?
PHP:
filemtime($dir.$file)

Sind alle Files auch leßbar? Also chmod richtig?
 
was ist das für eine funktion?
PHP:
filemtime($dir.$file)
Sind alle Files auch leßbar? Also chmod richtig?

Das Datum der letzten Änderung der Datei/ des Ordners?

Ja, alle Ordner stehen auf 755. Die Ordner werden auch korrekt ausgegeben wenn ich des echo $file an ne andere Stelle setze. Allerdings werden dann alle Ordner ausgegeben und das 13 x... und des is falsch! Es sollen nur 13 Ordner (von aktuell 15) ausgegeben werden!


Aber die Ordnerausgabe funktiniert auch mit der anderen Methode...und um den Teil ging es mir ja nicht. eher um die for und foreach-Schleifen =(
 
Zuletzt bearbeitet:
Deinen momentanen Ansatz kann ich leider nicht recht nachvollziehen, musste den Code erstmal ein wenig einrücken und korrigieren. Auch wenn PHP automatisches Typecasting beherrscht, ist das zB nicht die feine englische Art.

Nur vom reinen Ansatz habe ich es mal so zurechtgerückt, wie ich denke, dass es sein müsste um deinen Ansprüchen zu entsprechen - Jedoch ist der Code recht sensibel und nicht das Optimale.

PHP:
<?php 
$uri = $_SERVER['REQUEST_URI']; 
$dir = '/home/www/web55/html/tomb2/gallery/'; 
$verz = opendir($dir); 
$files = array(); 
$i = 0;

// hier immer nur 13 auslesen?
while($i < 13 && $file = readdir($verz)) { 
    if($file != '.' and $file != '..'  and $file != 'dir.php') { 
        $files[filemtime($dir.$file)] = $file;
        ++$i;
    }
}

krsort($files);
closedir($verz); 

$count = 0;

foreach ($files as $file) {
    // oder erst hier?
    /*
    if ($count > 13) {
        break;
    }
    */
    $time = filemtime("gallery/{$file}");
    $date = date("d.m.Y", $time);
    $count++;

    if ($count % 2 == 1) {
        $style = " bgcolor=f0fcfc";
    } else {
        $style = "";
    }
    
    $array = scandir("gallery/$file/");
    $filecount = count($array) - 2;
    
    echo "<tr{$style}><td width=55% style=\"border:2px solid #F0FCFC\">"
       . "<span class=text1>{$file}</span></td><td  style=\"border:2px solid #F0FCFC\">"
       . "<span class=text1>Datum: {$date}</span></td>"
       . "<td style=\"border:2px solid #F0FCFC\"><span class=text1>Fotos: {$filecount}</span></td></tr>";
}
 
Danke erstmal, funktionieren tut er halbwegs gut. Die Sortierfunktion nach Datum funktioniert blos nicht so richtig.

Wenn ich jetzt Seitenweise blättern wöllte, müsste ich da mit der foreach-Schleife rumspielen oder eher mit der while-Schleife?
 
Auf längere Sicht würde sich das Spiegeln der Filesystem-Struktur in einer Datenbank anbieten - Nen Cronjob angelegt, der das alle Stunde oder so automatisch macht, und die Aktualität ist auch gewahrt.
Das hätte den Vorteil, dass das Auslesen und Ausgeben ohne ständige Zugriffe auf das FS stattfinden könnte und vor allem auch, dass die Sortierung und Ausgabelimitierung gut funktioniert.

Die Tabelle könnte in etwa so aussehen (von der Implementierung):
Code:
CREATE TABLE `fs_structure` (
    `id`    INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
    `path`  VARCHAR(255) NOT NULL,
    `name`  VARCHAR(255) NOT NULL,
    `size`  INT(10) UNSIGNED NOT NULL DEFAULT '0',
    `type`  ENUM('file', 'dir', 'symlink') NOT NULL DEFAULT 'file',
    `mtime` DATETIME
);

Das ganze ließe sich dann so implementieren:
PHP:
<?php
while($file = readdir($verz)) { 
    if($file != '.' and $file != '..'  and $file != 'dir.php') { 
        $files[] = array(
            'path'  => "{$dir}",
            'name'  => "{$file}",
            'size'  => filesize("{$dir}{$file}"),
            'type'  => (is_dir("{$dir}{$file}")) ? 'dir' : 'file',
            'mtime' => filemtime("{$dir}{$file}")
            );
    }
}

$bits = array();
foreach($files as &file) {
    $bits[] = "('"
            . mysql_real_escape_string($file['path'])
            . "', '"
            . mysql_real_escape_string($file['name'])
            . "', '"
            . (int)$file['size']
            . "', '"
            . $file['type']
            . "', FROM_UNIXTIME('"
            . (int)$file['mtime']
            . "'))";
}

// leeren
mysql_query("TRUNCATE TABLE `fs_structure`;");

// einfügen
mysql_query("INSERT INTO `fs_structure` (
    `path`, `name`, `size`, `type`, `mtime`
) VALUES " . implode(', ', $bits) . ";");
(ungetestet und ineffizient, da $bits und $files verknüpft werden könnten)

Wenn du die jetzige Methode beibehalten möchtest, wird es ein wenig umständlich, da zuerst alle Dateien erfasst werden müssten, dann folgt eine Sortierung, und erst bei der Ausgabe würde sich dann eine foreach, ala
PHP:
<?php
$page = 2;
$show = 13;
$offset = ($page - 1) * $show;
$limit  = $offset + $show;

$i = 0;

foreach ($files as &file) {
    if ($i <= $offset)
        continue;
    else if ($i > $limit)
        break;

    // Ausgabe ...

    // $i inkrementieren
    ++$i;
}

Aber das ist äußerst ineffizient, da zuerst alle Daten eingelesen werden müssen, dann sortiert werden, etc. Das Filesystem ist in etwa die langsamste Komponente eines Systems...
 
Ich würd in diesem Fall schon gern ohne Datenbank arbeiten weil ich auch nicht weiß ob der Server auf dem die Seite dann laufen soll Cronjobs unterstützt.

Danke erstmal fürs Script, hab damit ein bisschen rumgespielt aber komme zu keinem brauchbaren Ergebnis. Wenn $page 0 ist dann zeigts mir einen Datensatz. Bei 1,2 usw. zeigts gar keinen =D
 
Also irgendwie möchte das Script nicht so wie ich wohl will. Hab jetz 2 Stunden rumprobiert und komme nicht auf das Ergebnis: "Hey, liefer mir die ersten 13 neusten Ordner auf Seite 1 und die nächsten 13 Ordner auf Seite 2 wenn ich dich über die Adresszeile anspreche". Stattdessen kommt "Hey ich liefer dir auf Seite 0 die ersten 13 Ordner und auf Seite 1 und die anderen einfach mal garnix" =(

PHP:
<?php 
$uri = $_SERVER['REQUEST_URI']; 
$dir = '/home/www/web55/html/tomb2/gallery/'; 
$verz = opendir($dir); 
$files = array(); 



while($file = readdir($verz)) { 
    if($file != '.' and $file != '..'  and $file != 'dir.php') { 
        $files[filemtime($dir.$file)] = $file;
        ++$i;
    }
}

krsort($files);
closedir($verz); 

$count = 0;
$page = $_GET["p"];
$show = 13;
$offset = ($page - 1) * $show;
$limit  = $offset + $show;

$i = 0;

foreach ($files as $file) { 
    if ($i <= $offset)
        continue;
    else if ($i > $limit)
        break; 
foreach ($files as $file) {
 
    if ($count > 13) {
        break;
    }
   
    $time = filemtime("gallery/{$file}");
    $date = date("d.m.Y", $time);
    $count++;

    if ($count % 2 == 1) {
        $style = " bgcolor=f0fcfc";
    } else {
        $style = "";
    }
    
    $array = scandir("gallery/$file/");
    $filecount = count($array) - 2;
    
    echo "<tr{$style}><td width=55% style=\"border:2px solid #F0FCFC\">"
       . "<span class=text1>{$file}</span></td><td  style=\"border:2px solid #F0FCFC\">"
       . "<span class=text1>Datum: {$date}</span></td>"
       . "<td style=\"border:2px solid #F0FCFC\"><span class=text1>Fotos: {$filecount}</span></td></tr>";


} 
$i++;
}

?>
 
Zuletzt bearbeitet:
ist doch ein problem mit pageination/paging?!

Schau mal im tutorial bereich da gibts unter diesen Stichwörtern ganz viele Tipps und Tricks.

Oder du schaust hier im Forum...

Versuchs außerdem mal lieber mit ner for schleife ich glaub das ist besser.

in der for schleife kannst ja immernoch eine foreach haben, aber wie's jetzt ist kommt mir komisch vor
 
Zurück