Usuário encontrado com uid de 0 (zero) na tabela de usuários ... hein?

9

É normal ter um usuário com uid 0 na tabela de usuários?

jayarjo
fonte

Respostas:

17

É 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.

kiamlaluno
fonte
Eu não estava preparado para essa reviravolta ...: | Fiquei sentado por horas pensando por que algumas postagens o tinham (eu pensei que era um bug no meu despejo inicialmente e simplesmente o removi: O). Quais são as circunstâncias? Algum recurso sobre isso?
Jayarjo 27/06
Eu ampliei minha resposta. É normalmente usado ao obter dados sobre os autores dos nós.
kiamlaluno
11
Também gera avisos desagradáveis ​​ao executar cron e outras instâncias. Então você deve realmente adicionar novamente essa linha.
Berdir 27/06
3
Se você precisar restaurar o usuário anônimo, executar este SQL no banco de dados deve ser suficiente:INSERT INTO users (uid, name, mail) VALUES(0, '', '')
marcvangend
Eu senti que era algum tipo de hack, por isso achei estranho e o removi. Mas agora eu tenho uma prova disso, ao exportar meu banco de dados no modo de compatibilidade MYSQL40 (algum servidor de hospedagem compartilhado burro), ele foi importado como o próximo valor de incremento automático (7). Se eu não tivesse acidentalmente tropeçou em tal coisa, eu nunca sabia o que deu errado e teria se perguntou sobre mensagens desapareceu por tempo indefinido :( Não certo ...
jayarjo
2

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.

Satya
fonte