Php 这些字符串的正确检查语法是什么?
我正在编写一个脚本,检查文件夹K:/Comics,并将每个名称+数字插入数据库,表名=Comics。现在,我想做的是在运行insert查询之前检查这个漫画是否已经存在 表结构: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
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插入。