Znaleziono użytkownika o identyfikatorze użytkownika 0 (zero) w tabeli użytkowników… huh?

9

Czy to normalne, że użytkownik ma identyfikator użytkownika o wartości 0 w tabeli użytkowników?

jayarjo
źródło

Odpowiedzi:

17

Jest to normalne, ponieważ Drupal tworzy ten wpis podczas instalacji dla anonimowego użytkownika. Odbywa się to za pomocą user_install () (Drupal 7) lub system_install () , które zawierają następujący kod.

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

Wpis ten jest zwykle używany przy łączeniu danych zawartych w tabeli „węzeł” z danymi zawartymi w tabeli „użytkownicy”.

Brak tego wpisu spowodowałby, że Drupal nie działałby poprawnie w niektórych okolicznościach.

Jeśli potrzebujesz przywrócić anonimowe dane użytkownika w bazie danych, wykonałbym kod podobny do tego wykonanego z Drupala. W szczególności dla Drupala 6 wykonałbym następujący kod.

  • Jeśli dane anonimowych użytkowników już istnieją w bazie danych, ale ID użytkownika nie ma wartości 0:

    db_query("UPDATE {users} SET uid = uid - uid WHERE name = '%s'", '');
  • Jeśli dane anonimowego użytkownika nie istnieją, nawet z niewłaściwym identyfikatorem użytkownika:

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

Jeśli chcesz automatycznie przywrócić anonimowe dane użytkownika, możesz zaimplementować hook_cron()moduł niestandardowy i wykonać kod podobny do następującego. (Kod dotyczy Drupala 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'", '');
}

Jeśli nadasz modułowi mniejszą wagę, jego implementacja hook_cron()zostanie wykonana przed innymi implementacjami, co pozwoli uniknąć porażki, ponieważ brakuje wiersza w bazie danych.

kiamlaluno
źródło
Nie byłem przygotowany na ten zwrot ...: | Godzinami siedziałem i zastanawiałem się, dlaczego niektóre posty go mają (początkowo myślałem, że to błąd w moim zrzutu i po prostu go usunąłem: O). Jakie są okoliczności? Jakieś zasoby na ten temat?
jayarjo
Rozszerzyłem swoją odpowiedź. Zwykle jest używany podczas uzyskiwania danych o autorach węzłów.
kiamlaluno
1
Prowadzi to również do nieprzyjemnych ostrzeżeń podczas uruchamiania crona i innych instancji. Więc naprawdę powinieneś ponownie dodać ten wiersz.
Berdir
3
Jeśli chcesz przywrócić anonimowego użytkownika, wystarczy uruchomić ten SQL w bazie danych:INSERT INTO users (uid, name, mail) VALUES(0, '', '')
marcvangend
Czułem, że to jakiś hack, dlatego pomyślałem, że to dziwne i usunąłem go. Ale teraz dowiedziałem się o tym, gdy eksportowałem moją bazę danych w trybie zgodności MYSQL40 (jakiś głupi, współdzielony serwer hostingowy), został zaimportowany jako następna wartość automatycznego przyrostu (7). Gdybym nie przypadkowo natknął się na to, nigdy nie wiedziałbym, co poszło nie tak i zastanawiałbym się nad zniknięciem postów na czas nieokreślony :( Nieprawidłowe ...
jayarjo
2

Domyślnie anonimowy użytkownik ma wartość 0 i jest to pierwszy użytkownik obecny w tabeli użytkowników w momencie instalacji drupala, a identyfikator administratora to 1, a on będzie drugim użytkownikiem w tabeli użytkowników.

Satya
źródło