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

Php 这些字符串的正确检查语法是什么?,php,mysql,directory,Php,Mysql,Directory,我正在编写一个脚本,检查文件夹K:/Comics,并将每个名称+数字插入数据库,表名=Comics。现在,我想做的是在运行insert查询之前检查这个漫画是否已经存在 表结构: CREATE TABLE IF NOT EXISTS `comics` ( `id` int(100) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `issue` varchar(4) DEFAULT NULL, `bio` longtex

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

表结构:

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 ;
代码:

我忘了什么?!?文档中说只要在其中添加IGNORE就可以了……

mysql\u查询返回一个结果资源,而不是一个整数或一组值或其他任何东西。试着改变

if ($check_query == '0'){

但是,我可能只会使用:

INSERT IGNORE INTO ...
因为这可能不重要。查看以了解更多信息。

mysql\u查询返回一个结果资源,而不是整数或值集或其他任何内容。试着改变

if ($check_query == '0'){

但是,我可能只会使用:

INSERT IGNORE INTO ...

因为这可能不重要。查看以了解更多信息。

mysql\u如果查询成功,则查询返回语句句柄;如果查询失败,则返回布尔值FALSE。您需要执行以下操作:

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

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

请注意,不返回行的查询不是失败条件。这只是一个碰巧没有行的结果,如果查询成功,mysql\u查询将返回一个语句句柄,如果查询失败,则返回布尔值FALSE。您需要执行以下操作:

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

if(mysql_num_rows($check_query_result) == 0) {
   ... comic doesn't exist ...
}
请注意,不返回行的查询不是失败条件。这只是一个碰巧没有行的结果

不起作用,信息量也不太大

使用而不是=='0',这真的没有意义 $value周围没有引号。 用括号将值括起来 不起作用的信息量不大

使用而不是=='0',这真的没有意义 $value周围没有引号。 用括号将值括起来 我将在表的名称和列上放置一个标记,以强制这些值的组合在表中是不同的

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

$query = 'INSERT INTO comics (name, issue) VALUES '.implode(',', $values).'
          ON DUPLICATE KEY UPDATE id=id'; //makes sure you don't get an error
您还可以使用@Derelease所述的INSERT IGNORE语句,以避免在指定的语句中插入重复项

另请参阅该语句的文档,如果插入时发现记录重复,则在需要更新该记录的情况下可能会有所帮助。

我会在表的名称和问题列上放置一个,以强制这些值的组合在表中是不同的

<?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 id=id'; //makes sure you don't get an error
您还可以使用@Derelease所述的INSERT IGNORE语句,以避免在指定的语句中插入重复项


另请参阅该语句的文档,如果插入时发现记录重复,则在需要更新该记录的情况下可能会有所帮助。

很抱歉,它什么也不做,只留下一个空白页+1用于包装参数中的值,我完全错过了这一点。请查看我在回答中链接的插入语法。很抱歉,它没有任何作用,只是给我留下了一个空白页+1,用于包装参数中的值,我完全错过了这一点。检查我在答案中链接的插入语法。插入忽略到。。。不起作用,它仍然会将所有现有的漫画再次添加到数据库中。然后,您需要将唯一键放到需要唯一的字段中,可能是这样的:ALTER TABLE comics ADD unique KEY name\u issue name,issueINSERT IGNORE INTO INTO。。。不起作用,它仍然会将所有现有的漫画再次添加到数据库中。然后,您需要将唯一键放在需要唯一的字段上,可能是这样的:ALTER TABLE comics ADD unique KEY name_issue name,issue$query='INSERT INTO comics name,issue VALUES'。内爆',',$VALUES。'ON DUPLICATE KEY UPDATE comicissue=comicissue';我创造了名字,发行了一个名为comicissue的唯一密钥。但它仍然不起作用,get a未能插入值。我猜您会遇到一个错误,关于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'。内爆',',$VALUES;这仍然没有跳过那些已经存在的。我试过了。它在文件夹名Secret Avengers 012.1和S.H.I.E.L.D.上出错了Infinity$query='插入漫画名称,发布值'。内爆',',$VALUES。'在重复键上更新漫画苏=漫画苏';我创造了名字,发行了一个名为comicissue的唯一密钥。但它仍然不起作用,get a未能插入值。我猜您会遇到一个错误,关于comicissue不作为列或类似性质的内容存在?尝试使用id=id的语句,而不是comicissue=comicissue。如果原始问题中的表结构是正确的,这应该可以工作
<?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';
?>

要担心ON-DUPLICATE-KEY-UPDATE语句,您可以执行以下操作:$query='INSERT-IGNORE-INTO-comics-name,issue-VALUES'。内爆',',$VALUES$query='INSERT IGNORE-INTO-comics-name,issue-VALUES'。内爆',',$VALUES;这仍然没有跳过那些已经存在的。我试过了。它在文件夹名Secret Avengers 012.1和S.H.I.E.L.D.上出错了Infinity$query='插入漫画名称,发布值'。内爆',',$VALUES。'在重复键上更新漫画苏=漫画苏';我创造了名字,发行了一个名为comicissue的唯一密钥。但它仍然不起作用,get a无法插入值。我现在就试试这个新代码谢谢!无法插入值。密钥“comicissue”的重复条目“2000AD-1722”。它不会跳过已经存在的记录…更新了我的答案,检查一下。很好,除了一些漫画的格式不正确,只有20左右,我可以自己回去编辑。谢谢你这么多人,你摇滚!!!出于某种原因,它在问题中遗漏了0,即蜘蛛侠01作为蜘蛛侠1插入。$query='INSERT INTO comics name,ISE VALUES'。内爆',',$VALUES。'ON DUPLICATE KEY UPDATE comicissue=comicissue';我创造了名字,发行了一个名为comicissue的唯一密钥。但它仍然不起作用,get a无法插入值。我现在就试试这个新代码谢谢!无法插入值。密钥“comicissue”的重复条目“2000AD-1722”。它不会跳过已经存在的记录…更新了我的答案,检查一下。很好,除了一些漫画的格式不正确,只有20左右,我可以自己回去编辑。谢谢你这么多人,你摇滚!!!出于某种原因,它在问题中遗漏了0,即蜘蛛侠01作为蜘蛛侠1插入。