Utilisateur trouvé avec uid de 0 (zéro) dans la table des utilisateurs… hein?

9

Est-il normal d'avoir un utilisateur avec un UID de 0 dans la table des utilisateurs?

jayarjo
la source

Réponses:

17

C'est normal, car Drupal crée cette entrée lors de son installation, pour l'utilisateur anonyme. Cela se fait depuis user_install () (Drupal 7), ou system_install () , qui contiennent le code suivant.

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

Cette entrée est normalement utilisée lors de la jonction des données contenues dans la table "node" avec les données contenues dans la table "users".

Ne pas avoir cette entrée pourrait empêcher Drupal de fonctionner correctement dans certaines circonstances.

Si vous devez restaurer les données utilisateur anonymes dans la base de données, j'exécuterai un code similaire à celui exécuté depuis Drupal. En particulier, pour Drupal 6, j'exécuterais le code suivant.

  • Si les données des utilisateurs anonymes existent déjà dans la base de données, mais que l'ID utilisateur n'est pas 0:

    db_query("UPDATE {users} SET uid = uid - uid WHERE name = '%s'", '');
  • Si les données de l'utilisateur anonyme n'existent pas, même avec le mauvais ID utilisateur:

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

Si vous souhaitez restaurer automatiquement les données utilisateur anonymes, vous pouvez implémenter hook_cron()dans un module personnalisé et exécuter du code similaire au suivant. (Le code est pour 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'", '');
}

Si vous donnez au module un poids inférieur, son implémentation de hook_cron()sera exécutée avant les autres implémentations, ce qui éviterait qu'elles échouent car la ligne manquante dans la base de données.

kiamlaluno
la source
Je n'étais pas préparé à cette torsion ...: | Était assis pendant des heures à penser pourquoi certains messages l'ont (je pensais que c'était un bug dans mon vidage au départ et je l'ai simplement supprimé: O). Quelles sont les circonstances? Une ressource à ce sujet?
jayarjo
J'ai élargi ma réponse. Il est normalement utilisé lors de l'obtention de données sur les auteurs des nœuds.
kiamlaluno
1
Cela conduit également à des avertissements désagréables lors de l'exécution de cron et d'autres instances. Vous devez donc vraiment rajouter cette ligne.
Berdir
3
Si vous devez restaurer l'utilisateur anonyme, l'exécution de ce SQL sur la base de données devrait suffire:INSERT INTO users (uid, name, mail) VALUES(0, '', '')
marcvangend
J'ai senti que c'était un hack en quelque sorte, c'est pourquoi j'ai pensé que c'était bizarre et je l'ai supprimé. Mais maintenant, j'en ai la preuve alors que j'exportais ma base de données en mode de compatibilité MYSQL40 (un serveur d'hébergement partagé stupide), elle a été importée comme prochaine valeur d'incrémentation automatique (7). Si je n'avais pas accidentellement trébuché sur cette chose, je n'aurais jamais su ce qui n'allait pas et je me serais interrogé sur les messages disparus pour une durée indéterminée :( Pas bien ...
jayarjo
2

Par défaut, l'utilisateur anonyme est 0 et c'est le premier utilisateur présent dans la table des utilisateurs au moment de l'installation de drupal et l'ID administrateur sera 1 et il sera le deuxième utilisateur de la table des utilisateurs.

Satya
la source