Usuario encontrado con uid de 0 (cero) en la tabla de usuarios ... ¿eh?

9

¿Es normal tener un usuario con uid de 0 en la tabla de usuarios?

jayarjo
fuente

Respuestas:

17

Es normal, ya que Drupal crea esa entrada cuando se instala, para el usuario anónimo. Eso se hace desde user_install () (Drupal 7) o system_install () , que contiene el siguiente 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'", '');  

Esa entrada se usa normalmente cuando se unen los datos contenidos en la tabla "nodo" con los datos contenidos en la tabla "usuarios".

No tener esa entrada podría causar que Drupal no funcione correctamente en algunas circunstancias.

Si necesita restaurar los datos de usuario anónimo en la base de datos, ejecutaría un código similar al que se ejecuta desde Drupal. En particular, para Drupal 6, ejecutaría el siguiente código.

  • Si los datos para los usuarios anónimos ya existen en la base de datos, pero el ID de usuario no es 0:

    db_query("UPDATE {users} SET uid = uid - uid WHERE name = '%s'", '');
  • Si los datos para el usuario anónimo no existen, incluso con la ID de usuario incorrecta:

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

Si desea restaurar automáticamente los datos anónimos del usuario, puede implementarlos hook_cron()en un módulo personalizado y ejecutar un código similar al siguiente. (El código es para 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 le da al módulo un peso menor, su implementación hook_cron()se ejecutará antes que las otras implementaciones, y esto evitaría que fallaran debido a la fila faltante en la base de datos.

kiamlaluno
fuente
No estaba preparado para este giro ...: | Estuve sentado durante horas pensando por qué algunas publicaciones lo tienen (pensé que era un error en mi volcado inicialmente y simplemente lo eliminé: O). Cuales son las circunstancias? ¿Algún recurso sobre eso?
jayarjo
Expandí mi respuesta. Normalmente se usa cuando se obtienen datos sobre los autores de los nodos.
kiamlaluno
1
También genera advertencias desagradables al ejecutar cron y otras instancias. Entonces realmente debería volver a agregar esa fila.
Berdir
3
Si necesita restaurar el usuario anónimo, bastará con ejecutar este SQL en la base de datos:INSERT INTO users (uid, name, mail) VALUES(0, '', '')
marcvangend
Sentí que era un truco de algún tipo, por eso pensé que era extraño y lo eliminé. Pero ahora obtuve una prueba de esto cuando estaba exportando mi base de datos en modo de compatibilidad MYSQL40 (algún servidor de alojamiento compartido tonto), se importó como el siguiente valor de incremento automático (7). Si no me hubiera topado accidentalmente con esto, nunca habría sabido qué salió mal y me habría preguntado acerca de las publicaciones desaparecidas por tiempo indefinido :( No está bien ...
jayarjo
2

Por defecto, el usuario anónimo es 0 y este es el primer usuario presente en la tabla de usuarios al momento de instalar drupal y la identificación de administrador será 1 y será el segundo usuario en la tabla de usuarios.

Satya
fuente