Menemukan pengguna dengan angka 0 (nol) di tabel pengguna ... ya?


9

Apakah normal untuk memiliki pengguna dengan angka 0 di tabel pengguna?

Jawaban:


17

Itu normal, karena Drupal membuat entri itu ketika diinstal, untuk pengguna anonim. Itu dilakukan dari user_install () (Drupal 7), atau system_install () , yang berisi kode berikut.

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

Entri itu biasanya digunakan ketika bergabung dengan data yang terkandung dalam tabel "simpul" dengan data yang terkandung dalam tabel "pengguna".

Tidak memiliki entri itu akan menyebabkan Drupal tidak berfungsi dengan benar dalam beberapa keadaan.

Jika Anda perlu mengembalikan data pengguna anonim dalam database, saya akan mengeksekusi kode yang mirip dengan yang dieksekusi dari Drupal. Khususnya, untuk Drupal 6, saya akan menjalankan kode berikut.

  • Jika data untuk pengguna anonim sudah ada dalam database, tetapi ID pengguna tidak 0:

    db_query("UPDATE {users} SET uid = uid - uid WHERE name = '%s'", '');
  • Jika data untuk pengguna anonim tidak ada, bahkan dengan ID pengguna yang salah:

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

Jika Anda ingin secara otomatis mengembalikan data pengguna anonim, Anda bisa menerapkan hook_cron()dalam modul khusus, dan mengeksekusi kode yang mirip dengan yang berikut ini. (Kode untuk 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'", '');
}

Jika Anda memberi bobot yang lebih rendah pada modul, implementasinya hook_cron()akan dieksekusi sebelum implementasi lainnya, dan ini akan menghindari mereka akan gagal karena baris yang hilang dalam database.


Saya tidak siap untuk twist ini ...: | Duduk selama berjam-jam memikirkan mengapa beberapa posting memilikinya (saya pikir itu adalah bug di dump saya awalnya dan hanya menghapusnya: O). Apa situasinya? Sumber apa saja tentang itu?
jayarjo

Saya memperluas jawaban saya. Biasanya digunakan ketika mendapatkan data tentang pembuat node.
kiamlaluno

1
Ini juga mengarah pada peringatan buruk ketika menjalankan cron dan instance lainnya. Jadi, Anda harus menambahkan kembali baris itu.
Berdir

3
Jika Anda perlu mengembalikan pengguna anonim, menjalankan SQL pada database ini sudah cukup:INSERT INTO users (uid, name, mail) VALUES(0, '', '')
marcvangend

Saya merasa itu semacam retasan, itu sebabnya saya pikir itu aneh dan menghapusnya. Tapi sekarang saya mendapatkan bukti ini karena saya mengekspor database saya dalam mode kompatibilitas MYSQL40 (beberapa server shared hosting bodoh), itu diimpor sebagai nilai kenaikan otomatis berikutnya (7). Jika saya tidak sengaja menemukan hal ini, saya tidak akan pernah tahu apa yang salah dan akan bertanya-tanya tentang posting yang hilang untuk waktu yang tidak terbatas :( Tidak benar ...
jayarjo

2

Secara default pengguna anonim adalah 0 dan ini adalah pengguna pertama yang ada di tabel pengguna pada saat menginstal drupal dan admin id akan menjadi 1 dan dia akan menjadi pengguna kedua di tabel pengguna.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.