左右不逢缘 发表于 2023-5-7 07:42:31

求教大侠们:PW8.7转dz3.0在最后统计用户精华帖数这步报错

服务器软件      Apache/2.2.19 (Win32) PHP/5.2.17
服务器 MySQL 版本      5.0.90-community-nt

PW8.7转dz3.0,基本还算顺利,除了原来新鲜事的回复不能导入,其他基本都成功了,在最后统计用户精华帖数这步报错(在转换程序\cache\lock目录下,有个converterror.php,记录了所有转换错误,正在转的小伙伴们可以去查看一下。)报错代码如下:
<?PHP exit;?>      2023-05-04 12:10:52      /tox3/index.php?mod=stats&do=memberdigests&op=detail&current=6000&pertask=3000      <b>XConvert info</b>: MySQL Query Error<br /> <br /> <b>Time</b>: 2023-5-4 12:10pm<br /> <b>SQL</b>: UPDATE x3gbk.common_member_count SET digestposts=digestposts+'6' WHERE uid IN (,17586,24053,6363)<br /> <b>Error</b>: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '17586,24053,6363)' at line 1<br /> <b>Errormsg.</b>: <br /> <b>Errno.</b>: 1064<br />


Crystαl 发表于 2023-5-7 07:43:23

我查找了一下,代码文件在安装目录\source\module下面的stats.inc.php的第130行里,不知道是不是代码有问题,麻烦大侠们给指点一下!
//统计用户精华帖数                        $membersarray = $postsarray = array();                        if($xc->config['db']['discuz_type'] == 'x') {                              $xc->db['discuz']->query("UPDATE {$discuz_tablepre}common_member_count SET digestposts=0", 'UNBUFFERED');                        }                                                $maxtid = $xc->db['discuz']->result($xc->db['discuz']->query("SELECT max(tid) FROM {$discuz_tablepre}".($xc->config['db']['discuz_type'] == 'x' ? "forum_thread": "threads")." WHERE digest<>'0' AND displayorder>='0'"), 0);                        if($current <= $maxtid) {                              $processed = 1;                        }                        $query = $xc->db['discuz']->query("SELECT authorid FROM {$discuz_tablepre}".($xc->config['db']['discuz_type'] == 'x' ? "forum_thread": "threads")." WHERE digest<>'0' AND displayorder>='0' AND tid >= $current AND tid < $current + $pertask");                        while($thread = $xc->db['discuz']->fetch_array($query)) {                              $thread['authorid'] && $membersarray[$thread['authorid']]++;                              $processed = 1;                        }                                                $extra_str = '';                        foreach($membersarray as $uid => $posts) {                              $postsarray[$posts] .= $extra_str.$uid;                              $extra_str = ',';                        }                        unset($membersarray);                        foreach($postsarray as $posts => $uids) {                              $xc->db['discuz']->query("UPDATE {$discuz_tablepre}".($xc->config['db']['discuz_type'] == 'x' ? "common_member_count": "members")." SET digestposts=digestposts+'$posts' WHERE uid IN ($uids)", 'UNBUFFERED');                        }                        if($processed) {                              $show_message =$xc->language['stats_donig'].' '.$xc->language['stats_from'].$current.$xc->language['stats_to'].$next.$xc->language['stats_rowdata'];                              $show_message .= "<div id="checkflag" name="checkflag" style="width: 0px;height: 0px;overflow:auto;">ok</div>";                              $show_url = 'index.php?mod=stats&do='.$do.'&op=detail&current='.$next.'&pertask='.$pertask;                              $show_message .= "<p><a href="".$show_url."">".$xc->language['message_redirect']."</a></p><div align="right">[<a href="index.php?mod=stats&do=".$do."&op=detail&isstop=1style="color:red">".$xc->language['message_stop']."</a>]</div><script>setTimeout("redirect('".$show_url."');", 1000);</script>";                        } else {                              $show_message = $xc->language['convert_ready'].$xc->language['stats_memberdigests_finish'].$xc->language['convert_date'].'......<br>';                              $show_message .= "<div id="checkflag" name="checkflag" style="width: 0px;height: 0px;overflow:auto;">ok</div>";                              $show_url = 'index.php?mod=stats&do=forumposts&op=detail';                              $show_message .= "<script>setTimeout("redirect('".$show_url."');", 1000);</script>";                        }                        file_put_contents(XCONVERT_ROOT.'./cache/lock/progress_stats.txt', $show_url);                } elseif($do == 'forumposts') {                        //统计版块的主题数、回复数、最后发表主题

Discuz智能体 发表于 2025-3-18 01:24:01

在PW8.7转DZ3.0的过程中,你遇到的错误是由于SQL语句的语法问题导致的。具体来说,错误信息显示在`UPDATE`语句中,`WHERE`子句的`uid IN`部分出现了问题。SQL语句中的`IN`子句要求提供一个有效的值列表,而你的SQL语句中出现了多余的逗号(`,`),导致语法错误。

### 错误分析:
UPDATE x3gbk.common_member_count SET digestposts=digestposts+'6' WHERE uid IN (,17586,24053,6363)
在这个SQL语句中,`IN`子句的开头有一个多余的逗号(`,`),导致MySQL无法正确解析这个语句。

### 解决方法:
你需要检查转换程序的代码,找到生成这个SQL语句的部分,并修复它。具体来说,你需要确保`IN`子句中的值列表是有效的,没有多余的逗号。

#### 1. 找到生成SQL语句的代码
通常,转换程序会有一个专门生成SQL语句的函数或方法。你需要找到这个部分,并检查`IN`子句的生成逻辑。

#### 2. 修复SQL语句
在生成`IN`子句时,确保值列表的开头没有多余的逗号。你可以通过以下方式修复:

// 假设 $uids 是一个包含用户ID的数组
$uids = array(17586, 24053, 6363);

// 将数组转换为逗号分隔的字符串
$uid_list = implode(',', $uids);

// 生成SQL语句
$sql = "UPDATE x3gbk.common_member_count SET digestposts=digestposts+'6' WHERE uid IN ($uid_list)";

#### 3. 重新运行转换程序
修复代码后,重新运行转换程序,看看是否还会出现同样的错误。

### 其他建议:
- **检查数据库版本兼容性**:你使用的MySQL版本是5.0.90,而DZ3.0可能对MySQL的版本有更高的要求。建议升级到MySQL 5.5或更高版本,以确保更好的兼容性。
- **备份数据**:在进行任何数据库操作之前,务必备份你的数据,以防止数据丢失。
- **调试信息**:如果问题依然存在,可以启用PHP的错误日志,查看更详细的错误信息,帮助定位问题。

希望这些建议能帮助你解决问题。如果还有其他问题,欢迎继续提问!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: 求教大侠们:PW8.7转dz3.0在最后统计用户精华帖数这步报错