Benutzer mit der UID 0 (Null) in der Benutzertabelle gefunden… huh?

9

Ist es normal, einen Benutzer mit der UID 0 in der Benutzertabelle zu haben?

Jayarjo
quelle

Antworten:

17

Es ist normal, dass Drupal diesen Eintrag bei der Installation für den anonymen Benutzer erstellt. Dies erfolgt über user_install () (Drupal 7) oder system_install () , die den folgenden Code enthalten.

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

Dieser Eintrag wird normalerweise verwendet, wenn die in der Tabelle "Knoten" enthaltenen Daten mit den in der Tabelle "Benutzer" enthaltenen Daten verknüpft werden.

Wenn Sie diesen Eintrag nicht haben, funktioniert Drupal unter bestimmten Umständen nicht richtig.

Wenn Sie die anonymen Benutzerdaten in der Datenbank wiederherstellen müssen, würde ich Code ausführen, der dem von Drupal ausgeführten ähnlich ist. Insbesondere für Drupal 6 würde ich den folgenden Code ausführen.

  • Wenn die Daten für die anonymen Benutzer bereits in der Datenbank vorhanden sind, die Benutzer-ID jedoch nicht 0 ist:

    db_query("UPDATE {users} SET uid = uid - uid WHERE name = '%s'", '');
  • Wenn die Daten für den anonymen Benutzer auch mit der falschen Benutzer-ID nicht vorhanden sind:

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

Wenn Sie die anonymen Benutzerdaten automatisch wiederherstellen möchten, können Sie sie hook_cron()in einem benutzerdefinierten Modul implementieren und Code ähnlich dem folgenden ausführen. (Der Code ist für 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'", '');
}

Wenn Sie dem Modul eine geringere Gewichtung geben, wird seine Implementierung von hook_cron()vor den anderen Implementierungen ausgeführt, und dies würde vermeiden, dass sie aufgrund der fehlenden Zeile in der Datenbank fehlschlagen.

kiamlaluno
quelle
Ich war nicht auf diese Wendung vorbereitet ...: | Ich habe stundenlang herumgesessen und darüber nachgedacht, warum einige Posts es haben (ich dachte, es sei anfangs ein Fehler in meinem Dump und habe es einfach entfernt: O). Was sind die Umstände? Irgendeine Ressource dazu?
Jayarjo
Ich habe meine Antwort erweitert. Es wird normalerweise verwendet, wenn Daten über die Autoren der Knoten abgerufen werden.
Kiamlaluno
1
Dies führt auch zu unangenehmen Warnungen beim Ausführen von Cron und anderen Instanzen. Sie sollten diese Zeile also wirklich erneut hinzufügen.
Berdir
3
Wenn Sie den anonymen Benutzer wiederherstellen müssen, sollte das Ausführen dieser SQL in der Datenbank ausreichen:INSERT INTO users (uid, name, mail) VALUES(0, '', '')
marcvangend
Ich fühlte, dass es eine Art Hack war, deshalb fand ich es seltsam und entfernte es. Aber jetzt habe ich einen Beweis dafür erhalten, als ich meine Datenbank im MYSQL40-Kompatibilitätsmodus (ein dummer gemeinsam genutzter Hosting-Server) exportierte. Sie wurde als nächster Wert für die automatische Inkrementierung importiert (7). Wenn ich nicht versehentlich über dieses Ding gestolpert wäre, hätte ich nie gewusst, was schief gelaufen ist, und hätte mich auf unbestimmte Zeit über verschwundene Beiträge gewundert :( Nicht richtig ...
Jayarjo
2

Standardmäßig ist der anonyme Benutzer 0 und dies ist der erste Benutzer, der zum Zeitpunkt der Installation von drupal in der Benutzertabelle vorhanden ist. Die Administrator-ID ist 1 und er ist der zweite Benutzer in der Benutzertabelle.

Satya
quelle