PHP/MYSQL-Problem: *.zip rekursiv auslesen, Ausgabe in .xml speichern und an db sende

dochamburg

Mitglied
Salvete!

Leider muss ich mich wieder an Euch wenden. Komme einfach nicht weiter.

Es geht um folgendes. Es sollen verschiedene *.zip-Dateien mit Content (Dateien, Unterordner inkl. weiteren Dateien) per PHP rekursiv ausgelesen werden, diese Inhalte in eine MySQL-Datenbank übergeben werden, zusätzlich die *.zip-Inhaltsinformationen in eine *.xml-Datei gespeichert werden, welche in diesem ausgelesenen Verzeichnis gespeichert werden soll (also wahrscheinlich vorher entpacken, auslesen und an Datenbank senden, *.xml-Datei generieren, im Verzeichnis speichern und erneut zippen).

Ich weiss ist überaus kompliziert. Wahrscheinlich eine Nummer zu hoch für mich aber ich möchte es trotzdem versuchen.

Soweit habe ich es bis jetzt geschafft:

PHP:
<?php
$path = "./000441/";//Pfadangabe des Ordners
$handle = opendir ($path);//Oeffnen des Ordners
$xml = '<?xml version="1.0" encoding="UTF-8" ?>'."\n";//XML-Kopf
$xml .= '<files>'."\n";//XML-Gliederung
while($file = readdir($handle)) {
 if ($file != "." && $file != "..") {
  $exploded = explode(".",$file);//Trennen nach "."
$xml .= '<filename="'.$exploded[0].'" file="'.$path.$file.'" />'."\n";
 }
}
$xml .= '</end>';//beenden der XMl-Gliederung
file_put_contents('./000441/ordnerinhalt.xml', $xml);
//nun das ganze nochmal in eine textdatei
$path = "./000441/";//Pfadangabe des Ordners
$handle = opendir ($path);//Oeffnen des Ordners
while($file = readdir($handle)) {
 if ($file != "." && $file != "..") {
  $exploded = explode(".",$file);//Trennen nach "."
		//datenbankeintrag
		require("db_connect.php");
		$sql = "INSERT INTO `FILES` (`zip441`) VALUES ('".$file."')";
      mysql_query($sql) or die (mysql_error());

 }
}
require("db_disconnect.php");
?>

Funktioniert auch ganz ordentlich. Allerdings erfuhr ich jetzt, dass es gezipte Ordner MIT Unterordnern sind. nun funktioniert es leider nicht mehr. die Unterordner werden nicht ausgelesen.

Für den reinen rekursiven Auslesevorgang habe ich das gefunden:

PHP:
<?php
function ordnerinhalt($ordner='./000461/')

{

        $content = "";
        $handle = opendir($ordner);
        while ($file = readdir ($handle)) {
                if($file{0} != '.') { //Versteckte Dateien nicht anzeigen
                        if(is_dir($ordner.'/'.$file)) {
                                $folderArray[] = $file;
                        } else {
                                $fileArray[] = $file;
                        }
                }
        }
        closedir($handle);
        //Erst die Ordner ausgeben
        if(isset($folderArray)) {
                asort($folderArray);
                foreach($folderArray as $row) {
                        $content .= '<b>'.$row.'</b><br />';
                        $content .= '<div style="padding-left:10px;color:#afafaf" />'; //Unterordner nach Rechts einruecken
                        $content .= ordnerinhalt($ordner.'/'.$row); //rekursive Funktion
                        $content .= '</div>';
                }
        }
        //Dann die Dateien ausgeben
        if(isset($fileArray)) {
                asort($fileArray);
                foreach($fileArray as $row) {
                        $content .= '<a href="'.$ordner.'/'.$row.'">'.$row.'</a><br />'; //Dateien verlinken
                }
        }
        return $content;
}
echo ordnerinhalt();
?>

Funktioniert für sich auch fein. Bekomme aber den die Speicherung in die *.xml-Datei und den Übertrag in die Datenbank nicht eingebaut.

Für die Erstellung der Datenbank nutze ich folgendes:

Code:
# ====================================================
 # Skript zum Anlegen der Beispieldatenbank für MySQL
 # Getestet mit MySQL 4.1 und MySQL 5.1
 # ====================================================
 # Anmelden am Datenbanksystem
 # Neue Datenbank anlegen >create database zip;
 # Neuangelegte Datenbank nutzen >use zip
 # Skript starten >source skriptname.sql
 # ====================================================
 
 CREATE TABLE zip441
        (FI_ID INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
        FI_ORDNER VARCHAR(50) NOT NULL,
        FI_DATEI VARCHAR(50) NOT NULL
        );
       
 CREATE TABLE zip461
        (FI_ID INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
        FI_ORDNER VARCHAR(50) NOT NULL,
        FI_DATEI VARCHAR(50) NOT NULL
        );
  
 # und so weiter...

Bin für jede Hilfe dankbar!


dohamburg
 
Zuletzt bearbeitet:
Zurück