Tìm thấy người dùng có uid bằng 0 (không) trong bảng người dùng hả?


9

Có bình thường khi có người dùng có uid bằng 0 trong bảng người dùng không?

Câu trả lời:


17

Điều đó là bình thường, vì Drupal tạo ra mục nhập đó khi nó được cài đặt, cho người dùng ẩn danh. Điều đó được thực hiện từ user_install () (Drupal 7) hoặc system_install () , chứa mã sau đây.

  // 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'", '');  

Mục nhập đó thường được sử dụng khi nối dữ liệu chứa trong bảng "nút" với dữ liệu chứa trong bảng "người dùng".

Không có mục đó sẽ khiến Drupal không hoạt động chính xác trong một số trường hợp.

Nếu bạn cần khôi phục dữ liệu người dùng ẩn danh trong cơ sở dữ liệu, tôi sẽ thực thi mã tương tự như mã được thực thi từ Drupal. Đặc biệt, đối với Drupal 6, tôi sẽ thực thi đoạn mã sau.

  • Nếu dữ liệu cho người dùng ẩn danh đã tồn tại trong cơ sở dữ liệu, nhưng ID người dùng không phải là 0:

    db_query("UPDATE {users} SET uid = uid - uid WHERE name = '%s'", '');
  • Nếu dữ liệu cho người dùng ẩn danh không tồn tại, ngay cả với ID người dùng sai:

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

Nếu bạn muốn tự động khôi phục dữ liệu người dùng ẩn danh, bạn có thể triển khai hook_cron()trong một mô-đun tùy chỉnh và thực thi mã tương tự như sau. (Mã này dành cho 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'", '');
}

Nếu bạn cung cấp cho mô-đun trọng lượng thấp hơn, việc triển khai mô-đun hook_cron()sẽ được thực hiện trước các triển khai khác và điều này sẽ tránh được việc chúng sẽ thất bại vì hàng bị thiếu trong cơ sở dữ liệu.


Tôi đã không chuẩn bị cho vòng xoắn này ...: | Đã ngồi hàng giờ để suy nghĩ tại sao một số bài đăng có nó (tôi nghĩ rằng đó là một lỗi trong bãi rác của tôi ban đầu và chỉ đơn giản là loại bỏ nó: O). Hoàn cảnh là gì? Bất kỳ tài nguyên trên đó?
jayarjo

Tôi mở rộng câu trả lời của mình. Nó thường được sử dụng khi lấy dữ liệu về các tác giả của các nút.
kiamlaluno

1
Nó cũng dẫn đến những cảnh báo khó chịu khi chạy cron và các trường hợp khác. Vì vậy, bạn thực sự nên thêm lại hàng đó.
Berdir

3
Nếu bạn cần khôi phục người dùng ẩn danh, việc chạy SQL này trên cơ sở dữ liệu sẽ đủ:INSERT INTO users (uid, name, mail) VALUES(0, '', '')
marcvangend

Tôi cảm thấy nó là một loại hack, đó là lý do tại sao tôi nghĩ rằng nó là lạ và loại bỏ nó. Nhưng bây giờ tôi đã chứng minh điều này khi tôi xuất cơ sở dữ liệu của mình ở chế độ tương thích MYSQL40 (một số máy chủ lưu trữ chia sẻ câm), nó đã được nhập dưới dạng giá trị tăng tự động tiếp theo (7). Nếu tôi vô tình vấp phải điều này, tôi sẽ không bao giờ biết được chuyện gì đã xảy ra và sẽ tự hỏi về những bài viết biến mất trong khoảng thời gian không xác định :( Không đúng ...
jayarjo

2

Theo mặc định, người dùng ẩn danh là 0 và đây là người dùng đầu tiên có mặt trong bảng người dùng tại thời điểm cài đặt drupal và id quản trị viên sẽ là 1 và anh ta sẽ là người dùng thứ hai trong bảng người dùng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.