Zur Navigation

Dateien suchen und filtern

1 uwe

Hallo,
ich lese die Dateien im Verzeichnis mit einem Scipt aus.
Jetzt will ich oben ein Suchfeld haben mit dem dann die entsprechenden Dateien filtern kann.
Wenn man die php Datei aufruft sollen im ersten Moment alle
Dateien erscheinen.
<?php

echo '<form style="margin-top: 14px;" method="post" action="'.$HTTP_SERVER_VARS['PHP_SELF'].'">
<h1>Suche</h1>Suchen nach:<br><input style="width:200px" type="text" name="suchbegriff" value="'.$such_string.'">';
 echo '<input style="width:100px" type="submit" value="Suchen"></form><br>';




$such_string = strtolower(trim($suchbegriff));




function Dateigroesse($URL)
{
  $Groesse = filesize($URL);
  if($Groesse < 1000){
    return " ".number_format($Groesse, 0, ",", ".")." Bytes";
  }
  elseif($Groesse < 1000000){
    return " ".number_format($Groesse/1024, 0, ",", ".")." kB";
  }
  else{
    return " ".number_format($Groesse/1048576, 2, ",", ".")." MB";
  }
}



$dir = 'uploads/';

$files = array();
$fp = opendir($dir);

while (false !== ($file = readdir($fp)))
{
  if ($file == '.' || $file == '..' || $file == 'thumb' || $file == 'Thumbs.db')
   continue;

$files[] = array('fname' => $file, 'fdatum' => filemtime($dir.$file), 'fgroesse' => Dateigroesse($dir.$file), 'fsortgroesse' => filesize($dir.$file));
}

closedir($fp);


// vorwärts sortiert DAtum usort($files, 'DateCmp');
//sort($files, $file);

foreach ($files as $key => $row) {

if (isset($HTTP_POST_VARS['suchen']) and ereg($such_string, $row['fname']) and strlen($such_string >1)) {

    $fname[$key]  = $row['fname'];
    $fdatum[$key] = $row['fdatum'];
 $fgroesse[$key] = $row['fgroesse'];
 $fsortgroesse[$key] = $row['fsortgroesse'];
}
}



// Die Daten mit fname absteigend, Auflage aufsteigend sortieren
// Geben Sie $files als letzten Parameter an, um nach dem gemeinsamen
// Schlüssel zu sortieren.
$fname_lowercase = array_map('strtolower', $fname);
array_multisort($fname_lowercase, SORT_ASC, $fdatum, SORT_ASC, $fgroesse, SORT_DESC, $files);
//array_multisort($fsortgroesse, SORT_DESC, $fname, SORT_ASC, $fdatum, SORT_ASC, $files);



echo '<table  cellpadding="0" class="table">
   <tr>
     <td class="list_top">Name</td>
     <td class="list_top">Größe</td>
     <td class="list_top">Hochgeladen</td>
     <td class="list_top"></td>
   </tr>';
echo '<form style="margin-top: 14px;" method="post" action="'.$HTTP_SERVER_VARS['PHP_SELF'].'">';

foreach ($files as $entry) {
    echo '<tr>
     <td class="list_main">' . $entry['fname'] . '</td>
     <td class="list_main">' . $entry['fgroesse'] . '</td>
     <td class="list_main">' . date ('H:i:s - d.m.y', $entry ['fdatum']) . '</td>
     <td class="list_main"><a href="' . $dir . $entry['fname'] . '" target="_blank"><img src="icon.gif" border="no"/></a></td>
  </tr>';
}

echo '</table>';
 

?>

17.08.2008 10:38

2 Jörg Kruse

Was soll im Suchfeld denn eingegeben werden - Dateinamen, nach denen gesucht werden soll? Oder Feldnamen, nach denen sortiert werden soll?

PS: $HTTP_SERVER_VARS würde ich nicht mehr verwenden, da veraltet - stattdessen das seit PHP 4.1 übliche $_SERVER

17.08.2008 12:41

3 uwe

Hallo,
nur nach dem Dateinamen oder Teilen vom Namen.

Wenn z.B. eine Datei den Namen hat
"Joergs Forum.php"
und man in das Suchfeld "Forum" eingibt, soll die Datei mit angezeigt werden.

Gruss
Uwe

17.08.2008 12:47

4 Jörg Kruse

Mit strpos() kann auf einfache Weise auf das Vorkommen eines Strings geprüft werden

Du könntest dann beim Aufbau des Arrays diesen Filter berücksichtigen, also in etwa so:

while (false !== ($file = readdir($fp)))
{

/* etc. */

if (! issset $_POST['suchbegriff'] || strpos($file, $such_string) !== false)

    $files[] = array('fname' => $file, 'fdatum' => filemtime($dir.$file), 'fgroesse' => Dateigroesse($dir.$file), 'fsortgroesse' => filesize($dir.$file));

}

Die erste Bedingung sollte dabei dafür sorgen, dass alle Dateien aufgenommen werden, wenn kein Suchbegriff abgesendet wurde

17.08.2008 13:00 | geändert: 17.08.2008 13:02

5 uwe

Hallo,
ok, aber ich bekomme immer noch eine Fehlermeldung
Parse error: syntax error, unexpected T_VARIABLE in /home/www/s001.......

Gruss
Uwe

<?php

echo '<form style="margin-top: 14px;" method="post" action="'.$_SERVER['server_name'].'">
<h1>Suche</h1>Suchen nach:<br><input style="width:200px" type="text" name="suchbegriff" value="'.$such_string.'">';
 echo '<input style="width:100px" type="submit" value="Suchen"></form><br>';




$such_string = strtolower(trim($suchbegriff));




function Dateigroesse($URL)
{
  $Groesse = filesize($URL);
  if($Groesse < 1000){
    return " ".number_format($Groesse, 0, ",", ".")." Bytes";
  }
  elseif($Groesse < 1000000){
    return " ".number_format($Groesse/1024, 0, ",", ".")." kB";
  }
  else{
    return " ".number_format($Groesse/1048576, 2, ",", ".")." MB";
  }
}



$dir = 'uploads/';

$files = array();
$fp = opendir($dir);while (false !== ($file = readdir($fp)))
{
  if ($file == '.' || $file == '..' || $file == 'thumb' || $file == 'Thumbs.db')
   continue;
  
if (! issset $_POST['suchbegriff'] || strpos($file, $such_string) !== false)

    $files[] = array('fname' => $file, 'fdatum' => filemtime($dir.$file), 'fgroesse' => Dateigroesse($dir.$file), 'fsortgroesse' => filesize($dir.$file));

}

closedir($fp);


// vorwärts sortiert DAtum usort($files, 'DateCmp');
//sort($files, $file);

foreach ($files as $key => $row) {

if (isset($HTTP_POST_VARS['suchen']) and ereg($such_string, $row['fname']) and strlen($such_string >1)) {

    $fname[$key]  = $row['fname'];
    $fdatum[$key] = $row['fdatum'];
 $fgroesse[$key] = $row['fgroesse'];
 $fsortgroesse[$key] = $row['fsortgroesse'];
}
}



// Die Daten mit fname absteigend, Auflage aufsteigend sortieren
// Geben Sie $files als letzten Parameter an, um nach dem gemeinsamen
// Schlüssel zu sortieren.
$fname_lowercase = array_map('strtolower', $fname);
array_multisort($fname_lowercase, SORT_ASC, $fdatum, SORT_ASC, $fgroesse, SORT_DESC, $files);
//array_multisort($fsortgroesse, SORT_DESC, $fname, SORT_ASC, $fdatum, SORT_ASC, $files);



echo '<table  cellpadding="0" class="table">
   <tr>
     <td class="list_top">Name</td>
     <td class="list_top">Größe</td>
     <td class="list_top">Hochgeladen</td>
     <td class="list_top"></td>
   </tr>';
echo '<form style="margin-top: 14px;" method="post" action="'.$HTTP_SERVER_VARS['PHP_SELF'].'">';

foreach ($files as $entry) {
    echo '<tr>
     <td class="list_main">' . $entry['fname'] . '</td>
     <td class="list_main">' . $entry['fgroesse'] . '</td>
     <td class="list_main">' . date ('H:i:s - d.m.y', $entry ['fdatum']) . '</td>
     <td class="list_main"><a href="' . $dir . $entry['fname'] . '" target="_blank"><img src="iconx1.gif" border="no"/></a></td>
  </tr>';
}

echo '</table>';


?>

17.08.2008 13:52

6 Jörg Kruse

Da fehlten noch Klammern - und "isset" hatte ich fälschlicherweise mit drei s geschrieben. Probier's mal so:

$fp = opendir($dir);
while (false !== ($file = readdir($fp))) {
    if ($file == '.' || $file == '..' || $file == 'thumb' || $file == 'Thumbs.db') {
        continue;
    }
    if (! isset $_POST['suchbegriff'] || strpos($file, $such_string) !== false) {
        $files[] = array('fname' => $file, 'fdatum' => filemtime($dir.$file), 'fgroesse' => Dateigroesse($dir.$file), 'fsortgroesse' => filesize($dir.$file));
    }
}
closedir($fp);

PS: in deisem Fall war es wohl nicht notwendig - aber ansonsten bei solchen Fehlermeldungen wie "Parse error: syntax error, unexpected T_VARIABLE in /home/www/s001......." besser noch dabei schreiben, auf welche Zeile diese sich bezieht ;)

17.08.2008 15:36 | geändert: 17.08.2008 15:39

7 uwe

Hallo,
es geht ein Stückchen weiter.

Bei der Stelle
   if (! isset $_POST['suchbegriff'] || strpos($file, $such_string) !== false) {

kommt die Meldung
Parse error: syntax error, unexpected T_VARIABLE, expecting '(' in /home/www/s001w22/

Gruss Uwe

Hier noch mal mein ganzer Code:
<?php

echo '<form style="margin-top: 14px;" method="post" action="'.$_SERVER['server_name'].'">
<h1>Suche</h1>Suchen nach:<br><input style="width:200px" type="text" name="suchbegriff" value="'.$such_string.'">';
 echo '<input style="width:100px" type="submit" value="Suchen"></form><br>';




$such_string = strtolower(trim($suchbegriff));




function Dateigroesse($URL)
{
  $Groesse = filesize($URL);
  if($Groesse < 1000){
    return " ".number_format($Groesse, 0, ",", ".")." Bytes";
  }
  elseif($Groesse < 1000000){
    return " ".number_format($Groesse/1024, 0, ",", ".")." kB";
  }
  else{
    return " ".number_format($Groesse/1048576, 2, ",", ".")." MB";
  }
}



$dir = 'uploads/';

$files = array();
$fp = opendir($dir);
while (false !== ($file = readdir($fp))) {
    if ($file == '.' || $file == '..' || $file == 'thumb' || $file == 'Thumbs.db') {
        continue;
    }
    if (! isset $_POST['suchbegriff'] || strpos($file, $such_string) !== false) {
        $files[] = array('fname' => $file, 'fdatum' => filemtime($dir.$file), 'fgroesse' => Dateigroesse($dir.$file), 'fsortgroesse' => filesize($dir.$file));
    }
}
closedir($fp);

// vorwärts sortiert DAtum usort($files, 'DateCmp');
//sort($files, $file);

foreach ($files as $key => $row) {

if (isset($HTTP_POST_VARS['suchen']) and ereg($such_string, $row['fname']) and strlen($such_string >1)) {

    $fname[$key]  = $row['fname'];
    $fdatum[$key] = $row['fdatum'];
 $fgroesse[$key] = $row['fgroesse'];
 $fsortgroesse[$key] = $row['fsortgroesse'];
}
}



// Die Daten mit fname absteigend, Auflage aufsteigend sortieren
// Geben Sie $files als letzten Parameter an, um nach dem gemeinsamen
// Schlüssel zu sortieren.
$fname_lowercase = array_map('strtolower', $fname);
array_multisort($fname_lowercase, SORT_ASC, $fdatum, SORT_ASC, $fgroesse, SORT_DESC, $files);
//array_multisort($fsortgroesse, SORT_DESC, $fname, SORT_ASC, $fdatum, SORT_ASC, $files);



echo '<table  cellpadding="0" class="table">
   <tr>
     <td class="list_top">Name</td>
     <td class="list_top">Größe</td>
     <td class="list_top">Hochgeladen</td>
     <td class="list_top"></td>
   </tr>';
echo '<form style="margin-top: 14px;" method="post" action="'.$HTTP_SERVER_VARS['PHP_SELF'].'">';

foreach ($files as $entry) {
    echo '<tr>
     <td class="list_main">' . $entry['fname'] . '</td>
     <td class="list_main">' . $entry['fgroesse'] . '</td>
     <td class="list_main">' . date ('H:i:s - d.m.y', $entry ['fdatum']) . '</td>
     <td class="list_main"><a href="' . $dir . $entry['fname'] . '" target="_blank"><img src="icon.gif" border="no"/></a></td>
  </tr>';
}

echo '</table>';


?>

17.08.2008 15:56

8 Jörg Kruse

Ja, da fehlen noch die Klammern von isset():
if (! isset($_POST['suchbegriff']) || strpos($file, $such_string) !== false) {

... irgendwie war ich da wohl nicht so ganz bei mir, als ich den Code geschrieben habe ;)

17.08.2008 16:06

9 uwe

Hallo,
danke, ich denke fast geschafft.

Bei dem Bereich
$fname_lowercase = array_map('strtolower', $fname);
array_multisort($fname_lowercase, SORT_ASC, $fdatum, SORT_ASC, $fgroesse, SORT_DESC, $files);



kommt die Meldung:
Warning: array_map() [function.array-map]: Argument #2 should be an array in /home/www/....r_suchen.php on line ..

Warning: array_multisort() [function.array-multisort]: Argument #1 is expected to be an array or a sort flag in /home/www/.......dir_suchen.php on line ..

Wie setzt man das Suchen wieder zurück? (alles wieder anzeigen)
Einfach die Seite neu aufrufen?

Gruss
Uwe

17.08.2008 16:41

10 Jörg Kruse

Ja, einfach die URL neu aufrufen

Warning: array_map() [function.array-map]: Argument #2 should be an array in /home/www/....r_suchen.php on line ..

Warning: array_multisort() [function.array-multisort]: Argument #1 is expected to be an array or a sort flag in /home/www/.......dir_suchen.php on line ..

Demnach sind $fname etc. keine Arrays. Ich würde die betreffenden Variablen vor der foreach Schleife als leere Arrays initialisieren:

$fname = $fdatum = $fgroesse = array();
foreach ($files as $key => $row) {

17.08.2008 17:30