Kullanıcılar tablosunda 0 (sıfır) uid bulunan kullanıcı… ha?


9

Kullanıcılar tablosunda uid değeri 0 olan bir kullanıcı olması normal mi?

Yanıtlar:


17

Anonim kullanıcı için Drupal kurulduğunda bu girişi oluşturması normaldir. Bu yapıldığında user_install () (Drupal 7) veya system_install () aşağıdaki kodu içerebilir.

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

Bu girdi normalde "düğüm" tablosundaki verileri "kullanıcılar" tablosundaki verilerle birleştirirken kullanılır.

Bu girişe sahip olmama, Drupal'ın bazı durumlarda düzgün çalışmamasına neden olur.

Veritabanındaki anonim kullanıcı verilerini geri yüklemeniz gerekirse, Drupal'dan çalıştırılana benzer bir kod yürütürüm. Özellikle, Drupal 6 için, aşağıdaki kodu yürütürdüm.

  • Anonim kullanıcıların verileri veritabanında zaten varsa, ancak kullanıcı kimliği 0 değilse:

    db_query("UPDATE {users} SET uid = uid - uid WHERE name = '%s'", '');
  • Anonim kullanıcının verileri yanlış kullanıcı kimliğiyle olsa bile yoksa:

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

Anonim kullanıcı verilerini otomatik olarak geri yüklemek isterseniz, hook_cron()özel bir modüle uygulayabilir ve aşağıdakine benzer bir kod yürütebilirsiniz. (Kod Drupal 6 içindir.)

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

Modüle daha düşük bir ağırlık verirseniz, uygulaması hook_cron()diğer uygulamalardan önce yürütülür ve bu, veritabanındaki eksik satır nedeniyle başarısız olur.


Bu bükülmeye hazır değildim ...: | Neden bazı mesajlar var düşünerek saatlerce oturuyordu (başlangıçta benim döküm bir hata olduğunu düşündüm ve sadece kaldırıldı: O). Koşullar nelerdir? Herhangi bir kaynak var mı?
jayarjo

Cevabımı genişlettim. Normalde düğümlerin yazarları hakkında veri alırken kullanılır.
kiamlaluno

1
Ayrıca cron ve diğer örnekleri çalıştırırken kötü uyarılara neden olur. Bu satırı gerçekten yeniden eklemelisiniz.
Berdir

3
Anonim kullanıcıyı geri yüklemeniz gerekiyorsa, bu SQL'i veritabanında çalıştırmak yeterli olmalıdır:INSERT INTO users (uid, name, mail) VALUES(0, '', '')
marcvangend

Bir tür hack olduğunu hissettim, bu yüzden garip olduğunu düşündüm ve kaldırdım. Ama şimdi benim veritabanı MYSQL40 uyumluluk modunda (bazı aptal paylaşılan barındırma sunucusu) ihraç gibi bir kanıt var, bir sonraki otomatik artış değeri (7) olarak ithal var. Yanlışlıkla bu şeye tökezlememiş olsaydım, neyin yanlış gittiğini asla bilemezdim ve süresiz mesajların belirsiz bir süre için merak ederdim :( Doğru değil ...
jayarjo

2

Varsayılan olarak anonim kullanıcı 0'dır ve bu, drupal kurulumu sırasında kullanıcılar tablosunda bulunan ilk kullanıcıdır ve yönetici kimliği 1 ve kullanıcılar tablosunda ikinci kullanıcı olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.