2011-07-14 43 views
1

我正在写一个脚本来检查文件夹K:/漫画,并将每个名称+数字插入到数据库中,表格名称=漫画。现在我想要做的是在运行插入查询之前检查这个漫画是否已经存在。这些字符串的正确检查语法是什么?

表结构:

CREATE TABLE IF NOT EXISTS `comics` (
    `id` int(100) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) NOT NULL, 
    `issue` varchar(4) DEFAULT NULL, 
    `bio` longtext NOT NULL, 
    `pages` int(10) NOT NULL, 
    `size` varchar(100) NOT NULL, 
    `price` varchar(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ; 

代码:

<?php 
    $main_folder = 'K:/Comics/'; // should be K:\Comics\ but I changed it because of the highlighting issue 
    $folders = glob($main_folder.'* [0-9]*', GLOB_ONLYDIR); 

    $comics_series = array(); 
    foreach($folders as $folder){ 
     $comics_series[] = preg_split('/(.+)\s(\d+)/', str_replace($main_folder, '', $folder), -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY); 
    } 

    $values = array(); 
    foreach($comics_series as $pair){ 
     $values[] = "('".mysql_real_escape_string($pair[0])."', '".((int) $pair[1])."')"; 
    } 

    $query = 'INSERT IGNORE INTO comics (name, issue) VALUES '.implode(',', $values); 
    $result = mysql_query($query); 
    echo ($result) ? 'Inserted successfully' : 'Failed to insert the values'; 
?> 

我以为会工作,但不(还增加了漫画到已经存在的DB):

$query = 'INSERT IGNORE INTO comics (name, issue) VALUES '.implode(',', $values); 
$result = mysql_query($query); 
echo ($result) ? 'Inserted successfully' : 'Failed to insert the values'; 

我忘了什么?!?该文件说,只是在那里添加IGNORE,它会工作...

回答

1
<?php 
$main_folder = 'K:/Comics/'; 
$folders = glob($main_folder.'* [0-9]*', GLOB_ONLYDIR); 

$comics_series = array(); 
foreach($folders as $folder){ 
    $comics_series[] = preg_split('/(.+)\s(\d+)/', str_replace($main_folder, '', $folder), -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY); 
} 

$values = array(); 
foreach($comics_series as $pair){ 
    // clean the values to protect against SQL injection 
    $pair = array(
     mysql_real_escape_string($pair[0]), 
     mysql_real_escape_string($pair[1]) 
    ); 
    // add it to the values array, for insert 
    $values[] = "('".$pair[0]."', '".$pair[1]."')"; 
} 

$query = 'INSERT INTO comics (name, issue) VALUES '.implode(',', $values).' '. 
     'ON DUPLICATE KEY UPDATE `issue` = VALUES(`issue`)'; 
$result = mysql_query($query); 
echo ($result) ? 'Inserted successfully' : 'Failed to insert the values'; 
?> 
+0

'$ query ='插入漫画(名称,问题)VALUES'.implode(',',$ values)。'在DUPLICATE KEY UPDATE comicissue = comicissue';'我发了个名字,发出一个名为comicissue的独特密钥。但它仍然不起作用,无法插入值。我现在会尝试这个新代码,谢谢! – rackemup420

+0

'无法插入值。关键'comicissue'重复输入'2000AD-1722'。它不会跳过已经存在的记录... – rackemup420

+0

更新我的答案,检查。 – Shef

1

mysql_query()返回一个结果资源,而不是一个整数或一组值或其他任何东西。尝试改变

if ($check_query == '0'){ 

if (mysql_num_rows($check_query) == 0){ 

不过,我可能只是使用:

INSERT IGNORE INTO ... 

因为它可能并不重要。查看MySQL Insert Syntax了解更多信息。

+0

INSERT IGNORE INTO ...不起作用,它仍然将所有现有的漫画添加到数据库中。 – rackemup420

+0

然后,你需要把唯一的键放在需要唯一的字段上,可能是这样的:'ALTER TABLE comics ADD UNIQUE KEY name_issue(name,issue)' – Dereleased

0

如果查询成功,则mysql_query返回语句句柄,如果查询失败,则返回布尔值FALSE。您需要这样做:

$check_query_result = mysql_query(...) or die(mysql_error()); 

if(mysql_num_rows($check_query_result) == 0) { 
    ... comic doesn't exist ... 
} 

请注意,不返回行的查询不是失败条件。这仅仅是碰巧没有行的结果

1

doesn't work没有太多的信息。

  • 使用mysql_num_rows,而不是== '0',它的真正意义
  • 还有的$values周围没有包围引号。
  • 包裹的值用括号
+0

对不起,它没有任何东西只是给我一个空白页 – rackemup420

+0

+1为了将价值包裹在parens中,我完全错过了这一点。查看我的答案中链接的INSERT语法。 – Dereleased

1

我将放置combined unique index在桌子上的nameissue列执行这些值的组合是表内的不同。

那么你可以做以下的,不担心重复记录:

$query = 'INSERT INTO comics (name, issue) VALUES '.implode(',', $values).' 
      ON DUPLICATE KEY UPDATE id=id'; //makes sure you don't get an error 

您也可以使用INSERT IGNORE声明(由@Dereleased说明)避免重复的嵌件(在之前指定unique index

另请参阅ON DUPLICATE KEY UPDATE声明的文档,如果在插入时发现它是重复记录,并且想要更新记录,则可能会有所帮助。

+0

'$ query ='插入漫画(名称,问题)VALUES'.implode(',',$ values)。'在DUPLICATE KEY UPDATE comicissue = comicissue';'我发了个名字,发出一个名为comicissue的独特密钥。但它仍然不起作用,无法插入值。 – rackemup420

+0

我想你会得到关于'comicissue'不存在作为列*(或某种性质)*的错误?尝试使用'id = id'而不是'comicissue = comicissue'的语句。如果你原来的问题中的表结构是正确的,这应该工作。 –

+0

如果您不想担心'ON DUPLICATE KEY UPDATE'语句,您可以执行以下操作:'$ query ='INSERT IGNORE INTO comics(name,issue)VALUES'.implode(',',$ values) ;' –

相关问题