ユーザーテーブルでuidが0(ゼロ)のユーザーが見つかりました…え?


回答:


17

Drupalは、インストール時に匿名ユーザーに対してそのエントリーを作成するため、これは正常です。それは、以下から行われuser_install()(Drupalの7)、またはsystem_install()次のコードを含みます、。

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

そのエントリは通常、「ノード」テーブルに含まれているデータと「ユーザー」テーブルに含まれているデータを結合するときに使用されます。

そのエントリがないと、状況によってはDrupalが正しく機能しなくなります。

匿名ユーザーのデータをデータベースに復元する必要がある場合は、Drupalから実行したのと同様のコードを実行します。特に、Drupal 6の場合、次のコードを実行します。

  • 匿名ユーザーのデータがデータベースにすでに存在しているが、ユーザーIDが0でない場合:

    db_query("UPDATE {users} SET uid = uid - uid WHERE name = '%s'", '');
  • ユーザーIDが間違っていても、匿名ユーザーのデータが存在しない場合:

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

匿名のユーザーデータを自動的に復元する場合hook_cron()は、カスタムモジュールに実装して、次のようなコードを実行できます。(コードは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'", '');
}

モジュールに低い重みを与えると、その実装はhook_cron()他の実装の前に実行されます。これにより、データベースに行がないために失敗することがなくなります。


私はこのひねりの準備ができていなかった...:| なぜいくつかの投稿にそれがあるのか​​と思って何時間も座っていました(私は最初に私のダンプのバグだと思って、単にそれを削除しました:O)。どのような状況ですか?それに関するリソースはありますか?
jayarjo

答えを広げました。通常、ノードの作成者に関するデータを取得するときに使用されます。
kiamlaluno

1
また、cronやその他のインスタンスを実行すると、厄介な警告が表示されます。したがって、その行を本当に追加し直す必要があります。
Berdir 2011年

3
あなたは匿名ユーザーを復元する必要がある場合は、データベース上でこのSQLを実行することは十分です:INSERT INTO users (uid, name, mail) VALUES(0, '', '')
marcvangend

なんらかのハックだと感じたので、変だと思って削除しました。しかし、MYSQL40互換モード(一部のダム共有ホスティングサーバー)でデータベースをエクスポートしていたため、これが証明され、次の自動増分値としてインポートされました(7)。私が誤ってこのことに遭遇していなかったとしたら、何が悪いのかわからなかったし、投稿がいつまでも消えてしまうのではないかと思っていたでしょう:(正しくありません...
jayarjo

2

デフォルトでは、匿名ユーザーは0であり、これはdrupalのインストール時にusersテーブルに存在する最初のユーザーであり、管理IDは1であり、ユーザーテーブルの2番目のユーザーになります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.