เป็นเรื่องปกติหรือไม่ที่จะมีผู้ใช้ที่มี uid เป็น 0 ในตารางผู้ใช้
เป็นเรื่องปกติหรือไม่ที่จะมีผู้ใช้ที่มี uid เป็น 0 ในตารางผู้ใช้
คำตอบ:
เป็นเรื่องปกติเนื่องจาก 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()
จะถูกดำเนินการก่อนการนำไปใช้งานอื่นและสิ่งนี้จะหลีกเลี่ยงไม่ได้เนื่องจากแถวที่หายไปในฐานข้อมูล
INSERT INTO users (uid, name, mail) VALUES(0, '', '')
โดยค่าเริ่มต้นผู้ใช้ที่ไม่ระบุชื่อคือ 0 และนี่คือผู้ใช้คนแรกที่ปรากฏในตารางผู้ใช้ในเวลาที่ติดตั้ง drupal และรหัสผู้ดูแลระบบจะเป็น 1 และเขาจะเป็นผู้ใช้รายที่สองในตารางผู้ใช้