Auge: substr

Beitrag lesen

Hallo

oh, da haste recht.
habs wie folgt geändert:

if ($_GET) {
$link = $HTTP_GET_VARS["link"];
$name = $HTTP_GET_VARS["name"];
}

  
Ganz schlecht. Erstens ist immer noch nicht sicher, ob diese Elemente existieren und zweitens ist `$HTTP_GET_VARS`{:.language-php} sowas von veraltet (wurde mit PHP 4.2 durch `$_GET`{:.language-php} ersetzt, ich weiß nicht mal, ob es in PHP 5 noch drinnen ist). Benutze also `$_GET`{:.language-php} und frage direkt ab, ob dessen Elemente "link" und "name" existieren. Die Kritik am Umkopieren bleibt. Du kannst, nach der Bestätigung der Existenz, `$_GET["link"]`{:.language-php} und `$_GET["name"]`{:.language-php} direkt verwenden.  
  

> > > ~~~php

for ($zaehler = 0; $zaehler < count($verzeichnis); $zaehler++) {  

> > >  // Verzeichnisnamen extrahieren!  
> > >   
> > >  $verzeichnisname = explode("/", $verzeichnis[$zaehler]);  
> > >  $verzeichnisname = $verzeichnisname[1];  
> > >     // Generiere Linknamen: Lösche erste 3 Zeichen und ersetze _ durch Leerzeichen  
> > >     $verzeichnisname = substr(str_replace("_", " ", $verzeichnis[$zaehler]), 10, -1);

  1. Woher kommt $verzeichnis? Sollte da nicht $verzeichnisname bzw. $verzeichnisname[1] (Wozu umherkopieren, wenn es auch direkt nutzbar ist?) stehen?

$verzeichnis is das array wo die ordner eingetragen werden.

Oh, habe ich übersehen. Damit erledigt sich auch meine diesbezügliche Nachfrage.

eigentlich möchte ich dass die ordner automatisch ausgelesen werden. jedoch hab ich es noch nicht hinbekommen. es wird mir zwar in ein array geschrieben, jedoch bekomme ich es nicht eingebunden. da muss ich nochmal schauen.

In $verzeichnis[$zaehler] steht beim ersten Durchlauf "portfolio/ordner_1/", in $verzeichnisname "ordner_1". Für die Navigation hast du alle nötigen Werte.

  1. Die Ursprungszeichenkette "ordner_1" hat nur 8 Zeichen. Deine Anwendung von substr gibt aber eine Zeichenkette von Position 10 bis zum vorletzten Zeichen zurück, die es nicht geben kann, da die Zeichenkette dafür zu kurz ist.

es wird mir derzeit der komplette pfad ausgegeben. also inkl. portfolio/...
darum sind es 10 zeichen.

Siehe oben, wg. "übersehen". Wenn du an der Stelle "ordner_1" extrahieren und anpassen willst, warum nutzt du dann nicht gleich $verzeichnisname[1], wo genau dieser Wert drin steht?

$linkText = str_replace("_", " ", ucfirst($verzeichnisname[1]));  
# ergibt: "Ordner 1"

Damit hast du den Schritt der Umwandlung des ersten Buchstabens in einen Großbuchstaben gleich miterschlagen. Ich habe, ausgehend von deinem Array mit jeweils nur einem Wort im Verzeichnisnamen ucfirst anstatt ucwords benutzt. Gibt es Namen mit mehreren Worten, ist ucwords eventuell angebrachter. Bleibt für die Ausgabe nur noch das folgende zu beachten:

Benutze $_SERVER["SCRIPT_NAME"] statt $_SERVER["PHP_SELF"], maskiere $verzeichnisname im Parameterteil der URL mit urlencode und mit htmlspecialchars im Linktext.

Jetzt angepasst (ohne ucwords/ucfirst):

echo "<li><a href="" . $_SERVER["SCRIPT_NAME"] . "?link=" . urlencode($verzeichnisname) . "">" . htmlspecialchars($verzeichnisname) . "</a></li>\n";

$link = $HTTP_GET_VARS['link'] ;

if (!isset($var)) {
// Festlegung der leeren VAR $site
if (!isset($link)) {

  $link = "ordner-1";  

}
        $pfad = "./portfolio/".$link;
        }
?>

  
Hieß der Pfad nicht eben noch "/portfolio/ordner\_1" (beachte den \*Unter\*strich)?  
  
Dein Aufbau reißt eine Sicherheitslücke in dein Skript. Du übernimmst direkt Eingaben des Besuchers in den Pfad. Du überprüfst nicht, ob diese Eingabe den Erwartungen entspricht (Gibt es diesen Pfad und wenn ja, ist das betreffende Verzeichnis für das Auslesen durch den Benutzer da?). Dazu bietet sich in deinem Fall in\_array an, da du ein Array der erlaubten Pfade da hast. Achte dann aber auch auf die Slashes!  
  
~~~php
if (in_array("/portfolio/".$link, $verzeichnis)) {  
$pfad = "/portfolio/".$link;  
}

nun das bilderladen:

<?php

// Öffnet ein Unterverzeichnis mit dem Namen "daten"

$imagesfolder = openDir("portfolio/ordner_1");
// Verzeichnis lesen
while ($image = readDir($imagesfolder)) {
// Höhere Verzeichnisse nicht anzeigen!
if ($image != "." && $image != "..") {
  // Dateityp filtern. Es werden nur .php-Dateien angezeigt
  if (strstr($image, ".gif") ||
     strstr($image, ".png") ||
     strstr($image, ".jpg")) {
   // Dateiendung vom Dateinamen filtern
   $name = explode(".", $image);
   // Link erstellen
   echo "<img src='portfolio/ordner_1/$image' alt='$name[0]' />\n";

}
}
}
closeDir($imagesfolder); // Verzeichnis schließen
?>

  
Der Kommentar "Dateityp filtern. Es werden nur .php-Dateien angezeigt" ist falsch, es sollen ja nur Bilder ausgegeben werden. Einen Dateinamen kann man aber fälschen, nur auf die Dateiendung zu prüfen ist daher Unfug.  
  
Prüfe stattdesen mit [getimagesize](http://de3.php.net/manual/de/function.getimagesize.php) auf die im Arrayelement 2 zurückgegebene Konstante des Dateityps. Bei der [Funktionsbeschreibung für exif_imagetype](http://de3.php.net/manual/de/function.exif-imagetype.php) findest du eine Liste der möglichen Konstanten. Für dich sind 1, 2 und 3 relevant, ich fasse sie unten mit range über ein Array zusammen und prüfe den ermittelten Wert gegen das Array.  
  
~~~php
$test = getimagesize($image);  
if (in_array($test[2], range(1,3)) {  
# Der Typ des Bildes ist entweder GIF, JPG oder PNG  
$name = explode(".", $image);  
$ausgabe = '<img src="portfolio/ordner_1/'.$image.'" alt="'. htmlspecialchars($name[0]).'" />';  
}

das funktioniert auch einwandfrei.
jedoch wenn ich jetzt statt "portfolio/ordner_1" in die openDir funktion die variable $pfad eintragen möchte funktioniert es nicht mehr.

Wie gesagt: "-" != "_".

Tschö, Auge

--
Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
Terry Pratchett, "Wachen! Wachen!"
ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
Veranstaltungsdatenbank Vdb 0.3