# Verzeichnis auslesen und in MySQL-Datenbank schreiben



## ihop (14. April 2006)

hi
folgendes problem:
ich habe da ein script (selber geschrieben) das den ordner modules auslesen soll und alle ordner die nicht in der DB stehen ein gefügt werden. nur irgendwie macht er das nicht er schreibt keine fehlermeldung aber er addet auch nicht die ordner rein.

modules/fotos
modules/dvd

in der db steht nur foto

das script

```
mysql_connect ($DatabaseHost, $DatabaseUser, $DatabasePassword) or die ("Keine Verbindung zum Server");	
mysql_select_db ($Database) or die ("Keine Verbindung zur Datenbank");
$ergebnis = mysql_query ("SELECT * FROM navigation") or die ("Tabelle nicht gefunden");
if ($handle = opendir('modules')) {
  while (false !== ($file = readdir($handle))) {
    if ($file != "." && $file != ".." && $file != "index.html") {
      while ($zeile = mysql_fetch_array($ergebnis)) {      
        if($file!=$zeile["ordnername"]){    
          mysql_query("INSERT INTO navigation VALUES('','$file','','0','all')") or die(mysql_error());  
        }        
      }                 
    }
  }
  closedir($handle);
}
mysql_close ();
```


----------



## forsterm (14. April 2006)

Hallo,
kann es sein, dass die erste Spalte deiner Tabelle auf auto_increment gesetzt ist?
Wenn ja dann muss du das nicht extra angeben also könnte dein Script so aussehen:

```
mysql_connect ($DatabaseHost, $DatabaseUser, $DatabasePassword) or die ("Keine Verbindung zum Server");     
mysql_select_db ($Database) or die ("Keine Verbindung zur Datenbank"); 
$ergebnis = mysql_query ("SELECT * FROM navigation") or die ("Tabelle nicht gefunden"); 
if ($handle = opendir('modules')) { 
  while (false !== ($file = readdir($handle))) { 
    if ($file != "." && $file != ".." && $file != "index.html") { 
      while ($zeile = mysql_fetch_array($ergebnis)) {       
        if($file!=$zeile["ordnername"]){     
          mysql_query("INSERT INTO navigation VALUES('$file','','0','all')") or die(mysql_error());   
        }         
      }                  
    } 
  } 
  closedir($handle); 
} 
mysql_close ();
```


----------



## Gumbo (14. April 2006)

Probier mal Folgendes:
	
	
	



```
<?php

	mysql_connect($DatabaseHost, $DatabaseUser, $DatabasePassword)
		or die('Verbindung mit Datenbankserver schlug fehl!');
	mysql_select_db($Database)
		or die('Auswahl der Datenbank schlug fehl!');

	// Sammeln der Datensätze
	$records = array();
	$query = '
		SELECT
		        `ordnername`
		  FROM
		        `navigation`
		';
	$result = mysql_query($query)
		or die('Datenbankabfrage schlug fehl!');
	while( $records[] = mysql_result($result, 0) ) {
		continue;
	}

	// Sammeln der Dateien
	$files = array();
	if( $handle = opendir('modules') ) {
		while( false !== ($file = readdir($handle)) ) {
			if( $file == '.' || $file == '..' || $file == 'index.html' ) {
				continue;
			}
			$files[] = $file;
		}
		closedir($handle);
	}

	// Ausgleich der Differenz beider Mengen
	$diff = array_diff($records, $files);
	foreach( $diff as $file ) {
		$query = '
			INSERT INTO
			        `navigation`
			  VALUES(
			        NULL,
			        "'.mysql_real_escape_string($file).'",
			        "",
			        0,
			        "all"
			  )
			';
		mysql_query($query)
			or die(mysql_error());
	}

	mysql_close();

?>
```
Übrigens möchte ich dir noch die INSERT INTO-Anweisung mit SET-Klausel nahelegen, da bei dieser Anweisung die Angabe nur einzelner Spaltenwerte möglich ist.


----------



## ihop (14. April 2006)

bringt mir den fehler:
Warning: mysql_real_escape_string() expects parameter 1 to be string, array given in /srv/www/httpd/phost/d/com/pytalhost/dvddb/web/mainfile.php on line 45

das wäre die zeile:
"'.mysql_real_escape_string($file).'",


----------



## Gumbo (14. April 2006)

Mein Fehler. Ändere mal Folgendes:
	
	
	



```
while( $records[] = mysql_result($result, 0) ) {
	continue;
}
```
Meinen vorherigen Beitrag habe ich entsprechend korrigiert.


----------



## ihop (14. April 2006)

das habe ich gemacht dann kommt:
Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 71 bytes) in /srv/www/httpd/phost/d/com/pytalhost/dvddb/web/mainfile.php on line 21

das ganze schaut jetzt so aus

```
mysql_connect($DatabaseHost, $DatabaseUser, $DatabasePassword)
        or die('Verbindung mit Datenbankserver schlug fehl!');
    mysql_select_db($Database)
        or die('Auswahl der Datenbank schlug fehl!');

    // Sammeln der Datensätze
    $records = array();
    $query = '
        SELECT
                `ordnername`
          FROM
                `navigation`
        ';
    $result = mysql_query($query)
        or die('Datenbankabfrage schlug fehl!');
    while( $records[] = mysql_result($result, 0) ) {
        continue;
    } 

    // Sammeln der Dateien
    $files = array();
    if( $handle = opendir('modules') ) {
        while( false !== ($file = readdir($handle)) ) {
            if( $file == '.' || $file == '..' || $file == 'index.html' ) {
                continue;
            }
            $files[] = $file;
        }
        closedir($handle);
    }
```


----------



## Dr Dau (14. April 2006)

Hallo!

Der Dir zugewiesene Arbeitsspeicher langt nicht aus.
phpinfo() müsste Dir unter memory_limit 16M anzeigen.
Dein Script benötigt aber mehr wie 16M.
Wenn Du also kein Zugriff auf die php.ini hast, wirst Du wohl wahrscheinlich die Verzeichnisinhalte aufteilen müssen.
Aber vieleicht fällt Gumbo da ja noch ein Trick ein.

Gruss Dr Dau


----------



## Gumbo (14. April 2006)

Ich glaube kaum, dass die Indexierung eines Verzeichnisses so viele Ressourcen schluckt. Und auch der Rest wird sicherlich nicht so viel benötigen. Ist das denn das Einzige, was das Skript macht?


----------



## ihop (19. April 2006)

nein das is nur das script da wird nur die config.php includet mehr nicht


----------

