PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sessions und GET Variablen überprüfen


cesca
05.03.2007, 19:37:22
Hallo,
zur Übung dachte ich mir schreibst einen Dateibrowser. Da könnte man unterwegs ohne ftp mal an den Webspace ran.
Hier erst mal der Code:<?php
session_start();
$userpath = "./";

if($_GET['change'] == "y") { //ist verzeichniswechsel
foreach($_SESSION['folderid'] as $fnr => $nextpath) { //sessionfolderids auslesen
if($_GET['where'] == $fnr) { //mit get vergleichen und wenn vorhanden
$path = $nextpath; //für handle vorbereiten
}
}
}else{ //ist kein verzeichniswechsel
$path = $userpath; //stammverzeichnis vorbereiten
}

$pathhandle = dir($path); //handle öffnen
while(false !== ($unit = $pathhandle->read())) { //wenn handle existent dann inhalt lesen
if($unit != "." && $unit != "..") { //wenn nicht aktuelles und übergeordnetes verzeichnis
if(is_dir($path.$unit)) { //und wenn verzeichnis dann
$dirArray[] = $unit; //in verzeichnisarray einlesen
}elseif(is_file($path.$unit)) { //oder wenn datei dann
$fileArray[] = $unit; //in dateiarray einlesen
}
}
}
$nowpath = $pathhandle -> path; //aktuelle url feststellen
$pathhandle->close(); //handle schließen
echo "Ort: ".$nowpath."<br /><br />"; //standort

if($userpath !== $path) { //wenn nicht stammverzeichniss dann
$folder = dirname($path); //url des standorts
$_SESSION['folderid'][0] = ($folder."/"); //id der standorturl
echo "<a href=\"".$_SERVER['PHP_SELF']."?change=y&where=0\">ein Verzeichnis h&ouml;her</a><br />";
} //zurückbrowsen anzeigen


if(@is_array($dirArray)) { //gibt es ein verzeichnisarray dann
natsort($dirArray); //sortieren
$id = 1;
foreach($dirArray as $wert) { //durchlaufen
$folder = $nowpath.$wert."/"; //verzeichnisurl
$_SESSION['folderid'][$id] = $folder; //id mit pfad
echo "<a href=\"".$_SERVER['PHP_SELF']."?change=y&where=$id\">$wert</a><br />"; //alles ausgeben
$id++;
}
}
if(@is_array($fileArray)) { //gibt es ein dateiarray
natsort($fileArray); //sortieren
foreach($fileArray as $wert) { //durchlaufen
echo "$wert<br />"; //alles ausgeben
}
}
?>Ist doch schon was komplexer. Wenn jemand zu der Funktionsweise eine Meinung hat würde mich das auch freuen.
Jetzt aber mein eigentliches Problem. Am Anfang hatte ich die Pfade direkt mit den GET Variablen übertragen was natürlich ungünstig hinsichtlich Manipulation (Adressleiste) ist.
Nun also mit Session und Ids. Wenn ich jetzt die GET Variable where=$id manipuliere ist meine $path Variable nicht definiert. Was ja auch richtig ist da durch:if($_GET['change'] == "y") { //ist verzeichniswechsel
foreach($_SESSION['folderid'] as $fnr => $nextpath) { //sessionfolderids auslesen
if($_GET['where'] == $fnr) { //mit get vergleichen und wenn vorhanden
$path = $nextpath; //für handle vorbereiten
}
}
}else{ //ist kein verzeichniswechsel
$path = $userpath; //stammverzeichnis vorbereiten
}keine passende Id zu den Sessioneinträgen vorhanden ist. Nur wie fange ich eine Fehleingabe von GET['where'] am einfachsten ab. In der foreach $_SESSION scheint mir das nicht zu gehen. Ich könnte vorher das Session Array dahingehend überprüfen ob die GET Variable enthalten ist. Nur wie könnte das Aussehen und könnte ich mir dann das Session foreach nicht direkt sparen. Irgendwie stehe ich hierbei auf dem Schlauch.
liebe Grüße cesca

Andes
05.03.2007, 20:44:30
Da anscheinend where ein Index des Arrays $_SESSION['folderid'] ist. Kannst du ja mit array_key_exists() prüfen ob der übergebene Wert vorhanden ist. Oder einfach mit empty() prüfen ob der Index existiert und nicht leer ist.


if(array_key_exists($_GET['where'], $_SESSION['folderid'])) $path = $_SESSION['folderid'][$_GET['where']];
else { }
//oder
if(!empty($_SESSION['folderid'][$_GET['where']])) $path = $_SESSION['folderid'][$_GET['where']];
else { }

cesca
05.03.2007, 21:14:56
Das scheint gut zu funktionieren.
Erspart bei mir hier die foreach-if Abfrage und ich kann problemlos mit else eine Fehleingabe abfangen.if($_GET['change'] == "y") { //ist verzeichniswechsel
if(!empty($_SESSION['folderid'][$_GET['where']])) { //ist id in session
$path = $_SESSION['folderid'][$_GET['where']]; //handle vorbereiten
}else{ //ansonsten
$path = $userpath; //zurück zum stammverzeichnis
}
}else{ //ist kein verzeichniswechsel
$path = $userpath; //stammverzeichnis vorbereiten
}
Mit not empte ist es sogar noch etwas weniger Code.
Dankeschön, cesca