I have been working on a recursive directory scan which scans folders and adds them to my mysql database if it is not already there. The only problem I have is no matter how i seem to write the Check part of my form it still skips over some records and/or it detects it as already being there when there is something with the same name that ends with a 0. Examples + Code Below.
Table:
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 ;
Records:
INSERT INTO `comics` (`id`, `publisher`, `arc`) VALUES
(10463, '', 'Green Wake 10');
INSERT INTO `comics` (`id`, `publisher`, `arc`) VALUES
(10462, '', 'Green Wake 1');
If the first insert is present before the second insert then the second one comes back as already being in the database.
Code As It Sits Now:
<?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>";
}
}
}
}
}
?>
Different Check Queries 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.
What would be a more precise check method?
It is normal because of this query
The % operator tells that it accept any char. In you rule, the test will be successfull if the left value starts with ‘Green Wake 1’ and finish with any char (or even no more char)