Найден пользователь с uid 0 (ноль) в таблице пользователей… а?


9

Нормально ли иметь пользователя с uid 0 в таблице users?

Ответы:


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 я бы выполнил следующий код.

  • Если данные для анонимных пользователей уже существуют в базе данных, но идентификатор пользователя не равен 0:

    db_query("UPDATE {users} SET uid = uid - uid WHERE name = '%s'", '');
  • Если данные для анонимного пользователя не существуют, даже с неверным идентификатором пользователя:

    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). Каковы обстоятельства? Любой ресурс по этому поводу?
Джаярджо

Я расширил свой ответ. Обычно используется при получении данных об авторах узлов.
kiamlaluno

1
Это также приводит к неприятным предупреждениям при запуске cron и других инстансах. Таким образом, вы должны действительно добавить этот ряд.
Бердир

3
Если вам нужно восстановить анонимного пользователя, достаточно запустить SQL в базе данных:INSERT INTO users (uid, name, mail) VALUES(0, '', '')
marcvangend

Я чувствовал, что это какой-то хак, поэтому подумал, что это странно, и удалил его. Но теперь я получил подтверждение этого, когда я экспортировал свою базу данных в режиме совместимости с MYSQL40 (какой-то тупой сервер общего хостинга), она была импортирована как следующее значение автоинкремента (7). Если бы я случайно не наткнулся на эту вещь, я бы никогда не узнал, что пошло не так, и удивился бы пропавшим сообщениям на неопределенное время :( Не верно ...
jayarjo

2

По умолчанию анонимный пользователь равен 0, и это первый пользователь, присутствующий в таблице пользователей во время установки drupal, а идентификатор администратора будет равен 1, и он будет вторым пользователем в таблице пользователей.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.