Textdatei zeilenweise in Datenbank importieren

d1ng0d0gt0r

Mitglied
Hi,

Ich benutze folgendes Script um eine Komplette Datei zeilenweise in meine Datenbank zu importieren.

Hierbei soll jede Zeile in einen md5Hash umgewandelt werden und dann erst importiert werden.

Code:
$datei = file("http://localhost/test.txt");
		foreach($datei AS $liste)
   		{
		$hash = md5($liste);
	            mysql_query(INSERT INTO xxx (md5) VALUES ($hash);
   		}

Problem:
Wenn ich in der ersten Zeile meiner Datei Hallo stehen hab, dann wird auch hallo importiert mit dem md5-Hash. Aber der md5-Hash passt nicht zu Hallo! Also wenn ich Mit einem md5 Generator von PHP-Einfach.de von Hallo einen Hash erstellen lasse, dann ist dieser völlig anders!

md5Hash von hallo wie er ausehen müsste: 598d4c200461b81522a3328565c25f7c
nach dem importieren in die datenbank ist der hash folgender: 79842a240480aecbacd91ea94dc7011d

Vielleicht hat jemand einen Fuktionierenden Code mit dem ich jede Zeile in einer Datei in einen md5Hash umwandle und dann in meine Datenbank importieren kann!
M.f.G
 
Zuletzt bearbeitet:

birnkammer

Erfahrenes Mitglied
Versuch mal
PHP:
$datei = file("http://localhost/test.txt");
        foreach($datei AS $liste) {
        $hash = md5(trim($liste));
                mysql_query(INSERT INTO xxx (md5) VALUES ($hash);
           }
Mit trim() werden Leerzeichen entfernt, da die auch von md5() berücksichtigt werden.

Viele Grüße
 

Gumbo

Erfahrenes Mitglied
Bei der file()-Funktion bleiben die Zeilenumbruchzeichen erhalten. Diese müsstest du entfernen, damit ein „hallo“ mit einem „hallo“ aus einer Datei übereinstimmt. Dazu kannst du entweder die trim()-Funktion verwenden, die aber auch alle anderen Leerraum-Zeichen am Anfang und Ende einer Zeichenkette entfernt, oder die str_replace()-Funktion, um nur genau die Zeilenumbruchzeichen zu entfernen.
 

d1ng0d0gt0r

Mitglied
Gibt es ne möglichkeit eine 53MB große datei mit der methode zu importieren?
Weil er nach 60 Sekunden immer abbricht und manchmal irgendwas mit memory, genau weisichs jetzt au net, anzeigt.

Oder gibts ne andere Möglichkeit?
 

d1ng0d0gt0r

Mitglied
Maximum execution time of 60 seconds exceeded in xxxxxxxxx

^^ schonwieder der gleiche Fehler.
Kann hier vielleicht jemand mal einen Beispielcode posten ich bin am verzweifeln!
 
Zuletzt bearbeitet:

Gumbo

Erfahrenes Mitglied
Wahrscheinlich ist die Datenbank der Flaschenhals. Folgendes sorgt dafür, dass maximal 1000 Datensätze gleichzeitig eingefügt werden.
PHP:
$maxRecords = 1000;
$queryPattern = 'INSERT INTO xxx (`md5`) VALUES ';
$values = array();

$handle = fopen($path, 'r');
while( !feof($handle) && $i++ ) {
	$array[] = md5(trim(fgets($handle)));
	if( $i >= $chunkSize ) {
		$query = $queryPattern . '("'.implode('"),("', $array).'")';
		mysql_query($query);
		$array = array();
		$i = 0;
	}
}
 

d1ng0d0gt0r

Mitglied
Ich danke dir! Der Code t Prima! Wieder was dazu gelernt!

Nochne kleine Frage: Gibts in MySQL ne Möglichkeit, das der Eintrag nur dann eingefügt wird wenn er noch nicht existiert? Am bessten du zeigst es mir an dem von dir gepostetem Code!