Trovato utente con uid di 0 (zero) nella tabella degli utenti ... eh?


9

È normale avere un utente con uid di 0 nella tabella degli utenti?

Risposte:


17

È normale, poiché Drupal crea quella voce quando è installata, per l'utente anonimo. Ciò viene fatto da user_install () (Drupal 7) o system_install () , che contiene il seguente codice.

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

Tale voce viene normalmente utilizzata quando si uniscono i dati contenuti nella tabella "nodo" con i dati contenuti nella tabella "utenti".

Non avere quella voce farebbe sì che Drupal non funzionasse correttamente in alcune circostanze.

Se è necessario ripristinare i dati degli utenti anonimi nel database, eseguirò un codice simile a quello eseguito da Drupal. In particolare, per Drupal 6, esegui il seguente codice.

  • Se i dati per gli utenti anonimi esistono già nel database, ma l'ID utente non è 0:

    db_query("UPDATE {users} SET uid = uid - uid WHERE name = '%s'", '');
  • Se i dati per l'utente anonimo non esistono, anche con l'ID utente errato:

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

Se si desidera ripristinare automaticamente i dati utente anonimi, è possibile implementare hook_cron()in un modulo personalizzato ed eseguire codice simile al seguente. (Il codice è per 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 si assegna al modulo un peso inferiore, la sua implementazione hook_cron()verrà eseguita prima delle altre implementazioni e questo eviterebbe che falliscano perché la riga mancante nel database.


Non ero preparato per questa svolta ...: | Rimase seduto per ore a pensare al motivo per cui alcuni post lo hanno (pensavo che inizialmente fosse un bug nella mia discarica e semplicemente l'ho rimosso: O). Quali sono le circostanze? Qualche risorsa su questo?
jayarjo,

Ho ampliato la mia risposta. Viene normalmente utilizzato quando si ottengono dati sugli autori dei nodi.
kiamlaluno

1
Porta anche a cattivi avvisi quando si esegue cron e altre istanze. Quindi dovresti davvero aggiungere nuovamente quella riga.
Berdir,

3
Se è necessario ripristinare l'utente anonimo, eseguire questo SQL sul database dovrebbe essere sufficiente:INSERT INTO users (uid, name, mail) VALUES(0, '', '')
marcvangend

Ho sentito che era un trucco di qualche tipo, ecco perché ho pensato che fosse strano e l'ho rimosso. Ma ora ho avuto una prova di questo mentre stavo esportando il mio database in modalità di compatibilità MYSQL40 (un server di hosting condiviso stupido), è stato importato come successivo valore di autoincremento (7). Se non mi fossi imbattuto per caso in questa cosa, non avrei mai saputo cosa fosse andato storto e mi sarei mai chiesto quali fossero i post scomparsi per un periodo di tempo indefinito :( Non giusto ...
jayarjo,

2

Per impostazione predefinita, l'utente anonimo è 0 e questo è il primo utente presente nella tabella degli utenti al momento dell'installazione di drupal e l'id amministratore sarà 1 e sarà il secondo utente nella tabella degli utenti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.