Czy to normalne, że użytkownik ma identyfikator użytkownika o wartości 0 w tabeli użytkowników?
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.
INSERT INTO users (uid, name, mail) VALUES(0, '', '')
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.
źródło