Discuz!官方免费开源建站系统

 找回密码
 立即注册
搜索

[已解决] 动网8.0sp1 SQL转换到DZ 6.0所有投票帖子都变为普通帖子

[复制链接]
孤独的阿狼 发表于 2008-5-26 21:27:17 | 显示全部楼层 |阅读模式
dvbbs 8.0 sp1 SQL 转 dz 6.0,转换程序用的是桃子发布的,最后更新4月16日。

操作系统为 win2003,帝国集成PHP环境。

自己曾经试转过多次,除了短信息不成功(改成TEXT格式也提示没改,要求改成TEXT格式),转换都成功,但是没有实际测试,最近组织斑竹们开始实地测试,问题逐渐暴露。

有斑竹提出一个投票帖子投票内容消失,只剩下帖子内容。一开始以为是固顶的原因,解除固顶后重新转,发现还是没有转过来。

查询论坛上所有的“投票”,发现所有的投票都没有投票部分,全部变为普通帖子。
查数据库polls表,一条记录也没有。

请帮忙查找问题所在。
回复

使用道具 举报

 楼主| 孤独的阿狼 发表于 2008-5-26 22:44:28 | 显示全部楼层
查了查记录数,threads表中37130条数据,主题与投票转换数据总量37130条,也就是说一条投票也没转出来!

<?php
if($start <= 1) {
                truncatetable('threads');
                truncatetable('polls');
                truncatetable('polloptions');
                validid('topicid', 'topic');
        }

        $query = $db['source']->query("SELECT * FROM {$source_tablepre}Topic WHERE TopicID BETWEEN $start AND $end") or dexit("检索数据表 '{$source_tablepre}Topic' 错误!<br>请将主题表 '{$source_tablepre}Topic' 字段类型为 nText 的改为 Text 类型。", 'mssql');

        while($t = mssql_fetch_assoc($query)) {
                $t = array_change_key_case(daddslashes($t));

                $lp                        =        explode('$', $t['lastpost']);

                $tid                        =        $t['topicid'];
                $fid                        =        $t['boardid'];
                $iconid                        =        0;
                $typeid                        =        $t['mode'];
                $readperm                =        0;
                $price                        =        0;
                $author                        =        cutstr(htmlspecialchars(trim($t['postusername'])), 15);
                $authorid                =         $t['postuserid'];
                $subject                =        cutstr(htmlspecialchars(trim(@strip_tags($t['title']))), 78);
                $subject                =        $subject ? $subject : 'no subject';
                $dateline                =        timetounix($t['dateandtime']);
                $dateline                =        $dateline > $timestamp ? $timestamp : $dateline;
                $lastpost                =        timetounix($t['lastposttime']);
                $lastpost                =        $lastpost > $timestamp ? $timestamp : $lastpost;
                $lastposter                =        cutstr(htmlspecialchars(trim($lp[0])), 15);
                $views                        =        $t['hits'];
                $replies                =        $t['child'];
                $displayorder                =        $t['istop'];
                $highlight                =        0;
                $digest                        =        $t['isbest'];
                $rate                        =        0;
                $blog                        =        0;
                $poll                        =        $t['pollid'] > 0 ? 1 : 0;
                $attachment                =        0;
                $subscribed                =        0;
                $moderated                =        0;
                $closed                        =        0;

                $sql1 = "INSERT INTO {$discuz_tablepre}threads (
                        `tid` , `fid` , `iconid` , `typeid`, `readperm`, `price`,`author` , `authorid` , `subject` , `dateline` , `lastpost` , `lastposter` , `views` , `replies` , `displayorder` , `highlight` , `digest` , `rate` , `blog` , `special` , `attachment` , `subscribed`, `moderated` , `closed`
                        ) VALUES(
                        '$tid', '$fid', '$iconid', '$typeid', '$readperm', '$price', '$author', '$authorid', '$subject', '$dateline', '$lastpost', '$lastposter', '$views', '$replies', '$displayorder', '$highlight', '$digest', '$rate', '$blog', '$poll', '$attachment', '$subscribed', '$moderated', '$closed');";

                if($db['discuz']->query($sql1)){
                        if($poll) {
                                $query2 = $db['source']->query("SELECT voteid, vote, votenum, votetype, lockvote, voters, timeout FROM {$source_tablepre}vote WHERE voteid=$t[pollid]");
                                $v = daddslashes(mssql_fetch_assoc($query2));

                                if(!$v['voteid']) {
                                        $db['discuz']->query("UPDATE {$discuz_tablepre}threads SET special=0 WHERE tid='$tid'");
                                } else {
                                        $multiple = $v['votetype'];
                                        $maxchoices = $multiple ? 0 : 1;
                                        $expiration = timetounix($v['timeout']);
                                        $db['discuz']->query("INSERT INTO {$discuz_tablepre}polls (`tid`, `multiple`, `maxchoices`, `expiration`) VALUES('$tid', '$multiple', '$maxchoices', '$expiration');");
                                        $polloptions = explode('|', $v['vote']);
                                        $votenums = explode('|', $v['votenum']);
                                        foreach($polloptions AS $key => $polloption) {
                                                $query3 = $db['source']->query("SELECT userid FROM {$source_tablepre}voteuser WHERE voteid=$v[voteid] AND (voteoption='$key' OR LEFT(voteoption, 2)='$key,' OR LEFT(voteoption, 3)='$key,' OR CHARINDEX(',$key,', voteoption)>0 OR RIGHT(voteoption, 2)=',$key' OR RIGHT(voteoption, 3)=',$key')");
                                                $voterids = $comma = '';
                                                while($u = $db['source']->fetch_assoc($query3)) {
                                                        $voterids .= $comma.$u['userid'];
                                                        $comma = "\t";
                                                }

                                                $votes = $votenums[$key];
                                                $db['discuz']->query("INSERT INTO {$discuz_tablepre}polloptions (`tid`, `votes`, `polloption`, `voterids`) VALUES('$tid', '$votes', '$polloption', '$voterids');");
                                        }
                                }
                        }
                        if($t['issmstopic']) {
                                $db['discuz']->query("UPDATE {$discuz_tablepre}threads SET special=2 WHERE tid='$tid'");
                        }
                        $convertedrows ++;
                } else {
                        reportlog("无法转换主题 tid = $tid subject = '$subject',SQL 语句如下 :<br><textarea rows=\"3\" style=\"width: 100%;\">".$sql1."</textarea>");
                }
                $converted = 1;
                $totalrows ++;
        }

        if($converted || $end < $maxid) {
                altertable('threads', 'tid');
                altertable('polls', 'tid');
                altertable('polloptions', 'tid');
        }

?>

有什么问题?
回复

使用道具 举报

 楼主| 孤独的阿狼 发表于 2008-5-27 10:26:40 | 显示全部楼层
桃子偏心啊,最近一直更新动网各版本到UC的升级程序,但是升级到6.0的程序一直没再更新,动网8.0 sql的算是更新的最晚的,4月16日

dvbbsphp20 - uc——5月15日
dvbbs80sql - uc——5月16日
dvbbs80ac - uc——5月16日
dvbbs71ac - uc——5月23日
dvbbs71sql - uc——5月23日
回复

使用道具 举报

 楼主| 孤独的阿狼 发表于 2008-5-27 23:40:58 | 显示全部楼层
开启调试模式,转到第三步投票部分的时候,提示:
SELECT voteid,vote,votenum,votetype,lockvote,voters,timeout FROM dv_vote Where voteID=8
Errormsg: MSSQL ERROR

该表中的ntext字段已经改为text类型。

第一次出错的时候删掉了一个投票了,再转发现第二个(voteid=8)又出错了,如此下去我的投票帖都删光了才不会出错。
回复

使用道具 举报

 楼主| 孤独的阿狼 发表于 2008-5-28 15:59:01 | 显示全部楼层
刚刚发现一件很强的事情,我把数据库脱机后转换程序仍然报错,我把数据库分离后转换程序仍然坚持报错!

看来多次转换不成功和数据库的缓存有一定的关系,下班后人少的时候试试。
回复

使用道具 举报

 楼主| 孤独的阿狼 发表于 2008-5-31 02:27:12 | 显示全部楼层
还是得自力更生艰苦奋斗,找了个MSSQL 2000 SP4,抽空到另一台服务器上安上,怀疑两个相同的库在一个服务器上互相影响,数据都一直放在内存里。
回复

使用道具 举报

 楼主| 孤独的阿狼 发表于 2008-6-2 22:31:00 | 显示全部楼层

终于出来一个新的错误

SQL:SELECT userid FROM dv_voteuser WHERE voteid=8 AND (voteoption='0' OR LEFT(voteoption, 2)='0,' OR LEFT(voteoption, 3)='0,' OR CHARINDEX(',0,', voteoption)>0 OR RIGHT(voteoption, 2)=',0' OR RIGHT(voteoption, 3)=',0')
Errormsg: MSSQL ERROR

尝试在查询管理器中执行上面的语句,得到如下结果:

服务器: 消息 306,级别 16,状态 1,行 1
不能比较或排序 text、ntext 和 image 数据类型,除非使用 IS NULL 或 LIKE 运算符。
服务器: 消息 8116,级别 16,状态 1,行 1
函数 left 的参数 1 的数据类型 text 无效。
服务器: 消息 8116,级别 16,状态 1,行 1
函数 left 的参数 1 的数据类型 text 无效。
服务器: 消息 8116,级别 16,状态 1,行 1
函数 right 的参数 1 的数据类型 text 无效。
服务器: 消息 8116,级别 16,状态 1,行 1
函数 right 的参数 1 的数据类型 text 无效。

而官方转换程序上说把所有的 ntext  改为 text !而 text 是不能比较的!

既然问题明白了,那就找一个可以比较的字段类型吧,尝试改为 char ,再运行转换程序,不这报错!再进MySQL数据库看, polls 和 polloptions 两个表中都有数据了。具体转的对不对且不说,改为 char 是正确的。

官方的程序居然有如此大的问题,如果不细查的话就当是转换成功了,默认是非调试模式的,也看不出问题来。

建议官方更新1.2.0版升级程序,不要耽误更多从动网投靠DZ的兄弟,其实很简单,只是需要加一句:将 voteuser 表中的 voteoption 字段改为 char 类型。

请官方核实后更改。
回复

使用道具 举报

 楼主| 孤独的阿狼 发表于 2008-6-2 22:53:58 | 显示全部楼层
不过转完点了一下数,少了很多,还是没转完全,还得继续找问题
回复

使用道具 举报

桃子(小敏) 发表于 2008-6-3 09:33:08 | 显示全部楼层
非常感谢您提出问题,我需要测试下,然后给您回复
回复

使用道具 举报

 楼主| 孤独的阿狼 发表于 2008-6-4 09:14:15 | 显示全部楼层
继续等桃子的新程序,抱抱桃子,大家不要嫉妒哦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2025-9-15 16:59 , Processed in 0.124147 second(s), 15 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表