Problem mit Gallery Script

versuch13

Erfahrenes Mitglied
Hi, ich habe mir ein kleines Gallery Script geschrieben. Nun habe ich ein Problem mit der Blätterfunktion.

Das Script gal.php sieht so aus:

PHP:
error_reporting(E_ALL);

function show_thumbnail($file) {

    if(is_file($file)) {
    
        $max = 160; // Max. thumbnail width and height
        
        $size = getimagesize($file);
        if ( $size[0] <= $max && $size[1] <= $max ) {
           $ret = '<img src="'.$file.'" '.$size[3].' border="0">';
        }
        else {
           $k = ( $size[0] >= $size[1] ) ? $size[0] / $max : $size[1] / $max;
           $ret = '<a href="javascript:;" onClick="window.open(\'image.php?img=';
           $ret .= $file.'\',\'\',\'width='.$size[0];
           $ret .= ',height='.$size[1].'\')">';
           $ret .= '<img src="'.$file.'" width="'.floor($size[0]/$k).'" height="'.floor($size[1]/$k).'" border="0" alt="View full-size image"></a>';
        }
    
        return $ret;
     
    }
    
}



    // Verzeichnisnamen lesen
    $mydirs = getcwd()."/img";
    $verzs = dir($mydirs);
    while($entrys=$verzs->read()){
            if($entrys != "." && $entrys != ".."){
            $ordner[] = $entrys;
        }
    }
    $verzs->close();    
    

    // Ausgabe der Verzeichnisnamen verlinkt zu den Gallerien
    rsort($ordner);
    

    
    while(list($key, $val) = each($ordner)) {
        $datei = ("img/".$val."/gallery.txt");
        $data = file($datei);
        foreach($data as $titel) {
            echo "<a href=\"gal.php?gallery=".$val."&seite=1\">".$val."</a> ".$titel."<br />\n";    
        }    
    } 
    
    
    if(isset($_GET['gallery'])) {
        // Gallerie Verzeichnis auslesen (Bilder)
        $mydir = getcwd()."/img/".$_GET['gallery']."";
        $verz = dir($mydir);
        while(false !== $entry = $verz -> read()){
                if($entry != "." && $entry != ".." && $entry != "gallery.txt"){
                $dateinamen[] = $entry;
            }
        }
        $verz->close();
        
        //Ausgabe der Bilder (Blätterfunktion)
        rsort($dateinamen);
        
        
        echo "<div style=\"width:620px;\">\n";
        
        
        $seite = $_GET['seite']; 
        if(!isset($seite)) {
            $seite = 1;
        }
        
        $max_eintraege = 9; 
    
        $start = $seite * $max_eintraege - $max_eintraege;
        
        $eintraege = count($dateinamen);
        
        $max_seite = $eintraege / $max_eintraege;
        
        echo "<br />Anzahl der Bilder in dieser Gallerie: ".$eintraege."<br /><br />\n";
        
        
        
        
        
            for($i = 0; $i < $max_eintraege; $i++) {    
                    
                if(file_exists("img/".$_GET['gallery']."/".$dateinamen[$i])) {    
                    
                    if(substr($dateinamen[$i], -4) == ".jpg") {                                        
    
                        echo show_thumbnail("img/".$_GET['gallery']."/".$dateinamen[$i+$start]."")."\n";                         
                            
                    }
                                    
                } 
                                        
            }
            
        
            
        
            
            
        
        echo "<br />";
        # Ausgabe der Seiten Links
        if($max_eintraege < $eintraege) {
            for($a=0; $a < $max_seite; $a++) {
                $b = $a+1;
                if($seite == $b) {
                    echo " <b>$b</b> ";
                } else {
                    echo "<a href=\"?gallery=".$_GET['gallery']."&seite=".$b."\">$b</a>\n";
                }
                
            } 
        }
        

        echo "</div>";
    }


Das Script ist ein wenig kommentiert. Erst werden die Verzeichnisse ausgelesen. Im Ordner img befinden sich die einzelnen Gallerien, benannt nach dem Schema "Gallery1, Gallery2, Gallery3, usw.". Diese werden dann verlinkt.
Dann werden thumbnails angezeigt, hier im Beispiel immer neun Stück auf einer Seite.

Jetzt zum Problem. Habe ich z.B. 11 Bilder in dem Ordner Gallery1, werden also zwei Seiten angelegt, eine auf der neun Bilder angezeigt werden, auf Seite 2 dann nochmals zwei weitere Bilder.

Dann bekomme ich diese Fehlermeldungen:

Code:
Notice:  Undefined offset:  11 in C:\Programme\Apache2\htdocs\webprojects\Uebungen\gallery\gal.php on line 99
 
Notice:  Undefined offset:  12 in C:\Programme\Apache2\htdocs\webprojects\Uebungen\gallery\gal.php on line 99
 
Notice:  Undefined offset:  13 in C:\Programme\Apache2\htdocs\webprojects\Uebungen\gallery\gal.php on line 99
 
Notice:  Undefined offset:  14 in C:\Programme\Apache2\htdocs\webprojects\Uebungen\gallery\gal.php on line 99
 
Notice:  Undefined offset:  15 in C:\Programme\Apache2\htdocs\webprojects\Uebungen\gallery\gal.php on line 99
 
Notice:  Undefined offset:  16 in C:\Programme\Apache2\htdocs\webprojects\Uebungen\gallery\gal.php on line 99
 
Notice:  Undefined offset:  17 in C:\Programme\Apache2\htdocs\webprojects\Uebungen\gallery\gal.php on line 99


Nehme ich das error_reporting(E_ALL) raus, werden diese nicht mehr angezeigt, aber das ist ja nicht die Lösung. Weiß wer was da falsch läuft? Wäre sehr dankbar wenn sich das mal jemand ansehen könnte.


Ich hänge das ganze auch nochmal an. Einfach die gal.php aufrufen.


Vielen Dank. Grüße
 

Anhänge

Wenn du nicht sicher sein kannst, ob ein Element eines Arrays existiert, solltest du dies vor dessen Zugriff/Verarbeitung prüfen. Ein Beispiel:
PHP:
if( isset($array['key']) ) {
	echo '$array["key"] existiert und hat den Wert: '.var_export($array['key'], true);
}
 
Danke für die schnelle Antwort. So ähnlich habe ich mir das auch schon gedacht. Allerdings scheitere ich an der Umsetzung. Ich dachte es reicht aus mit file_exists zu überprüfen ob die Datei überhaupt vorhanden ist.

Ich habe auch schon anderes versucht wie z.B.

PHP:
            for($i = 0; $i < $max_eintraege; $i++) {    
            
                if(isset($dateinamen[$i])) {
                        
                    if(file_exists("img/".$_GET['gallery']."/".$dateinamen[$i])) {    
                        
                        if(substr($dateinamen[$i], -4) == ".jpg") {                                        
        
                            echo show_thumbnail("img/".$_GET['gallery']."/".$dateinamen[$i+$start]."")."\n";                         
                                
                        }
                                        
                    } 
                
                }
                                        
            }


Also zusätzlich mit:
PHP:
if(isset($dateinamen[$i]))


Der Fehler ist allerdings trotzdem noch vorhanden. Wo muss ich denn auf die existenz des array Elementes überprüfen? Danke. Gruß
 
Ist das denn die erwähnte Zeile? Ich denke, der Fehler wird eher in der Zeile mit folgender Anweisung zu suchen sein:
PHP:
echo show_thumbnail("img/".$_GET['gallery']."/".$dateinamen[$i+$start]."")."\n";
 
Ja klar, das ist die Zeile in der der Fehler sitzt. Aber kann ich in der Zeile selbst irgendwie darauf überprüfen? Ich dachte es reicht wenn ich vor der Zeile mit der Ausgabe auf die existenz des Elementes überprüfe. Aber ich kenne mich da einfach auch nicht so gut aus. Ich habe bevor ich gepostet habe wirklich haufenweise Versuche durchgearbeitet. Der Fehler liegt ganz genau hier oder?

PHP:
$dateinamen[$i+$start]

Die Schleife wird immer neun mal durchlaufen und $i + 1 erhöht, auf Seite zwei sind jetzt aber z.B. nur zwei Bilder und da entsteht der Fehler, oder?

Aber ich weiß es einfach echt nicht zu lösen? Noch ein Tipp vielleicht bitte?
 
Du prüfst nur, ob die Variable $dateinamen[$i] und eine Datei mit entsprechendem Wert als Teil des Dateinamen existiert. Die Existenz der Variable $dateiname[$i+$start] wird aber nicht geprüft. Und genau dort scheint der Fehler zu sein.
 
Ah, vielen Dank Gumbo. Die Lösung war also einfach:

PHP:
if(isset($dateinamen[$i+$start])) {                    
        
            echo show_thumbnail("img/".$_GET['gallery']."/".$dateinamen[$i+$start]."")."\n";         
                                
}
 
Zurück