最近不知道大家发现没,在Phpcms v9管理后台在添加标题后不会自动获取关键词了,这是因为Phpcms官方的分词服务器(http://tool.phpcms.cn/api/get_keywords.php)挂了,于是造成了内置的分词api接口(api.php?op=get_keywords)报错,自然不能获取到关键词了,于是引发了关键词为空时插入数据库报Duplicate错误的Bug。
先看看报错提示:
MySQL Query : INSERT INTO `cmsyou_sql`.`v9_keyword`(`keyword`,`siteid`,`pinyin`,`videonum`) VALUES ('','1','','1')
MySQL Error : Duplicate entry '' for key 'PRIMARY'
MySQL Errno : 1062
Message : Duplicate entry '' for key 'PRIMARY'
这个报错字面的意思是:不能重复插入为空的字段,也就是当关键词为空的时候,Phpcms还是执行了$keyword_db->insert保存数据的函数,造成错误。经过CMSYOU检查,发现错误来源于内容模型的关键字字段的update函数,加上一个判断就好。
具体修正方法:
修改/phpcms/modules/content/fields/keyword/update.inc.php文件:
if (!$r = $keyword_db->get_one(array('keyword'=>$v, 'siteid'=>$siteid))) {
$letters = gbk_to_pinyin($v);
$letter = strtolower(implode('', $letters));
$tagid = $keyword_db->insert(array('keyword'=>$v, 'siteid'=>$siteid, 'pinyin'=>$letter, 'videonum'=>1), true);
} else {
$keyword_db->update(array('videonum'=>'+=1'), array('id'=>$r['id']));
$tagid = $r['id'];
}
$contentid = $this->id.'-'.$this->modelid;
if (!$keyword_data_db->get_one(array('tagid'=>$tagid, 'siteid'=>$siteid, 'contentid'=>$contentid))) {
$keyword_data_db->insert(array('tagid'=>$tagid, 'siteid'=>$siteid, 'contentid'=>$contentid));
}
unset($contentid, $tagid, $letters);
修改为:
if($v!=''){
if (!$r = $keyword_db->get_one(array('keyword'=>$v, 'siteid'=>$siteid))) {
$letters = gbk_to_pinyin($v);
$letter = strtolower(implode('', $letters));
$tagid = $keyword_db->insert(array('keyword'=>$v, 'siteid'=>$siteid, 'pinyin'=>$letter, 'videonum'=>1), true);
} else {
$keyword_db->update(array('videonum'=>'+=1'), array('id'=>$r['id']));
$tagid = $r['id'];
}
$contentid = $this->id.'-'.$this->modelid;
if (!$keyword_data_db->get_one(array('tagid'=>$tagid, 'siteid'=>$siteid, 'contentid'=>$contentid))) {
$keyword_data_db->insert(array('tagid'=>$tagid, 'siteid'=>$siteid, 'contentid'=>$contentid));
}
unset($contentid, $tagid, $letters);
}
修改后记得在管理后台更新缓存之后再测试,欢迎留言与CMSYOU一起探讨CMS!
延伸阅读:
点击加载更多