У таблиці користувачів знайдено користувач з uid 0 (нуль)… так?


9

Чи нормально користуватися користувачем з uid 0 в таблиці користувачів?

Відповіді:


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). Які обставини? Будь-який ресурс на цьому?
jayarjo

Я розширив свою відповідь. Зазвичай він використовується при отриманні даних про авторів вузлів.
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.