论坛风格切换切换到宽版
  • 304阅读
  • 6回复

关于修改config.htm后,推送数据被清空的问题,强烈呼吁官方重视 [复制链接]

上一主题 下一主题
在线iamtestman
 

发帖
80
金钱
193
威望
2
  • 版本:8.7优化包,8.7,8.5,8.3, 8.0 (请选择反馈的版本)
  • 浏览器:360,IE9,IE6,IE7,IE8,Firefox,Chrome,傲游,其他
今天我修改门户首页的config.htm ,修改了一个模块数据的显示代码(如下所示),不小心把id删除了一个字符,结果悲剧发生了,这个模块已经推送的数据全部丢失了。幸好数据库是每天备份的,恢复了config.htm,以及 pw_pushdata pw_invoke pw_invokepiece 3张数据表后,页面数据全部恢复了。
<pw id="U4803oindex" />
                   <ul class="cc o_home_imglistA">
                   <list num="18" action="user" cachetime="3" ifpushonly="0" title="美食达人" />

类似的问题,我们碰到了至少4次以上,美工一不小心就会导致这些宝贵的数据丢失了,
记得第一次碰到这个问题时,我们还以为网站受到了攻击。
我也搜索了pw官方论坛(搜索"config.htm 推送数据"就能看到),很多朋友都碰到过这个问题。
看到一个网友的分析,链接 http://www.phpwind.net/read-htm-tid-1115623.html,原因是:

推送的内容在数据表中的存储和config里的模块有关系
如果config被替换
更新后台门户的缓存的话。他就会自动对比推送数据表里的模块内容和config里的模块
在config里不存在的模块,而数据表里存在内容的话,系统会自动清理掉这些内容。
等你再恢复config文件已经没用了。除非恢复数据!


要知道,很多内容都是站长辛辛苦苦一条一条手工推荐的啊。
我们网站的数据,就是差不多2年的手工推送数据啊,这些数据我们也写了程序让网友能够浏览,毕竟是我们论坛的精华所在。

强烈呼吁官方重视这个问题,解决这个问题,
去掉模块内容跟config.htm不一致时的自动清理内容功能,
因为不管是谁来修改config.htm的内容,难免有不小心的时候,id和名称变了就删除相应模块所有推送数据,
我认为是程序在逻辑设计上有问题。

再次呼吁,请重视并解决这个问题,不要让站长们的功夫都白费了,都是站长们血血淋淋的教训啊。



评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
在线tracy_melon

发帖
5818
金钱
34
威望
383
只看该作者 置顶 (来自5楼) 发表于: 02-21
回 iamtestman 的帖子
— (tracy_melon) 执行 帖内置顶 操作 (2012-02-21 11:17) —
iamtestman:好啊,非常感谢。 (2012-02-18 21:48) 

lib/area/moduleconfigservice.class.php找到
  1. function updateInvokesByModuleConfig($templateFile,$configFile,$type,$sign) {
  2.         $invokeService = $this->_getInvokeService();
  3.         $invokeService->updatePageInvokesState($type,$sign,'',1);
  4.         $this->_initPwContainer($templateFile,$configFile);
  5.         $modules = $this->_getModulesFromTemplate($templateFile);
  6.         foreach ($modules as $module) {
  7.             $oldModuleInfo = $invokeService->getInvokeByName($module);
  8.             $newModulePiecesCode = $this->_getInvokeStringFromConfigFile($configFile,$module);
  9.             $newModuleTitle = $this->_getModuleTitle($configFile,$module);
  10.             $this->_processModuleTitle($module,$oldModuleInfo,$newModuleTitle);
  11.             $this->_processModuleTagCode($module,$oldModuleInfo,$newModulePiecesCode,$type,$sign);
  12.         }
  13.         $invokeService->updatePageInvokesState($type,$sign,$modules,0);
  14.     }


改为:
    
  1. function updateInvokesByModuleConfig($templateFile,$configFile,$type,$sign) {
  2.         $invokeService = $this->_getInvokeService();
  3.         $invokeService->updatePageInvokesState($type,$sign,'',1);
  4.         $this->_initPwContainer($templateFile,$configFile);
  5.         $modules = $this->_getModulesFromTemplate($templateFile);
  6.         foreach ($modules as $module) {
  7.             $invokePieces = $invokeService->getInvokePieceByInvokeName($module);
  8.             $oldModuleInfo = $invokeService->getInvokeByName($module);
  9.             $newModulePiecesCode = $this->_getInvokeStringFromConfigFile($configFile,$module);
  10.             $newModuleTitle = $this->_getModuleTitle($configFile,$module);
  11.             if(($invokePieces && $newModuleTitle) || !invokePieces){
  12.                 $this->_processModuleTitle($module,$oldModuleInfo,$newModuleTitle);
  13.                 $this->_processModuleTagCode($module,$oldModuleInfo,$newModulePiecesCode,$type,$sign);
  14.             }
  15.         }
  16.         $invokeService->updatePageInvokesState($type,$sign,$modules,0);
  17.     }

试试这个方案~
各位会员感恩节快乐,感谢您对phpwind的关注!
8.7正式版解决方案汇总帖子
http://www.phpwind.net/read-htm-tid-1398169.html
在线铁皮

发帖
332
金钱
356
威望
151
只看该作者 沙发  发表于: 02-17
没有问题的,如果id被改掉,数据还是保留的,只是这个模块会置为停用状态。只要将id改回去,数据还是会重新显示的。

比如上面这个模块由于id被改掉内容不能显示,后台【模块管理】中可以看到这个失效模块。
只要将模块id重新改成和这个id一致,数据就重新显示了~
只有在后台删除这个模块,数据才会彻底删除
在线iamtestman

发帖
80
金钱
193
威望
2
只看该作者 板凳  发表于: 02-17
回 铁皮 的帖子
铁皮:没有问题的,如果id被改掉,数据还是保留的,只是这个模块会置为停用状态。只要将id改回去,数据还是会重新显示的。
[图片]
比如上面这个模块由于id被改掉内容不能显示,后台【模块管理】中可以看到这个失效模块。
只要将模块id重新改成和这个id一致,数据就重新显 .. (2012-02-17 17:18)

但是我们使用中,为什么pushdata数据表中对应模块的手工推送数据会被清空呢?
比如 <pw id="U4803oindex" />
如果美工不小心改成<pw id="U4803" />后,我们发现pushdata数据表中这个模块的手工推荐数据都会消失,必须恢复那3张表才会出现,即使美工把<pw id="U4803" />改回<pw id="U4803oindex" />,数据还是空白。

我收集了反映这个问题的帖子:
http://www.phpwind.net/read-htm-tid-1115623.html
http://www.phpwind.net/read-htm-tid-1786504.html
http://www.phpwind.net/read-htm-tid-1677147.html
http://www.phpwind.net/read-htm-tid-1268291.html
http://www.phpwind.net/read-htm-tid-1184981.html

还有个网友进行了分析
http://blog.52news.com/article.asp?id=1636


  1. p.s. 今天改了下门户的配置,导致了以前推送数据的丢失,很郁闷,就仔细查看了下pw8的代码,终于找到了原因,原来除了ID之外,title也不能做修改,不然就会丢失已添加的推送数据。
  2. 打开配置文件/html/portal/oindex/config.htm,有如下获取模块定义:
  3. 引用
  4. <pw id="P4345oindex" />
  5. <h4><span>美食</span></h4>
  6. <pw id="U4803oindex" />
  7. <ul class="cc o_home_imglistA">
  8. <list num="18" action="user" cachetime="3" ifpushonly="0" title="美食达人" />
  9. <loop>
  10. <li><a href="{url}" target="_blank"><img src="{image,48,48}" alt="{title}" width="48" height="48" /></a>
  11. <p title="{title}">{title,16}</p>
  12. </li>
  13. </loop>
  14. </ul>
  15. phpwind8读取推送数据的流程:
  16. 1、打开/data/tplcache/portal_oindex.htm,我们可以看到是通过pwTplGetData函数获取推送数据,pwTplGetData('U4803oindex','美食达人') 同时使用ID和title来指定数据源
  17. 引用
  18. EOT;
  19. $pwresult = pwTplGetData('U4803oindex','美食达人');
  20. foreach($pwresult as $key=>$val){print <<<EOT
  21. <li>
  22. <a href="$val[url]" target="_blank"><img src="$val[image]" alt="$val[title]" width="48" height="48" /></a>
  23. <p title="$val[title]">$val[title]</p>
  24. </li>
  25. EOT;
  26. }print <<<EOT
  27. 2、打开require/common.php文件,可以发现pwTplGetData函数中使用area目录中的tplgetdata类的 getData函数获取推送数据,那就继续
  28. 引用
  29. /**
  30. * 获取模板数据
  31. *
  32. * [url=u.php?uid=2160480]@param[/url]   string $invokeName
  33. * [url=u.php?uid=2160480]@param[/url]   string $title
  34. * [url=u.php?uid=2160480]@param[/url]   int $loopId
  35. * @return string
  36. */
  37. function pwTplGetData($invokeName, $title) {
  38. $GLOBALS['__pwTplGetData'] = true;
  39. $tplgetdata = L::loadClass('tplgetdata', 'area');
  40. return $tplgetdata->getData($invokeName, $title);
  41. }
  42. 3、打开lib/area/tplgetdata.class.php文件,发现是通过_getDataFromPush函数实现,不过要继续打开 pushdataservice 类,继续
  43. 引用
  44. function getData($invokename,$title){
  45. if (!$invokename || !$title) return array();
  46. $temp = $this->_getDataFromCache($invokename,$title);
  47. if ($temp === false) {
  48. $temp = $this->_getDataFromBBS($invokename,$title);
  49. $this->index++;
  50. }
  51. return $temp;
  52. }
  53. function _getDataFromBBS($invokename,$title){
  54. $pw_invkoepiece = L::loadDB('invokepiece', 'area');
  55. $config = $this->_getPieceConfigByInovkeNameAndTitle($invokename,$title);
  56. $data = $this->_getDataFromPush($config);
  57. if (count($data)<$config['num'] && !$config['ifpushonly']) {
  58. $tempElement= $this->_getDataFromSystem($config);
  59. $data = $this->_combinElementAndPush($tempElement,$data,$config['num']);
  60. }
  61. //如果是图片模块,没有数据的情况下调用系统默认图片
  62. if (!$data && $config['action']=='image') {
  63. global $imgpath;
  64. $data[] = array('image'=>"$imgpath/nopic.gif");
  65. }
  66. $this->_updateCache($config,$data);
  67. return $data;
  68. }
  69. function _getDataFromPush($config){
  70. $pushdataService = L::loadClass('pushdataservice', 'area');
  71. $invokepieceid = $config['id'];
  72. $num = $config['num'];
  73. return $pushdataService->getEffectData($invokepieceid,$num);
  74. }
  75. 4、打开lib/area/pushdataservice.class.php文件,还要继续loadDB pushdata
  76. 引用
  77. function PW_PushDataService() {
  78. $this->_pushdataDao = L::loadDB('pushdata', 'area');
  79. }
  80. function getPushDataById($id) {
  81. return $this->_pushdataDao->get($id);
  82. }
  83. 5、打开lib/area/db/pushdatadb.class.php文件,看看get函数可以发现推送数据存放在 pw_pushdata 表中
  84. 引用
  85. var $_tableName = "pw_pushdata";
  86. function get($id) {
  87. $temp = $this->_db->get_one("SELECT * FROM ".$this->_tableName." WHERE id=".pwEscape($id));
  88. return $this->_initData($temp);
  89. }

[ 此帖被iamtestman在2012-02-17 19:53重新编辑 ]
本帖提到的人: @Return @param
在线铁皮

发帖
332
金钱
356
威望
151
只看该作者 3楼 发表于: 02-18
回 iamtestman 的帖子
iamtestman:但是我们使用中,为什么pushdata数据表中对应模块的手工推送数据会被清空呢?
比如 <pw id="U4803oindex" />
如果美工不小心改成<pw id="U4803" />后,我们发现pushdata数据表中这个模块的手工推荐数据都会消失,必须恢复那3张表才会出现,即使 .. (2012-02-17 19:37) 

恩,已经找到原因了~是存在问题~
稍后我们提供方案啊~
在线iamtestman

发帖
80
金钱
193
威望
2
只看该作者 4楼 发表于: 02-18
回 铁皮 的帖子
铁皮:恩,已经找到原因了~是存在问题~
稍后我们提供方案啊~ (2012-02-18 11:17) 

好啊,非常感谢。
在线tracy_melon

发帖
5818
金钱
34
威望
383
只看该作者 5楼 发表于: 02-21
回 iamtestman 的帖子
— (tracy_melon) 执行 帖内置顶 操作 (2012-02-21 11:17) —
iamtestman:好啊,非常感谢。 (2012-02-18 21:48) 

lib/area/moduleconfigservice.class.php找到
  1. function updateInvokesByModuleConfig($templateFile,$configFile,$type,$sign) {
  2.         $invokeService = $this->_getInvokeService();
  3.         $invokeService->updatePageInvokesState($type,$sign,'',1);
  4.         $this->_initPwContainer($templateFile,$configFile);
  5.         $modules = $this->_getModulesFromTemplate($templateFile);
  6.         foreach ($modules as $module) {
  7.             $oldModuleInfo = $invokeService->getInvokeByName($module);
  8.             $newModulePiecesCode = $this->_getInvokeStringFromConfigFile($configFile,$module);
  9.             $newModuleTitle = $this->_getModuleTitle($configFile,$module);
  10.             $this->_processModuleTitle($module,$oldModuleInfo,$newModuleTitle);
  11.             $this->_processModuleTagCode($module,$oldModuleInfo,$newModulePiecesCode,$type,$sign);
  12.         }
  13.         $invokeService->updatePageInvokesState($type,$sign,$modules,0);
  14.     }


改为:
    
  1. function updateInvokesByModuleConfig($templateFile,$configFile,$type,$sign) {
  2.         $invokeService = $this->_getInvokeService();
  3.         $invokeService->updatePageInvokesState($type,$sign,'',1);
  4.         $this->_initPwContainer($templateFile,$configFile);
  5.         $modules = $this->_getModulesFromTemplate($templateFile);
  6.         foreach ($modules as $module) {
  7.             $invokePieces = $invokeService->getInvokePieceByInvokeName($module);
  8.             $oldModuleInfo = $invokeService->getInvokeByName($module);
  9.             $newModulePiecesCode = $this->_getInvokeStringFromConfigFile($configFile,$module);
  10.             $newModuleTitle = $this->_getModuleTitle($configFile,$module);
  11.             if(($invokePieces && $newModuleTitle) || !invokePieces){
  12.                 $this->_processModuleTitle($module,$oldModuleInfo,$newModuleTitle);
  13.                 $this->_processModuleTagCode($module,$oldModuleInfo,$newModulePiecesCode,$type,$sign);
  14.             }
  15.         }
  16.         $invokeService->updatePageInvokesState($type,$sign,$modules,0);
  17.     }

试试这个方案~
各位会员感恩节快乐,感谢您对phpwind的关注!
8.7正式版解决方案汇总帖子
http://www.phpwind.net/read-htm-tid-1398169.html
在线iamtestman

发帖
80
金钱
193
威望
2
只看该作者 6楼 发表于: 02-21
回 tracy_melon 的帖子
tracy_melon:lib/area/moduleconfigservice.class.php找到
function updateInvokesByModuleConfig($templateFile,$configFile,$type,$sign) {
        $invokeService = $this->_getInvokeService();
        .. (2012-02-21 11:17) 

这个方案官方测试过吧?
我们有些不方便测试,呵呵。
快速回复
限80 字节
温馨提示:欢迎交流讨论,请勿纯表情、纯引用!
 
上一个 下一个