Resync Member (Discuz)

From P&T Knowledgebase
Revision as of 23:16, 7 November 2010 by Admin (talk | contribs) (Created page with "category:Discuz เนื่องจากได้อัพเกรด Discuz ให้ลูกค้ารายหนึ่ง จากเวอร์ชั่น X1 ...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

เนื่องจากได้อัพเกรด Discuz ให้ลูกค้ารายหนึ่ง จากเวอร์ชั่น X1 เป็น X1.5 ปรากฏว่ามีปัญหาเข้าสู่ระบบกันไม่ได้ เวลาล๊อคอินจะขึ้นว่ารหัสผ่านไม่ถูกต้อง หลังจากที่ตรวจสอบ พบว่าสมาชิกที่ไม่สามารถล๊อคอินได้ จะไม่มีข้อมูลอยู่ในตาราง members (แต่จะมีข้อมูลอยู่ในตาราง common_member เท่านั้น). ดังนั้นวิธีการแก้ไขปัญหา คือ คัดลอกสมาชิกจาก common_member ไปยัง members เพื่อให้มีข้อมูลในทั้ง 2 ตาราง แล้วรัน query เพื่อปรับข้อมูลสมาชิกที่ uid ไม่ตรงกัน.

คัดลอกสมาชิกจาก common_member ไปยัง members

Query สำหรับคัดลอกสมาชิกที่หายไป (ยังไม่สามารถใช้รหัสผ่านเก่าได้ เพราะไม่รู้กระบวนการเข้ารหัสแบบเดิม) query นี้จะกำหนดรหัสผ่านใหม่โดยการสุ่มเลย ดังนั้นสำหรับสมาชิกที่มีปัญหา จะต้องกดลืมรหัสผ่านที่หน้าเว็บ เพื่อขอรหัสผ่านใหม่ เพื่อนำมาใช้ล๊อคอิน

INSERT INTO `members`
(
  `uid`, 
  `username`, 
  `password`,  
  `email`,  
  `regdate`,  
  `salt`
)
SELECT
  `common_member`.`uid`, 
  `common_member`.`username`, 
  MD5(CONCAT(MD5(MD5(RAND())), SUBSTR(MD5(`common_member`.`username`), 1, 6))) AS `password`, 
  `common_member`.`email`, 
  `common_member`.`regdate`, 
  SUBSTR(MD5(`common_member`.`username`), 1, 6) AS `salt`
FROM `common_member`
LEFT JOIN `members` USING (`username`)
WHERE `members`.`uid` IS NULL;

หมายเหตุ: query นี้ใช้ username ในการสร้าง salt ดังนั้นเพื่อความปลอดภัยยิ่งขึ้น สามารถเปลี่ยนตรงส่วนของการสร้าง salt ในสไตล์ของคุณเอง เพื่อให้คนอื่นเดาไม่ได้

ปัญหา UID ไม่ตรงกัน

มีสมาชิกอีกส่วนหนึ่ง ที่มีข้อมูลอยู่ในทั้งสองตาราง แต่ uid ไม่ตรงกัน สำหรับกลุ่มนี้ ก็จะล๊อคอินไม่ได้เหมือนกัน (แต่จะคนละอาการกัน คือล๊อคอินแล้ว redirect ไปที่อีกหน้านึง แล้วให้ใส่ code ใหม่) อันนี้สามารถแก้ไขได้ง่ายๆ เพียงใช้ query เดียว เพื่ออัพเดท uid ของตาราง members ให้ตรงกับ uid ของตาราง common_member

UPDATE `members`
JOIN `common_member` ON (common_member.username=members.username)
SET members.uid = common_member.uid
WHERE common_member.uid <> members.uid


ข้อมูลอื่นๆ ที่ใช้สำหรับการแก้ปัญหา

ไฟล์ config

ต้องดูไฟล์พวกนี้ เพื่อใช้ table prefix

  • ไฟล์ config ของ discuz คือ config_global.php
  • ไฟล์ config ของ ucenter คือ config_ucenter.php

การใช้ salt ในการเข้ารหัส password ของ ucenter

$password = md5( md5($original-password) . $salt );

Query

เช็คว่ามี member กี่คน ที่ไม่มีข้อมูลใน ตาราง members

SELECT count(*) FROM `common_member`
LEFT JOIN `members` USING (`uid`)
WHERE `members`.`uid` IS NULL;

อื่นๆ

  • เหมือนว่า common_member.password จะไม่ได้ถูกใช้เลย ดังนั้นไม่ต้องสนใจก็ได้