Bereits vorhandene MD5 Summen nicht mehr in die DB schreiben

Meinst du so:

PHP:
$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);

Dann würde ja die zeile wegfallen wo die MD5 Summe für die Files generiert wird... :confused:

*Ganz lieb Fragend* Könntest du mir den Code nochmals Korrigieren?

Gruss aus Uster, Patrick
 
Zuletzt bearbeitet:
Habe jetzt den Code nach meiner Meinung nach korrekt angepasst:

PHP:
<?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); 

?>

Jedoch gibt er mir noch einen einzigen MySQL Syntax fehler aus:
Code:
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:

PHP:
$sql = "INSERT INTO `tbl_files` (`software_filename` , `software_status` , `software_md5sum`) 
VALUES ('{$datei}' , '{$status}' , '{$chksum}{$datei}';)";
 $result = mysql_query($sql) or die(mysql_error());

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*

Gruss Patrick
 

Anhänge

  • Bildschirmfoto4.png
    Bildschirmfoto4.png
    17,4 KB · Aufrufe: 13
Zuletzt bearbeitet:
IT WORKS****** Hurra :-D Zur Vervollständigung nochmals das ganze Funktionsscript:

PHP:
<?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); 

?>

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...

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... :eek:

Gruss Patrick
 
Zuletzt bearbeitet:
Hi Patrick,

du solltest es so mach wie Spikee sagt. Setzt das MD5 Feld auf Unique und arbeite mit
SQL:
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. :D

PHP:
<?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); 

?>
Nun habe Ich noch eine Relevante Anforderungen an mein Script bei welchen mir aber der MD5_file string einen Strich durch die Rechnung macht.

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:

PHP:
if($datei != '.php' && $datei != '.' && $datei != '..' && !is_dir($datei)){

Leider Schreibt er mir noch immer die Daten in die Tabelle und erzeugt einen MD5...

Kann mir da jemand Helfen oder gleich Ergänzungen am Script vornehmen?

Danke im Vorraus, Patrick
 
Zuletzt bearbeitet:
OK ich hab dir mal eine Kleinigkeit vorbereitet.
So kannst du alles auf 2 Abfragen reduzieren.

__DIR__ ist eine Konstante für das aktuelle Verzeichnis, das kannst du dann selber austauschen. Wenn du das mit den mit den User Accounts machen willst.

PHP:
class ScanDownloads {
	private $_files;
	private $_cwd;
	private $_ds = DIRECTORY_SEPARATOR;
	
	public function __construct($dir){
		if (!is_dir($dir)) return;
		$this->_cwd = $dir;
		$this->_scandir();
		$this->_saveResoult();
	}
	private function _scandir(){
		$files = scandir($this->_cwd);
		foreach ($files as $file)
			if(is_file($this->_cwd.$this->_ds.$file))
				$this->_files[]=array('file'=>$file,'md5'=>md5_file($this->_cwd.$this->_ds.$file));
	}
	private function _saveResoult(){
		$values=(array)null;
		foreach($this->_files as $file)
			$values[]='("'.$file['file'].'","'.$file['md5'].'")';
		mysql_query('
			INSERT INTO `tbl_files` 
				(`software_filename` , `software_md5sum`) 
			VALUES 
				'.implode(',',$values).'
			ON DUPLICATE KEY UPDATE `software_status`="O"');
                
	}
	public function getFiles($onlyNewFiles=false){
		$tmp = mysql_query('
			SELECT `software_filename`,`software_status`,`software_md5sum`
			FROM `tbl_files` '.
			(($onlyNewFiles)? ' WHERE `software_status`="N" ':'').
			'ORDER BY `software_filename` ASC');
		echo mysql_error();
		$return=(array)null;
		while($row=mysql_fetch_object($tmp)) $return[]=$row;
		return $return;
	}
}

// Test 
$scanDownloads = new ScanDownloads(__DIR__);
echo '<pre>';
/**
* lade die  Daten aus der Datenbank
* @param boolean Nur neu hinzugefügte Dateien ausgeben.
*/
print_r($scanDownloads->getFiles(true));
echo '</pre>';
 
Zuletzt bearbeitet:
So habs bald geschafft :-)

Jetzt habe Ich noch zwei drei keinere Optionen an denen Ich das ganze Wochenende verplämpert habe... :rolleyes:

Geblieben ist das Problem
Nun habe Ich noch eine Relevante Anforderungen an mein Script bei welchen mir aber der MD5_file string einen Strich durch die Rechnung macht.

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.

Hier nochmals der Quelltext des Betreffenden Problems...

PHP:
<?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); 

?>

Nun habe Ich weiteres "Problemchen"... Ich habe ein Update Formular welches mir gestattet Datensätze zu Editieren. Nun habe ich gegooglet und :google: half mir NULL... Ich möchte im besagten Formular ein "Oder" Feld machen.

Das heisst: Ich lese aus der Datenbank die bestehenden Kategorien aus und gebe Sie in Form eines Dropdowns aus, nun möchte ich aber neben dem Dropdown eine Oder funktion zur erfassung einer neuen Kategorie einfügen... Leider klappt dies nicht wie es sollte...

Hier der Quelltext des Formulares:

PHP:
<html>
	<body>

	<font face="Century Gothic, URW Gothic L, Verdana, Arial,Helvetica">

<?php

	$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."); 

	$change_id = $_REQUEST['id'];
	$query_files = "SELECT * FROM `tbl_files` WHERE `id` = '$change_id';";
	$files_query = mysql_query($query_files) or die(mysql_error());
	$files = mysql_fetch_assoc($files_query);

	//Variabel für das Auslesen com Systemen"
	$sql_system = "SELECT software_system FROM tbl_files GROUP by software_system;";
	//Öffnet eine persistente Verbindung mit der MySQL Datenbank im zusamenhang mit Browser
	$system_query = mysql_query($sql_system) or die("Anfrage nicht erfolgreich");

	//Variabel für das Auslesen von Sprachen"
	$sql_language = "SELECT software_language FROM tbl_files GROUP by software_language;";
	//Öffnet eine persistente Verbindung mit der MySQL Datenbank im zusamenhang mit Browser
	$language_query = mysql_query($sql_language) or die("Anfrage nicht erfolgreich");

	//Variabel für das Auslesen von Kategorien"
	$sql_category = "SELECT software_category FROM tbl_files GROUP by software_category;";
	//Öffnet eine persistente Verbindung mit der MySQL Datenbank im zusamenhang mit Browser
	$category_query = mysql_query($sql_category) or die("Anfrage nicht erfolgreich")
?>


<h1>Datensatz editieren</h1>
<br>
<table width="450" cellpadding="5">
  <tr>
    <td bgcolor=#D3D3D3><i>Database Information</td>
    <td bgcolor=#FFCC00>Der angezeigte Datensatz Nr.<b><?=$files['id']?></b> kann mit diesem Formular ge&auml;ndert werden.</td>
  </tr>
</table>
<br><br>


<form action="update_info.php" method="post">
<input name="tbl_files[id]" type="hidden" value="<?=$files['id']?>">
<table width="40%"  cellpadding="5">

  <tr>
    	<td bgcolor=#D3D3D3>Softwarename</td>
    	<td><input name="tbl_files[software_name]" type="text" value="<?=$files[software_name]?>" size="50"></td>
    	<tr><td bgcolor=#D3D3D3>Version</td>
    	<td><input name="tbl_files[software_version]" type="text" value="<?=$files[software_version]?>" size="20"></td>
    	<tr><td bgcolor=#D3D3D3>System</td>
    	<td><input name="tbl_files[software_system]" type="text" value="<?=$files[software_system]?>" size="20"></td>
	<tr><td bgcolor=#D3D3D3>Dateigroesse</td>
    	<td><input name="tbl_files[software_size]" type="text" value="<?=$files[software_size]?>" size="20" readonly></td>
    	<tr><td bgcolor=#D3D3D3>Sprache</td>
    	<td><input name="tbl_files[software_language]" type="text" value="<?=$files[software_language]?>" size="50"></td>
    	<tr><td bgcolor=#D3D3D3>Autor</td>
    	<td><input name="tbl_files[autor_name]" type="text" value="<?=$files[autor_name]?>" size="50"></td>
	<tr><td bgcolor=#D3D3D3>Autor Link</td>
    	<td><input name="tbl_files[autor_link]" type="text" value="<?=$files[autor_link]?>" size="50"></td>
	<tr><td bgcolor=#D3D3D3>Autor Downloadlink</td>
    	<td><input name="tbl_files[autor_download]" type="text" value="<?=$files[autor_download]?>" size="50"></td>
	<tr><td bgcolor=#D3D3D3>Dateiname</td>
    	<td><input name="tbl_files[software_filename]" type="text" value="<?=$files[software_filename]?>" size="50"readonly></td>
	<tr><td bgcolor=#D3D3D3>Software Notiz</td>
    	<td><textarea name="tbl_files[software_notice]" type="text" value="<?=$files[software_notice]?>" size="50"></textarea></td>
	<tr><td bgcolor=#D3D3D3>Software Kategorie</td>
   <td>
    <select name="tbl_files[software_category]" type="text">
  
<?php
do 	{
				
		if ($category!=$category['software_category']){
		if ($category==""){			
		$category=$category['software_category'];		 									
		}

	
		
?>


		<option><?=$category=$category['software_category'];?></option>

<?php
}
?>

<?php
	$category=$category['software_category'];

	}while ($category = mysql_fetch_array($category_query))
?>

    </select>

oder <input name="tbl_files[software_category]" type="text" value="" size="14">

  </td>
	<tr><td bgcolor=#D3D3D3>Status:
<pre>N = Neuer & Nicht vollstaendiger Datensatz (wird nicht veroeffentlicht)
<pre>A = Aktueller vollstaendiger Datensatz (wird veroeffentlicht)
<pre>D = Zum Loeschen deklariert (wird nicht mehr angezeigt)</td>
    	<td><input name="tbl_files[software_status]" type="text" value="<?=$files[software_status]?>" size="2"></td>
	<tr><td bgcolor=#D3D3D3>Checksumme</td>
    	<td><input name="tbl_files[software_md5sum]" type="text" value="<?=$files[software_md5sum]?>" size="35" readonly></td>
<tr><tr></tr>
	<td><br><input type="submit" name="Submit" value="Speichern"></td>
<tr></tr></form>
    <td><br><form name="form" method="" action="admin.php"><button type="submit" >Abbrechen</button></form></td>
</tr>
</table>

Last but not Least:

Auf meinem Admin Panel habe Ich das altbekannte CRUD; Create Read Update Delete

Alles gut und Recht jedoch habe Ich hier ein Button Problem; Ich sende mit echo dem File update.php die Infos zu die es mit
PHP:
$_REQUEST[id]
empfängt.

Hier der ausschnitt aus admin.php:

PHP:
				<?php//Delete Anweisung?>
				<form name="form1" method="post" action="delete.php">
	    			<td bgcolor=#FFCC00><input type="submit" name="id" value="<?php echo $files['id']; ?>"> Entfernen</td></form>
				
				<?php// Update Anweisung?>
				<form name="form2" method="post" action="update.php">
				<td bgcolor=#FFCC00><input type="submit" name="id" value="<?php echo $files['id']; ?>"> Edit</td></form>

Und hier der Empfangsteil des update.php:

PHP:
$change_id = $_REQUEST['id'];
	$query_files = "SELECT * FROM `tbl_files` WHERE `id` = '$change_id';";
	$files_query = mysql_query($query_files) or die(mysql_error());
	$files = mysql_fetch_assoc($files_query);

Ic? möchte statt des Buttons ein Bildchen einfügen, dies geht aber irgendwie nicht... er versucht das bildchen mitzuschicken... Mit dem aktuellen Code wird ein Button ausgegeben mit der Current ID, des Datensatzes.... Banales Problemchen?

Im Anhang befindet sich noch die Ausgabe des Formulares & Das Button Problem



Kann mir jemand helfen? :-(
 

Anhänge

  • Bildschirmfoto6.png
    Bildschirmfoto6.png
    27,9 KB · Aufrufe: 8
  • Bildschirmfoto7.png
    Bildschirmfoto7.png
    2,1 KB · Aufrufe: 4
Zuletzt bearbeitet:
Also, das Oder ist doch kein Problem. hier mal ein kleines Beispeil
PHP:
//TODO: Kategorien aus DB auslesen
$cats = array("kat1", "kat2");

echo '<form method="post">';
echo '  <select name="selectedCat" type="text">';
foreach($cats as $cat){
    echo "      <option>{$cat}</option>";
}
echo '  </select> oder <input name="newCat" type="text" />';
echo '  <input type="submit" name="submit" />';
echo '</form>';

//Auswertung
if(isset($_POST['submit'])){
    //prüfen ob eine neue Kategorie erfasst wird
    if($_POST['newCat']!=''){
        //TODO: Insert in die DB mit der neuen Kategorie
        $selectedCat = $_POST['newCat'];
    //Ansonsten die ausgewählte übernehmen
    }else{
        $selectedCat = $_POST['selectedCat'];
    }
    echo '<hr />';
    echo $selectedCat;
}
 
Hallo Yaslaw

Ich versteh grad nur Bahnhof :confused:

Hier erstellst/definierst du mir doch zwei neue Spalten in der DB?

PHP:
      $selectedCat = $_POST['newCat'];
    //Ansonsten die ausgewählte übernehmen
    }else{
        $selectedCat = $_POST['selectedCat'];

Es soll aber die gleiche Variabel zum $_Posten bleiben, den sonst komm Ich langsam gar nicht mehr draus. Wenn das eine Feld leer ist soll das Feld mit Füllung gesendet werden. Wenn beide ausgefüllt sind dann Fehler1 im Formular ausgeben, Falls keines Ausgefüllt ist Fehler2 ausgeben.

Ich glaube Ich habe mich da ein bisschen mit diesem Projekt "überlupft". Und das so kurz vor dem Ende :'-(
 
Zurück