-
Hallo liebe Tutorianer
Habe ein PHP / MySQL Problem; Ich mache Gerade einen Downloadmanager für meine Webseite, dazu möchte Ich so viel wie möglich automatisieren.
Ich verzweifle langsam aber sicher beim kleinen Generator Script, welches dazu Dient die Files im Ordner /www/downloads/ liegen, mit einer MD5 (md5_file) Summe zu versehen und in die Datenbanktabelle (db_filemanager --> tbl_files zu schreiben) Ziel: Wenn neue files in der Ordner geladen werden soll das Script nur die neuen Files, anhand der MD5 Summe in die Tabelle schreiben. Anderenfalls soll dieser die Files auflisten welche er schon in der Datenbank eingetragen hat...
Nun mein Problem: Ich habe Total 48 Dateien in dem Ordner "Downloads" das Script gibt aber nur 25 Dateien eine MD5 Summe. Wiso macht dieses Script das? Dann hat es bei dem Eintrag in die Datenbank noch einen Schönheitsfehler... er generiert pro durchlauf zwei Tabelleneinträge mit dem wert . & .. Wie krieg Ich das noch weg?
Es folgt nun das generator.php Script:
Im Anhang ist noch der erstellte Datenbankeintrag...PHP-Code:<?php
//Datenbank-Login
$mysqlhost="localhost"; // MySQL-Host angeben
$mysqluser="****"; // MySQL-User angeben
$mysqlpwd="****"; // Passwort angeben
$mysqldb="db_filemanager"; // Gewuenschte Datenbank
//Mit Datenbank Verbinden
$connection=mysql_connect($mysqlhost, $mysqluser, $mysqlpwd) or die ("Verbindungsversuch fehlgeschlagen");
//Datenbank auswählen
mysql_select_db($mysqldb, $connection) or die("Konnte die Datenbank nicht waehlen.");
//Variabel für das Auslesen aller Files"
$sql_files = "SELECT * FROM tbl_files";
//Öffnet eine persistente Verbindung mit der MySQL Datenbank im zusamenhang mit Browser
$files_query = mysql_query($sql_files) or die("Anfrage nicht erfolgreich");
?>
<?php
$fp=opendir('.'); // Öffnet das aktuelle Verzeichnis /. In diesem Fall /www/downloads/
while(false !== ($datei = readdir($fp))) { // Mach so lang die runden bis das Verzeichnis durchgelesen ist!
$chksum = md5_file($datei); // Generierung der MD Summen
$status = ('N'); // Statusvergabe --> N für New und Unbearbeitet
// Nun sollte die DB geprüft werden ob Sie die MD Summe bereits enthaltet...
$result = mysql_query("SELECT * FROM `tbl_files` WHERE `software_md5sum` = '".$chksum."'");
$check = mysql_fetch_row($result);
// ...falls ja, fertig & Echo ausgabe!
if($check != '') die('Eintrag bereits vorhanden');
// ...anderenfalls INSERT der Daten in die Tabelle der DB
else mysql_query("INSERT INTO `tbl_files` (`software_filename` , `software_status` , `software_md5sum`) VALUES ('$datei' , '$status' , '$chksum')") or die(mysql_error());
}
closedir($fp); // Schliesst das Verzeichnis
?>
Ich bedanke mich bereits im Vorraus für die wertvolle Hilfe.
Gruss PatrickGeändert von zkmlch (15.09.11 um 11:07 Uhr)
-
item: ich musste zuerst mal dein Code formatieren um zu sehen wo die Schleife beginnen und Enden
item: Um zu prüfen ob die Datei bereits drin ist, solltest du besser mit mysql_num_rows() orüfen
PHP-Code:if(mysql_num_rows($result) > 0) die ('Eintrag bereits vorhanden');
---------------------------------------------------------------------------------------------------
item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
item: Tutorial: [PHP][MySQL] Debug Queries
item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben
-
Danke für deine Antwort Yaslaw
Leider bekomme Ich immer noch das selbe Resultat...
Zur Vervollständigung hier nochmals das Script mit den Anpassungen... + Optisch Formatiert
Gruss PatrickPHP-Code:<?php
$mysqlhost="localhost";
$mysqluser="****";
$mysqlpwd="****";
$mysqldb="db_filemanager";
$connection=mysql_connect($mysqlhost, $mysqluser, $mysqlpwd) or die ("Verbindungsversuch fehlgeschlagen");
mysql_select_db($mysqldb, $connection) or die("Konnte die Datenbank nicht waehlen.");
$sql_files = "SELECT * FROM tbl_files";
$files_query = mysql_query($sql_files) or die("Anfrage nicht erfolgreich");
?>
<?php
$fp=opendir('.');
while(false !== ($datei = readdir($fp)))
{
$chksum = md5_file($datei);
$status = ('N');
$result = mysql_query("SELECT * FROM `tbl_files` WHERE `software_md5sum` = '".$chksum."'");
$check = mysql_fetch_row($result);
if(mysql_num_rows($result) > 0) die ('Eintrag bereits vorhanden');
else mysql_query("INSERT INTO `tbl_files` (`software_filename` , `software_status` , `software_md5sum`) VALUES ('$datei' , '$status' , '$chksum')") or die(mysql_error());
}
closedir($fp);
?>Geändert von zkmlch (15.09.11 um 11:58 Uhr)
-
15.09.11 12:10 #4SE Tutorials.de Gastzugang
Ich würde das auf DB-Ebene lösen : einfach die Tabelle mit den Hashes als UNIQUE makieren ... so bald du nun versuchst den selben Wert 2 mal einzutragen bekommst du einen ERROR *den du abfangen musst* von der DB das es nicht möglich ist da der Hash bereits vorhanden ist.
Es ist einfach auf einen ERROR zu reagieren als selbst umständlich in der DB zu suchen ...
-
item: Da du beim check auf einen 'die' gehst, wird das Script neim ersten doppelten abgebrochen
item: md5_file() liefert für 2 Files mit verschiedenen Namen und gleichem Inhalt denselben Wert.
Im folgenden Scriptausschnitt werden beide Probleme behoben
PHP-Code:$dh=opendir($path);
while(($datei = readdir($dh)) !== false){
if($datei != '.' && $datei != '..' && !is_dir($datei)){
$chksum = md5_file(createPath($path,$datei));
$status = ('N');
$sql = "SELECT *
FROM `tbl_files`
WHERE `software_md5sum` = '{$chksum}'
AND `software_filename` = '{$datei}';";
$result = mysql_query($sql);
if(mysql_num_rows($result) > 0){
echo 'Eintrag bereits vorhanden';
}else{
$sql = "INSERT INTO `tbl_files` (`software_filename` , `software_status` , `software_md5sum`)
VALUES ('{$datei}' , '{$status}' , '{$chksum}{$file}';)";
$result = mysql_query($sql) or die(mysql_error());
}
}
}
closedir($fp);
---------------------------------------------------------------------------------------------------
item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
item: Tutorial: [PHP][MySQL] Debug Queries
item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben
-
-
-
15.09.11 13:02 #8SE Tutorials.de Gastzugang
Ähm .. also man kann UNIQUE nun nicht auf ALLE Datentypen anwenden *z.B. NICHT auf BLOB* ... aber auf VARCHAR geht es ... das weis ich weil ich es in zwei meiner Tabellen selbst drin habe. Zumindest unter MySQL ist das möglich ... ansonsten versuch es mal mit PRIMARY_KEY ... erfüllt die selbe Aufgabe und meldet auch Fehler wenn du versuchst einen Wert doppelt einzutragen.
-
Hallo Yaslaw & SPiKEe
zu Yaslaw's Lösung:
Habe deinen Code 1:1 übernommen und unterhalb des DB-Connect eingefügt. Ergebnis:
Code :1 2 3 4 5
Notice: Undefined variable: path in /var/www/downloads/generator.php on line 33 Warning: readdir() expects parameter 1 to be resource, boolean given in /var/www/downloads/generator.php on line 34 Fatal error: Call to undefined function createPath() in /var/www/downloads/generator.php on line 36
Danach habe Ich die Variabel
vor Line 33 eingefügt. Ergebnis:PHP-Code:$path='.';
Code :1
Fatal error: Call to undefined function createPath() in /var/www/downloads/generator.php on line 36
Hab mir sogar noch deinen Wiki Eintrag http://wiki.yaslaw.info/wikka/PhpCreatePath reingezogen, aber trotzdem nicht schlüssig geworden.
zu SPiKEe's Lösung:
Bin noch dran den Befehl zu finden
Resp. Im MySQL Administrator den Feldtyp zu definieren. Ich finde zwar die Lösung von Yaslaw eleganter und allenfalls besser um Erweiterungen zu definieren. Aber falls Ich dies nicht fertig bringen sollte bleibt mir keine andere Wahl...
So long, Gruss PatrickGeändert von zkmlch (15.09.11 um 13:59 Uhr) Grund: Ergänzungen
-
oh, ja das mit dem Pfad ist aus meiner Testumgebung.
Kannste weglassen und so machen wie du es am Anfang hattest.
Es geht eigentlich nur um das erste SELECT und den geänderten Check-if().
@SPiKe
Jepp, kann an so machen. Aber nicht auf das einzelne Feld, da bei gleichem Dateiinhalt (zb. leere Datei) der md5-Wert derselbe ist.
Ich würde es auch über Error-Handling lösen. Wenn man da aber keine Erfahrung hat, sollte man zuerst die anderen Probleme lösen.
Im Gegensatz zu Java geht PHP gut ohne Errorhandling zum Programmieren (leider).---------------------------------------------------------------------------------------------------
item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
item: Tutorial: [PHP][MySQL] Debug Queries
item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben
-
Meinst du so:
Dann würde ja die zeile wegfallen wo die MD5 Summe für die Files generiert wird...PHP-Code:$dh=opendir($path);
while(($datei = readdir($dh)) !== false){
if($datei != '.' && $datei != '..' && !is_dir($datei)){
// Hier war vorher die fehlerhafte Function aus der Testumgebung
$status = ('N');
$sql = "SELECT *
FROM `tbl_files`
WHERE `software_md5sum` = '{$chksum}'
AND `software_filename` = '{$datei}';";
$result = mysql_query($sql);
if(mysql_num_rows($result) > 0){
echo 'Eintrag bereits vorhanden';
}else{
$sql = "INSERT INTO `tbl_files` (`software_filename` , `software_status` , `software_md5sum`)
VALUES ('{$datei}' , '{$status}' , '{$chksum}{$file}';)";
$result = mysql_query($sql) or die(mysql_error());
}
}
}
closedir($fp);

*Ganz lieb Fragend* Könntest du mir den Code nochmals Korrigieren?
Gruss aus Uster, PatrickGeändert von zkmlch (15.09.11 um 14:23 Uhr)
-
Habe jetzt den Code nach meiner Meinung nach korrekt angepasst:
Jedoch gibt er mir noch einen einzigen MySQL Syntax fehler aus:PHP-Code:<?php
$path = '.';
$dh=opendir($path);
while(($datei = readdir($dh)) !== false){
if($datei != '.' && $datei != '..' && !is_dir($datei)){
$chksum = md5_file($path,$datei);
$status = ('N');
$sql = "SELECT *
FROM `tbl_files`
WHERE `software_md5sum` = '{$chksum}'
AND `software_filename` = '{$datei}';";
$result = mysql_query($sql);
if(mysql_num_rows($result) > 0){
echo 'Eintrag bereits vorhanden';
}else{
$sql = "INSERT INTO `tbl_files` (`software_filename` , `software_status` , `software_md5sum`)
VALUES ('{$datei}' , '{$status}' , '{$chksum}{$datei}';)";
$result = mysql_query($sql) or die(mysql_error());
}
}
}
closedir($fp);
?>
Code :1
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ';)' at line 1
Warscheindlich lags an dem ";" das hier war:
Nun werden die fehler immer mehr.... Das Script schreibt nun in Die DB (siehe Anhang) aber was es dort schreibt ist ja die Zumutung... Die MD5 Summe wird schon gar nicht mehr generiert und doppelte Einträge werden ebenfalls Ignoriert.... *verzweifel*PHP-Code:$sql = "INSERT INTO `tbl_files` (`software_filename` , `software_status` , `software_md5sum`)
VALUES ('{$datei}' , '{$status}' , '{$chksum}{$datei}';)";
$result = mysql_query($sql) or die(mysql_error());
Gruss PatrickGeändert von zkmlch (15.09.11 um 14:43 Uhr)
-
IT WORKS****** Hurra :-D Zur Vervollständigung nochmals das ganze Funktionsscript:
Jetzt hätte Ich noch eine kleine Frage; Bei dem Check mache ich ja 2 Echos; das IF und das ELSE echo... Nun ich habe ein bisschen probiert aber es nicht geschaft in den Text noch eine Variabel einzubauen...PHP-Code:<?php // *** DB-CONNECT *** //
$mysqlhost="localhost"; // MySQL-Host angeben
$mysqluser="****"; // MySQL-User angeben
$mysqlpwd="****"; // Passwort angeben
$mysqldb="db_filemanager"; // Gewuenschte Datenbank
//Mit Datenbank Verbinden
$connection=mysql_connect($mysqlhost, $mysqluser, $mysqlpwd) or die ("Verbindungsversuch fehlgeschlagen");
//Datenbank auswählen
mysql_select_db($mysqldb, $connection) or die("Konnte die Datenbank nicht waehlen.");
//Variabel für das Auslesen aller Files"
$sql_files = "SELECT * FROM tbl_files";
//Öffnet eine persistente Verbindung mit der MySQL Datenbank
$files_query = mysql_query($sql_files) or die("Anfrage nicht erfolgreich");
?>
<?php
$dh=opendir('.');
while(($datei = readdir($dh)) !== false){
if($datei != '.' && $datei != '..' && !is_dir($datei)){
$chksum = md5_file($datei);
$status = ('N');
$sql = "SELECT *
FROM `tbl_files`
WHERE `software_md5sum` = '{$chksum}'
AND `software_filename` = '{$datei}';";
$result = mysql_query($sql);
if(mysql_num_rows($result) > 0){
echo '<pre>Eintrag bereits vorhanden';
}else{
$sql = "INSERT INTO `tbl_files` (`software_filename` , `software_status` , `software_md5sum`)
VALUES ('{$datei}' , '{$status}' , '{$chksum}')";
$result = mysql_query($sql) or die(mysql_error());
echo '<pre> Neuer Eintrag gefunden';
}
}
}
closedir($fp);
?>
Folgendermassen sollte die Ausgabe aussehen:
if
Eintrag "filezilla.exe" ist bereits vorhanden!
else
Neuer Eintrag "mailwasher.exe" wurde hinzugefügt!
Die in Anführungszeichen stehenden Files liegen eigentlich unter der Variabel $datei jedoch scheint dies nicht zu funktionieren...
Gruss PatrickGeändert von zkmlch (15.09.11 um 15:13 Uhr) Grund: Anpassungen
-
Hi Patrick,
du solltest es so mach wie Spikee sagt. Setzt das MD5 Feld auf Unique und arbeite mit
Code sql:1
REPLACE INTO `FooBar` (`foo`,`bar`) VALUES (`foo`,`bar`);
Und SQL Abfragen in einer Schleife zu verarbeiten ist das schlechteste was du machen kannst, es seiden du willst deinen SQL Server töten.
Gruß Napofis
-
Hallo Napofis
Ich muss bemerken das Ich nur ein sehr geringes Repertoir an PHP Kenntnissen besitze da mir die logik teilweise ziemlich unklar ist, vorallem dann wen es Vergleichoperatoren und deres gleichen geht.
Das mit dem Unique Eintrag habe Ich geprüft und Funktioniert auch jedoch habe Ich danach keinen Peil wie Ich die Fehlermeldungen managen soll respektive die weitere Verarbeitung der Files vornehmen soll.
Anbetracht dessen habe Ich mich nochmals meinem bestehenden Code gewidmed und der läuft jetzt Einwandfrei.
Nun habe Ich noch eine Relevante Anforderungen an mein Script bei welchen mir aber der MD5_file string einen Strich durch die Rechnung macht.PHP-Code:<?php
$dh=opendir('.');
while(($datei = readdir($dh)) !== false){
if($datei != '.' && $datei != '..' && !is_dir($datei)){
$chksum = md5_file($datei);
$status = ('N');
$sql = "SELECT *
FROM `tbl_files`
WHERE `software_md5sum` = '{$chksum}'
AND `software_filename` = '{$datei}';";
$result = mysql_query($sql);
if(mysql_num_rows($result) > 0){
echo "<pre>Eintrag $datei bereits vorhanden";
}else{
$sql = "INSERT INTO `tbl_files` (`software_filename` , `software_status` , `software_md5sum`)
VALUES ('{$datei}' , '{$status}' , '{$chksum}')";
$result = mysql_query($sql) or die(mysql_error());
echo "<pre>Neuer Eintrag<b> $datei </b>gefunden";
}
}
}
closedir($fp);
?>
Das script ist nun so gelöst das Allle Files in einem Ordner liegen. Jedoch wäre das Ziel gewesen das Ich eine saubere Ordnerstruktur machen kann so dass Ich im Ordner /www/ das Script haben kann, im Ordner /www/downloads/ würde die Ordnerstruktur beginnen mit Unterordnern wie /www/downloads/browser oder /www/downloads/ftpclients in diesen unterordnern wären dan die einzelnen files nach kategorien aufgeteilt geordnet. Nun hatte Ich bei meinen Versüchen das Problem das der MD5 mir auch aus den Ordnern einen String generiert und die eigentlichen Dateien gar nicht berechnet sondern nur einen Hash aus dem Pfad macht.
Zweites Problemchen:
Ich möchte Files mit der Endung .php von der Aktion ausschliessen, wie tuh Ich das Korrekt? Ich hätte das folgendermassen gelöst:
Leider Schreibt er mir noch immer die Daten in die Tabelle und erzeugt einen MD5...PHP-Code:if($datei != '.php' && $datei != '.' && $datei != '..' && !is_dir($datei)){
Kann mir da jemand Helfen oder gleich Ergänzungen am Script vornehmen?
Danke im Vorraus, PatrickGeändert von zkmlch (15.09.11 um 17:08 Uhr)
Ähnliche Themen
-
Installshield: Dateien nicht mehr installieren, vorhandene jedoch nicht entfernen
Von DrMueller im Forum Microsoft WindowsAntworten: 1Letzter Beitrag: 21.11.10, 23:56 -
TreeView Unterknoten an bereits vorhandene Knoten hinzufügen
Von kiff124 im Forum .NET Windows FormsAntworten: 1Letzter Beitrag: 21.06.09, 14:46 -
bereits vorhandene, vereinigte schrift verbiegen.
Von arkei im Forum PhotoshopAntworten: 2Letzter Beitrag: 24.09.07, 18:24 -
Prüfung auf bereits vorhandene Ordner
Von Andrej T im Forum Visual Basic 6.0Antworten: 1Letzter Beitrag: 20.11.06, 17:46 -
CMS für bereits vorhandene htmls
Von nahuel im Forum Content Management Systeme (CMS)Antworten: 8Letzter Beitrag: 29.11.04, 02:11



8Danke

Zitieren


Login





