Нормально ли иметь пользователя с uid 0 в таблице users?
Это нормально, так как 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()
будет выполняться раньше других реализаций, и это позволит избежать их сбоя из-за отсутствующей строки в базе данных.
INSERT INTO users (uid, name, mail) VALUES(0, '', '')
По умолчанию анонимный пользователь равен 0, и это первый пользователь, присутствующий в таблице пользователей во время установки drupal, а идентификатор администратора будет равен 1, и он будет вторым пользователем в таблице пользователей.
источник