Est-il normal d'avoir un utilisateur avec un UID de 0 dans la table des utilisateurs?
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.
INSERT INTO users (uid, name, mail) VALUES(0, '', '')
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.
la source