2012-04-01 13 views
0

Ich habe an einem rekursiven Verzeichnis-Scan gearbeitet, der Ordner durchsucht und sie meiner mysql-Datenbank hinzufügt, wenn sie nicht schon da ist. Das einzige Problem, das ich habe, ist egal, wie ich den Check-Teil meines Formulars zu schreiben scheint, es überspringt immer noch einige Datensätze und/oder erkennt es als bereits da, wenn es etwas mit dem gleichen Namen gibt, der mit einer 0 endet. Beispiele + Code unten.MySQL-Ergebnisprüfung ist deaktiviert ... Was ist die beste Methode?

Tabelle:

CREATE TABLE IF NOT EXISTS `comics` (
    `id` int(255) NOT NULL AUTO_INCREMENT, 
    `publisher` varchar(255) NOT NULL, 
    `arc` varchar(255) NOT NULL, 
    `issue` int(5) NOT NULL, 
    `title` varchar(255) NOT NULL, 
    `plot` longtext NOT NULL, 
    `price` varchar(20) NOT NULL DEFAULT '0', 
    `files` int(255) NOT NULL, 
    `size` varchar(255) NOT NULL, 
    `cover` text NOT NULL, 
    `month` int(2) unsigned zerofill NOT NULL, 
    `day` int(2) unsigned zerofill NOT NULL, 
    `year` int(4) unsigned zerofill NOT NULL, 
    `added` date NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `arc` (`arc`,`issue`,`title`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

Aufzeichnungen:

INSERT INTO `comics` (`id`, `publisher`, `arc`) VALUES 
(10463, '', 'Green Wake 10'); 
INSERT INTO `comics` (`id`, `publisher`, `arc`) VALUES 
(10462, '', 'Green Wake 1'); 

Wenn der erste Einsatz vor dem zweiten Einsatz vorhanden ist, dann die zweite kommt zurück, wie bereits in der Datenbank sein.

-Code, wie es jetzt Sitzt:

<?php 
$base = "D:/comics/"; 
if (isset($_REQUEST['sub'])) { 
$sub = $_REQUEST['sub']; 
echo "<h2>Scanning Comics Starting With ".$sub."</h2>"; 
    if ($handle = opendir('D:/comics/'.$sub.'/')) { 

     while (false !== ($entry = readdir($handle))) { 
      if ($entry != '$RECYCLE.BIN' && $entry != 'System Volume Information' && $entry != '.' && $entry != '..') { 
      $entry1 = $entry; 
      $entry = str_replace(" - ", ": ", $entry); 
      $exists = mysql_query('SELECT * FROM comics WHERE arc LIKE "'.$entry.'%"'); 
      $exists1 = mysql_num_rows($exists); 
       if ($exists1 == 0) { 
       $directory = $base.$sub."/".$entry1; 
       $filecount = count(glob($directory."/"."*.*")); 
       $size2 = 0; 
       $d = new RecursiveIteratorIterator( 
       new RecursiveDirectoryIterator($directory), 
       RecursiveIteratorIterator::SELF_FIRST 
       ); 

       foreach($d as $file){ 
       $size2 += $file->getSize(); 
       } 
       $size = $size2/1024; 
       $modified = date("Y-m-d", filemtime($directory)); 

        mysql_query('INSERT INTO comics (arc, files, size, added) VALUES ("'.$entry.'", "'.$filecount.'", "'.$size.'", "'.$modified.'")'); 
        print "<li>Inserted <b>".$entry."</b> With A File Count Of <b>".$filecount."</b> & A Total Size Of <b>".$size."</b> MB Last Modified On <b>".$modified."</b>.</li>"; 
       } 
      } 
     } 
    } 
}  
    ?> 

Verschiedene Preisanfragen I Tried:

$exists = mysql_query('SELECT * FROM comics WHERE arc LIKE "'.$entry.'%"'); 
// Returns As Already Being In The Database. 

$exists = mysql_query('SELECT * FROM comics WHERE arc = "'.$entry.'"'); 
// Returns The Successfully Imported Message (but doesn't execute the insert query) For All Folders Found. Even If It Is There Or Not. 

Was wäre eine präzisere Kontrolle Methode sein?

Antwort

1

sei es wegen dieser Abfrage

$exists = mysql_query('SELECT * FROM comics WHERE arc LIKE "'.$entry.'%"'); 
'Green Wake 10' like 'Green Wake 1%' will return true 

Der Operator% sagt normal ist, dass es jedes Zeichen zu akzeptieren. In Ihrer Regel ist der Test erfolgreich, wenn der linke Wert mit 'Green Wake 1' beginnt und mit einem beliebigen Zeichen endet (oder gar kein Zeichen mehr)

+0

yeah ich dachte, dass so viel das ist, warum ich versucht habe, es zu vergleichen, wo 'arc = '$ entry'', aber das kehrt auch nicht richtig zurück. – rackemup420

+0

Was genau zurückgibt '$ exists = mysql_query ('SELECT * FROM comics WHERE arc ="'. $ Entry. '"');' Und 'exists1 = mysql_num_rows ($ exists); 'set existiert1 = 0? – grifos

+0

Und ich empfehle Ihnen, 'mysql_real_escape_string' auf Text zu verwenden, der an Ihre Abfragen angehängt wird, um jeden Fehler zu vermeiden (ein reduce sqli hole, immer noch anfällig für Kommentarzeichen). Bei den gegebenen Testwerten sollte sich nichts ändern. – grifos

0

Geben Sie die numerischen Werte nicht in ' an. Ihre Spalte id ist vom Typ INT.

INSERT INTO `comics` (`id`, `publisher`, `arc`) VALUES 
('10463', '', 'Green Wake 10'); 
INSERT INTO `comics` (`id`, `publisher`, `arc`) VALUES 
('10462', '', 'Green Wake 1'); 

sollte also

INSERT INTO `comics` (`id`, `publisher`, `arc`) VALUES 
(10463, '', 'Green Wake 10'); 
INSERT INTO `comics` (`id`, `publisher`, `arc`) VALUES 
('0462, '', 'Green Wake 1'); 
+0

Ja, ich habe sie versehentlich hinzugefügt, als ich sie hier eingegeben habe jetzt, da sie nicht einmal in meinem echten Code sorry sind. – rackemup420

Verwandte Themen