论坛风格切换
  • 3613阅读
  • 5回复

想问一个SQL的写法 [复制链接]

上一主题 下一主题
离线太史慈
 

发帖
766
金币
626
威望
556
只看楼主 倒序阅读 使用道具 楼主  发表于: 2011-08-21
一个论坛,想把除了发过主题和发过回复的会员,其他会员都删除掉
怎么完整且安全地把pw_members和pw_memberdata的信息清除?
欢迎大家自由讨论:
[url=http://www.phpwind.com]phpwind[/url]
离线rickyleo

发帖
315
金币
0
威望
99
只看该作者 沙发  发表于: 2011-08-21
主要是计算没有发帖的会员UID啦
(1)、后台更新会员发帖数缓存更新一次,将pw_memberdata中postnum为0的uid计算出来。可以不用脚本跑,将uid筛选出来,放在编辑器里边处理下用逗号隔开 再从所有有这些会员id相关的数据表的数据都删除掉
(2)、脚本方法边跑边执行删除操作
离线太史慈

发帖
766
金币
626
威望
556
只看该作者 板凳  发表于: 2011-08-22
还要考虑分表的情况。。。pw_posts1,pw_posts2
[url=http://www.phpwind.com]phpwind[/url]
离线太史慈

发帖
766
金币
626
威望
556
只看该作者 地板  发表于: 2011-08-22
临时解决方法
  1. <?php
  2. error_reporting(0);
  3. define('P_W',1);
  4. define('PW_UPLOAD',1);
  5. define('R_P',getdirname(__FILE__));
  6. define('D_P',R_P);
  7. require_once(R_P.'require/common.php');
  8. include_once(D_P.'data/bbscache/config.php');
  9. //require_once(R_P.'admin/cache.php');
  10. $basename = 'http://'.$_SERVER['HTTP_HOST'].(isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME']);
  11. @header("Content-Type:text/html; charset=$db_charset");
  12. include_once(D_P.'data/sql_config.php');
  13. if ($database=='mysqli' && Pwloaddl('mysqli')===false) {
  14. $database = 'mysql';
  15. }
  16. require_once Pcv(R_P."require/db_$database.php");
  17. $db = new DB($dbhost,$dbuser,$dbpw,$dbname,$PW,$charset,$pconnect);
  18. $action = $_GET['action'];
  19. $start = $_GET['start'];
  20. $s_c = $_GET['s_c'];
  21. if(!$action){
  22.     $action = 'step1';
  23. }
  24. if(!$start){
  25.     $start = 0;
  26. }
  27. if(!$s_c){
  28.     $s_c = 0;
  29. }
  30. $percount = 1500;
  31. if ($action == 'step1')//先替换主题内容
  32. {
  33.     $query = $db->query("SELECT uid FROM pw_members WHERE uid>$start ORDER BY uid LIMIT $percount");
  34.     while ($rt = $db->fetch_array($query))
  35.     {
  36.   $lastid = $rt['uid'];
  37.         //$pw_tmsgs = GetTtable($rt['tid']);//分表尚未处理,一般用不到吧?
  38.         $check_threads = $db->get_one("SELECT authorid FROM pw_threads WHERE authorid='".$rt['uid']."'");
  39.         $check_posts = $db->get_one("SELECT authorid FROM pw_posts WHERE authorid='".$rt['uid']."'");
  40.         $check_posts1 = $db->get_one("SELECT authorid FROM pw_posts1 WHERE authorid='".$rt['uid']."'");
  41.         $check_posts2 = $db->get_one("SELECT authorid FROM pw_posts2 WHERE authorid='".$rt['uid']."'");
  42.         $check_posts3 = $db->get_one("SELECT authorid FROM pw_posts3 WHERE authorid='".$rt['uid']."'");
  43.         if(!$check_threads && !$check_posts && !$check_posts1 && !$check_posts2 && !$check_posts3){
  44.             //echo "DELETE FROM pw_members WHERE uid='".$rt['uid']."'";exit;
  45.             $db->update("DELETE FROM pw_members WHERE uid='".$rt['uid']."'");
  46.             $db->update("DELETE FROM pw_memberdata WHERE uid='".$rt['uid']."'");
  47.             $db->update("DELETE FROM pw_memberinfo WHERE uid='".$rt['uid']."'");
  48.         }
  49.     }
  50.     $maxid = $db->get_value("SELECT max(uid) FROM pw_members");
  51.     echo '当前'.$lastid.'<br />最大 '.$maxid;
  52.     if($maxid > $lastid){
  53.   echo "<meta http-equiv='refresh' content='1;url=$basename?action=$action&start=$lastid&s_c=$s_c'>";
  54. }else{
  55.   echo "<meta http-equiv='refresh' content='1;url=$basename?action=posts'>";
  56. }
  57. }
  58. function getdirname($path=null){
  59. if (!empty($path)) {
  60.   if (strpos($path,'\\')!==false) {
  61.    return substr($path,0,strrpos($path,'\\')).'/';
  62.   } elseif (strpos($path,'/')!==false) {
  63.    return substr($path,0,strrpos($path,'/')).'/';
  64.   }
  65. }
  66. return './';
  67. }
  68. ?>

[url=http://www.phpwind.com]phpwind[/url]
离线沈磊

发帖
43
金币
0
威望
94
只看该作者 4楼 发表于: 2011-08-22
    
离线谯周

发帖
142
金币
0
威望
55
只看该作者 5楼 发表于: 2011-08-25
这个其实很简单,反过来思考,先把有发过帖子和回复的uid找出来,其他的就是没有发过的啦,用pw_members和pw_threads/pw_posts进行右联接
快速回复
限100 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
提到某人:
选择好友
上一个 下一个