พบผู้ใช้ที่มี uid ของ 0 (ศูนย์) ในตารางผู้ใช้… huh?


9

เป็นเรื่องปกติหรือไม่ที่จะมีผู้ใช้ที่มี uid เป็น 0 ในตารางผู้ใช้

คำตอบ:


17

เป็นเรื่องปกติเนื่องจาก Drupal สร้างรายการนั้นเมื่อติดตั้งไว้สำหรับผู้ใช้ที่ไม่ระบุชื่อ ทำจากuser_install () (Drupal 7) หรือsystem_install ()ซึ่งมีรหัสต่อไปนี้

  // Drupal 7.
  // Insert a row for the anonymous user.
  db_insert('users')
    ->fields(array(
    'uid' => 0, 
    'name' => '', 
    'mail' => '',
  ))
    ->execute();

  // Drupal 6.
  // Inserting uid 0 here confuses MySQL -- the next user might be created as
  // uid 2 which is not what we want. So we insert the first user here, the
  // anonymous user. uid is 1 here for now, but very soon it will be changed
  // to 0.
  db_query("INSERT INTO {users} (name, mail) VALUES('%s', '%s')", '', '');
  // …
  // This sets the above two users uid 0 (anonymous). We avoid an explicit 0
  // otherwise MySQL might insert the next auto_increment value.
  db_query("UPDATE {users} SET uid = uid - uid WHERE name = '%s'", '');  

โดยปกติแล้วรายการนั้นจะใช้เมื่อรวมข้อมูลที่มีอยู่ในตาราง "โหนด" กับข้อมูลที่มีอยู่ในตาราง "ผู้ใช้"

การไม่มีรายการนั้นจะทำให้ Drupal ทำงานไม่ถูกต้องในบางสถานการณ์

หากคุณต้องการกู้คืนข้อมูลผู้ใช้ที่ไม่ระบุชื่อในฐานข้อมูลฉันจะใช้รหัสคล้ายกับที่ดำเนินการจาก Drupal โดยเฉพาะอย่างยิ่งสำหรับ Drupal 6 ฉันจะรันโค้ดต่อไปนี้

  • หากข้อมูลสำหรับผู้ใช้ที่ไม่ระบุชื่อมีอยู่แล้วในฐานข้อมูล แต่ ID ผู้ใช้ไม่ใช่ 0:

    db_query("UPDATE {users} SET uid = uid - uid WHERE name = '%s'", '');
  • หากไม่มีข้อมูลสำหรับผู้ใช้ที่ไม่ระบุชื่อแม้จะมี ID ผู้ใช้ที่ไม่ถูกต้อง:

    db_query("INSERT INTO {users} (name, mail) VALUES('%s', '%s')", '', '');
    db_query("UPDATE {users} SET uid = uid - uid WHERE name = '%s'", '');

หากคุณต้องการกู้คืนข้อมูลผู้ใช้โดยไม่ระบุชื่อโดยอัตโนมัติคุณสามารถนำไปใช้hook_cron()ในโมดูลที่กำหนดเองและรันโค้ดที่คล้ายกับข้อมูลต่อไปนี้ (รหัสสำหรับ Drupal 6)

function mymodule_cron() {
  $uid = db_result(db_query("SELECT uid FROM {users} WHERE name = '%s'", ''));

  if ($uid === FALSE) {
    // The data has not been found in the database; re-create the row.
    db_query("INSERT INTO {users} (name, mail) VALUES('%s', '%s')", '', '');
  }

  db_query("UPDATE {users} SET uid = uid - uid WHERE name = '%s'", '');
}

หากคุณให้น้ำหนักที่น้อยลงการใช้งานของโมดูลhook_cron()จะถูกดำเนินการก่อนการนำไปใช้งานอื่นและสิ่งนี้จะหลีกเลี่ยงไม่ได้เนื่องจากแถวที่หายไปในฐานข้อมูล


ฉันไม่ได้เตรียมการมาก่อน ... : | นั่งอยู่นานหลายชั่วโมงโดยคิดว่าทำไมมีบางโพสต์มี (ฉันคิดว่ามันเป็นข้อผิดพลาดในการถ่ายโอนข้อมูลของฉันในตอนแรกและเพียงแค่ลบมัน: O) สถานการณ์อะไรบ้าง มีทรัพยากรอะไรบนนั้น?
jayarjo

ฉันขยายคำตอบของฉัน โดยปกติจะใช้เมื่อรับข้อมูลเกี่ยวกับผู้สร้างโหนด
kiamlaluno

1
นอกจากนี้ยังนำไปสู่คำเตือนที่น่ารังเกียจเมื่อใช้ cron และอินสแตนซ์อื่น ๆ ดังนั้นคุณควรเพิ่มแถวนั้นอีกครั้ง
Berdir

3
หากคุณจำเป็นต้องเรียกคืนผู้ใช้ที่ไม่ระบุชื่อเรียกใช้ SQL นี้กับฐานข้อมูลควรจะพอเพียง:INSERT INTO users (uid, name, mail) VALUES(0, '', '')
marcvangend

ฉันรู้สึกว่ามันเป็นแฮ็คบางชนิดนั่นคือเหตุผลที่ฉันคิดว่ามันแปลกและลบออก แต่ตอนนี้ฉันได้รับการพิสูจน์เรื่องนี้ขณะที่ฉันกำลังส่งออกฐานข้อมูลของฉันในโหมดความเข้ากันได้ของ MYSQL40 (เซิร์ฟเวอร์โฮสติ้งที่ใช้ร่วมกันแบบใบ้บางส่วน) มันถูกนำเข้าเป็นค่าเพิ่มอัตโนมัติถัดไป (7) หากฉันไม่ได้บังเอิญเจอสิ่งนี้ฉันจะไม่มีทางรู้ว่าเกิดอะไรผิดพลาดและสงสัยว่าจะมีโพสต์ที่หายไปนาน
เท่าใด

2

โดยค่าเริ่มต้นผู้ใช้ที่ไม่ระบุชื่อคือ 0 และนี่คือผู้ใช้คนแรกที่ปรากฏในตารางผู้ใช้ในเวลาที่ติดตั้ง drupal และรหัสผู้ดูแลระบบจะเป็น 1 และเขาจะเป็นผู้ใช้รายที่สองในตารางผู้ใช้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.