Mit PHP Ordner durchsuchen und Dateien anzeigen

nchristoph

Erfahrenes Mitglied
Hallo zusammen,

wieder einmal eine etwas umständliche Frage:

Ich soll für unser Verzeichnis eine Suchfunktion programmieren. Das Verzeichnis ist einfach nur eine Anordnung von Ordnern und Unterordnern wo PDF Dateien abgespeichert sind.

Die Verzeichnisstruktur wäre so aufgebaut:

Holzarten
--Buche
--- 26 mm
--- 32 mm
--- 40 mm
--- 50 mm
--- 60 mm
-- Ahorn
--- 26 mm
--- 32 mm
--- 40 mm
--- 50 mm
--- 60 mm

usw.

In diesen Ordnern liegen dann wie bereits erwähnt einzelne PDF Dateien die dann einfach eine Nummer als Namen haben um die Paketnummer darzustellen.

Meine Frage: Wie mache ich die Suche, das sie Externe Ordner durchsuchen kann.

Der Server ist in einem anderen Verzeichnis als das Archiv(Server C:\xampp, Archiv P:\Holzarchiv) und ich kann das ganze nicht verschieben weil sonst Teile unserer EDV nicht mehr funktionieren könnte.

Kann mir wer helfen?
 
Also wenn "P:\Holzarchiv" eine feste Netzwerksverknüpfung bzw ein fester Pfad ist, dann kannst du diesen doch bei der Suche verwenden.

PHP:
<?php
if (file_exists('P:\Holzarchiv\\Holzarten\\usw\\usw\\')) {
	echo "vorhanden";
} else {
	echo "nicht gefunden";
}
?>

Die doppelten"\\" stehen nur drin weil (warum auch immer) ein einzelner gelöscht wird.
 
Zuletzt bearbeitet:
Ich bin in diesem Gebiet noch etwas unerfahren in Punkto PHP, meine bisherigen Suchfunktionen waren alle auf Datenbanken aufgebaut, welche in diesem Fall leider nicht möglich ist da es ja für JEDEN zu warten sein sollte und nicht nur für mich.

Wie KÖNNTE die Suchfunktion in diesem Fall in etwa aussehen. Oder ist die Suchfunktion im Prinzip genauso aufzubauen wie mit Datenbanken?
 
Also ich hab bis jetzt alle meine Suchscripts so aufgebaut:

PHP:
	echo "<table width=\"50\" border=\"0\">";
	
	$editfeld = $_POST['search_term'];
	if (strlen( $editfeld )> 0)
	{
	$sql = "SELECT
				name
			FROM
				mitarbeiter
			WHERE
				name LIKE '%" . mysql_real_escape_string($_POST['search_term']) . "%'"; 
			
	$result = mysql_query($sql) OR die(mysql_error());
	if(mysql_num_rows($result)) { // gucken ob was im Query drinsteckt
		while($row = mysql_fetch_assoc($result)) {
	  	echo "<tr>";
		echo "<td><a href=\"index.php?p=mitarbeiter#".$row['name']."\">".$row['name']."</a>";
		echo "</tr>";
			}
		} 
		}
		else{
			echo "Kein Mitarbeiter mit diesem Namen gefunden<br />\n";
		}

echo "</table>";

Wie funktioniert das ganze mit ordern und Dateien?
 
Ich hab das jetzt mal versucht, haut allerdings nicht wirklich hin.

PHP:
<?php

	echo "<table width=\"50\" border=\"0\">";
	
	$editfeld = $_POST['search_term'];
	if (strlen( $editfeld )> 0)
	{
		$dir = "O:\\Holz\\Masslisten\\";
		$dh  = scandir($dir);
    
	  	echo "<tr>";
		echo "<td><a href=\"".$dh."\"\">".$dh."</a>";
		echo "</tr>";
			}
		 
		else{ die("Keine Massliste zu dieser Partienummer gefunden<br />\n");
		}

echo "</table>";
?>

Ich krieg immer folgenden Fehler: Warning: scandir(O:\Holz\Masslisten\) [function.scandir]: failed to open dir: No such file or directory in C:\xampp\xampp\htdocs\inc\search.php on line 8

Auch fällt mir noch kein Weg ein, wie ich die Suchbegriff übergabe machen könnte.
 
Dein Ansatz ist nicht schlecht. Doch geht das nicht mehr wenn du mit Unterverzeichnissen arbeiten willst.
Ich habe hier mal ein Beispiel, wie man sowas machen könnte. Die Funktionen sind alle so, dass sie nicht nur für deinen Fall funktionieren.

Das Resutlat ist ein Array mit den Pfaden zu allen Dateien deren Dateiname dem Suchbegriff entspircht

PHP:
<?php 

$dir = 'C:/temp';
$search = '01186_ExposureOverTime.xls';

//Alle Dateien in ein 2-Dimensionalen Array schreiben
$items = getDirContent($dir);
//Alle Dateien mit einem bestimmten Namen ausfiltern und in $result zurückgeben
$result = array();
foreach($items as $item){
    if($item['name'] == $search){
        $result[] = $item['path'];   
    }    
}
//Ausgabe:
var_dump($result);


/**
 * Rekursive Funktion um alle Dateien eines Verzeichnises zu katalogisieren
 * @param String    $dir zu durchsuchendes Verzeichniss
 * @return Array<Array<String>> 
 * @example Return-Value: array('name'=>'test.txt', 'path'=>'C:temp/test.txt')
 */
function getDirContent($dir){
    $items = array();
    if (is_dir($dir)) {
        foreach(scandir($dir) as $file){
            $path = createPath($dir, $file);
            if(is_dir($path) && $file!='.' && $file!='..'){
                $items = array_merge($items, getDirContent($path));
            }elseif(is_file($path)){
                $items[] = array('name' => $file, 'path' => $path);
            } 
        }            
    }
    return $items;
}

/**
 * Aus meiner Funktionsbibliothek
 *  createPath: http://wiki.yaslaw.info/wikka/PhpCreatePath
 *
 * mpl           by ERB software
 * @author       stefan.erb(at)erb-software.com
 */

/**
 * @param   Strings   zusammenzusetzende Elemente
 * @return  String
 * @example
 *      $path = createPath("C:\\temp\\", "test.txt");
 *      $path = createPath("C:", "temp", "test.txt")
 */
function createPath(){
    $parts = func_get_args();
    array_walk($parts, 'removeLastSeparator');
    return str_replace("\\", "/", implode("/", $parts));    
}

/**
 * Hilfsfunktion um die nachgestelltenn / und \ von Pfadelementen zu entfernen
 * Wird von createPath() verwendet
 * @param $part
 */
function removeLastSeparator(&$part){
    $part = preg_replace('/[\/\\\]*$/', '', $part);
}

?>
 
Danke für deine Hilfe Yaslaw, leider funktioniert es nicht so ganz.

Ich habe es für meine zwecke angepasst.

PHP:
<?php 
 
$dir = 'O:/Holz/Masslisten';
$search = $_POST['search_term'];
 
//Alle Dateien in ein 2-Dimensionalen Array schreiben
$items = getDirContent($dir);
//Alle Dateien mit einem bestimmten Namen ausfiltern und in $result zurückgeben
$result = array();
foreach($items as $item){
    if($item['name'] == $search){
        $result[] = $item['path'];   
    }    
}
//Ausgabe:
var_dump($result);
 
 
/**
 * Rekursive Funktion um alle Dateien eines Verzeichnises zu katalogisieren
 * @param String    $dir zu durchsuchendes Verzeichniss
 * @return Array<Array<String>> 
 * @example Return-Value: array('name'=>'test.txt', 'path'=>'C:temp/test.txt')
 */
function getDirContent($dir){
    $items = array();
    if (is_dir($dir)) {
        foreach(scandir($dir) as $file){
            $path = createPath($dir, $file);
            if(is_dir($path) && $file!='.' && $file!='..'){
                $items = array_merge($items, getDirContent($path));
            }elseif(is_file($path)){
                $items[] = array('name' => $file, 'path' => $path);
            } 
        }            
    }
    return $items;
}
 
/**
 * Aus meiner Funktionsbibliothek
 * PHP]createPath: http://wiki.yaslaw.info/wikka/PhpCreatePath
 *
 * mpl           by ERB software
 * @author       stefan.erb(at)erb-software.com
 */
 
/**
 * @param   Strings   zusammenzusetzende Elemente
 * @return  String
 * @example
 *      $path = createPath("C:\\temp\\", "test.txt");
 *      $path = createPath("C:", "temp", "test.txt")
 */
function createPath(){
    $parts = func_get_args();
    array_walk($parts, 'removeLastSeparator');
    return str_replace("\\", "/", implode("/", $parts));    
}
 
/**
 * Hilfsfunktion um die nachgestelltenn / und \ von Pfadelementen zu entfernen
 * Wird von createPath() verwendet
 * @param $part
 */
function removeLastSeparator(&$part){
    $part = preg_replace('/[\/\\\]*$/', '', $part);
}
 
?>

Code:
array(0) { }

Das ist die Ausgabe, die ich bekomme. Ich muss mich wieder in Arrays einlesen, ist schon eine Zeit her, wo ich selber was gecodet hab, seitdem immer CMS und Plugins verwendet.

Vielleicht sollte ich auch noch erwähnen, das ich mit einem 3 Tabellen Layoutarbeite mit einem index.php?p=search link.
 
Zuletzt bearbeitet:
Zurück