É normal ter um usuário com uid 0 na tabela de usuários?
É normal, pois o Drupal cria essa entrada quando é instalada, para o usuário anônimo. Isso é feito a partir de user_install () (Drupal 7) ou system_install () , que contém o seguinte código.
// 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'", '');
Essa entrada é normalmente usada ao associar os dados contidos na tabela "node" com os dados contidos na tabela "users".
Não ter essa entrada faria com que o Drupal não funcionasse corretamente em algumas circunstâncias.
Se você precisar restaurar os dados anônimos do usuário no banco de dados, eu executaria um código semelhante ao executado no Drupal. Em particular, para o Drupal 6, eu executaria o seguinte código.
Se os dados para os usuários anônimos já existirem no banco de dados, mas o ID do usuário não for 0:
db_query("UPDATE {users} SET uid = uid - uid WHERE name = '%s'", '');
Se os dados do usuário anônimo não existirem, mesmo com o ID do usuário errado:
db_query("INSERT INTO {users} (name, mail) VALUES('%s', '%s')", '', '');
db_query("UPDATE {users} SET uid = uid - uid WHERE name = '%s'", '');
Se você deseja restaurar automaticamente os dados anônimos do usuário, pode implementar hook_cron()
em um módulo personalizado e executar um código semelhante ao seguinte. (O código é para o 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'", '');
}
Se você atribuir ao módulo um peso menor, sua implementação hook_cron()
será executada antes das outras implementações, e isso evitará que elas falhem devido à linha que falta no banco de dados.
INSERT INTO users (uid, name, mail) VALUES(0, '', '')
Por padrão, o usuário anônimo é 0 e este é o primeiro usuário presente na tabela de usuários no momento da instalação do drupal e o ID do administrador será 1 e ele será o segundo usuário na tabela de usuários.
fonte