这些字符串的正确检查语法是什么?

时间:2011-07-14 17:01:20

标签: php mysql directory

我正在编写一个脚本来检查文件夹K:/ Comics并将每个名称+数字插入数据库,表名=漫画。现在我想做的是在运行插入查询之前检查这个漫画是否已经存在。

表格结构:

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';
?> 

我认为会起作用但不起作用(仍然将漫画添加到已经存在的数据库中):

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

我忘记了什么?!?文档说只是在那里添加IGNORE,它会起作用......

5 个答案:

答案 0 :(得分:1)

mysql_query()返回结果资源,而不是整数或一组值或其他任何内容。尝试更改

if ($check_query == '0'){

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

但是,我可能只会使用:

INSERT IGNORE INTO ...

因为它可能没关系。查看MySQL Insert Syntax了解详情。

答案 1 :(得分:1)

doesn't work信息量不大。

  • 使用mysql_num_rows代替== '0',这真的毫无意义
  • $values周围没有引号。
  • 用括号括起值

答案 2 :(得分:1)

我会在表格的nameissue列上放置combined unique index,以强制将这些值组合在表格中。

然后您可以执行以下操作,而不必担心双重记录:

$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语句的文档,如果在插入时发现重复记录,则可能会有帮助。

答案 3 :(得分: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';
?>

答案 4 :(得分: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 ...
}

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