我正在编写一个脚本来检查文件夹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
,它会起作用......
答案 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
信息量不大。
== '0'
,这真的毫无意义$values
周围没有引号。答案 2 :(得分:1)
我会在表格的name
和issue
列上放置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 ...
}
请注意,不返回任何行的查询不是失败条件。这只是一个碰巧没有行的结果