回答:
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()
他の実装の前に実行されます。これにより、データベースに行がないために失敗することがなくなります。
INSERT INTO users (uid, name, mail) VALUES(0, '', '')