经分析,发现在 pre_forum_post中有两个主键,一个是Tid,一个position。可能是升级没有处理好,导致Position中的值不正确。观看如下结果: 
SELECTpid,fid,tid,first,,dateline,FROM_UNIXTIME(dateline) as sj,position FROM `pre_forum_post`where tid=155346 order by dateline; 
 
 
 
 
 
发现,可以按时间升序排列来修正此错误。 
因此可以做如下简单处理以解决楼层错乱问题 
1、后台关闭网站,以防在处理期间有人发帖子。 
2、修改表中关键字,将Position的主键和自动增长取消。保存。 
3、执行如下程序: 
- @set_time_limit(0);
 
 - //connection to db
 
 - $mysql_server_name='localhost';
 
 - $mysql_username='root';   //改成自己的用户名
 
 - $mysql_password='12345678';  //改成自己的密码
 
 - $mysql_database='dbname';  //改成自己的数据库名字
 
 - $conn=mysql_connect($mysql_server_name,$mysql_username,$mysql_password);
 
 - mysql_select_db($mysql_database,$conn);
 
 - $table_name="pre_forum_post";   //改成自己的数据表名称
 
  
- //to correct the error on floors in topics
 
 - $sql = "SELECT tid FROM $table_nameWHERE first=1 AND position>1";
 
 - $result=mysql_query($sql,$conn);
 
 - while ($row=mysql_fetch_array($result))
 
 - {
 
 -        $n=1;
 
 -        $sql="selectpid from $table_name where tid=" . $row["tid"] . " order bydateline asc";
 
 -        $rs=mysql_query($sql,$conn);
 
 -        while($r=mysql_fetch_array($rs))
 
 -        {
 
 -           $sql="update $table_name setposition=" . $n . " where pid=" . $r["pid"];
 
 -           mysql_query($sql);
 
 -           $n++;
 
 -        }//end while $r
 
 -        mysql_free_result($rs);
 
 - } // end while $row
 
 - echo "
 
 - done with records:" . mysql_num_rows($result);
 
 - mysql_free_result($result);
 
 - mysql_close($conn);
 
 - ?>
 
 
  复制代码 楼层错误数量多的,可以分批执行。 
水平有限,程序执行效率不高,希望大能来指导。 
 
4、恢复数据表Pre_forum_post中Position为主键、自增 
 
刷新有问题的页面,发现已解决。 
 
 |