【问题标题】:What would be the correct check syntax for these strings?这些字符串的正确检查语法是什么?
【发布时间】:2011-10-05 13:04:07
【问题描述】:

我正在编写一个脚本来检查文件夹 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 就可以了...

【问题讨论】:

    标签: php mysql directory


    【解决方案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';
    ?>
    

    【讨论】:

    • $query = 'INSERT INTO comics (name, issue) VALUES '.implode(',', $values).' ON DUPLICATE KEY UPDATE comicissue=comicissue'; 我做了名字,发出一个唯一的密钥,名为comicissue。但它仍然不起作用,插入值失败。我现在就试试这个新代码,谢谢!
    • Failed to insert the values. Duplicate entry '2000AD-1722' for key 'comicissue' 。它不会跳过已经存在的记录...
    • 更新了我的答案,检查一下。
    • 很漂亮,除了一些漫画的格式不正确(只有大约 20 个),我可以自己回去编辑。非常感谢你摇滚的人!!!
    • 由于某种原因,它在问题中遗漏了 0,即 Spider-Man 01 被插入为 Spider-Man 1
    【解决方案2】:

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

    if ($check_query == '0'){
    

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

    但是,我可能只会使用:

    INSERT IGNORE INTO ...
    

    因为这可能无关紧要。查看MySQL Insert Syntax 了解更多信息。

    【讨论】:

    • INSERT IGNORE INTO ... 不起作用,它仍然将所有现有漫画重新添加到数据库中。
    • 那你需要把唯一键放到需要唯一的字段上,大概是这样:ALTER TABLE comics ADD UNIQUE KEY name_issue (name, issue)
    【解决方案3】:

    doesn't work 信息量不大。

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

    【讨论】:

    • 对不起,它什么也没做,只是给我留下了一个空白页
    • +1 用于将值包装在括号中,我完全错过了这一点。查看我在答案中链接的 INSERT 语法。
    【解决方案4】:

    我会在表的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。 p>

    另请参阅ON DUPLICATE KEY UPDATE 语句的文档,如果在插入时发现记录重复,它可能会在您想要更新记录的情况下有所帮助。

    【讨论】:

    • $query = 'INSERT INTO comics (name, issue) VALUES '.implode(',', $values).' ON DUPLICATE KEY UPDATE comicissue=comicissue'; 我做了名字,发出一个名为comicissue的唯一密钥。但它仍然不起作用,插入值失败。
    • 我猜你得到了一个关于comicissue 不作为列(或类似性质的东西)存在的错误?尝试使用带有id=id 而不是comicissue=comicissue 的语句。如果您原始问题中的表结构正确,这应该可以工作。
    • 如果您不想担心ON DUPLICATE KEY UPDATE 语句,您可以执行以下操作:$query = 'INSERT IGNORE INTO comics (name, issue) VALUES '.implode(',', $values);
    • $query = 'INSERT IGNORE INTO comics (name, issue) VALUES '.implode(',', $values); 仍然没有跳过已经存在的那些。我试过那个。
    • 它在文件夹名称 Secret Avengers 012.1S.H.I.E.L.D. - Infinity 上出错
    【解决方案5】:

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

    $check_query_result = mysql_query(...) or die(mysql_error());
    
    if(mysql_num_rows($check_query_result) == 0) {
       ... comic doesn't exist ...
    }
    

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

    【讨论】:

      猜你喜欢
      • 2019-09-13
      • 1970-01-01
      • 2022-11-14
      • 2020-10-27
      • 1970-01-01
      • 1970-01-01
      • 2022-08-07
      • 2018-09-01
      相关资源
      最近更新 更多