Silme Bir kullanıcı>

3 Cevap php

Bu gerçekten sıkışmış ... temelde benim sistem 4 tablolar vardır; kullanıcılar, projeler, user_projects ve faaliyetler. Kullanıcı tablo onlar (bir tamsayı) yönetici veya kullanıcı olup olmadığını tanımlayan bir türünüz alan var ...

Bir yönetici, bir proje oluşturmak proje için bir aktiviteyi oluşturmak ve bir kullanıcı (sınırlı erişim kullanıcı) bir etkinlik atayabilirsiniz. Bu nedenle, bu kurulum bir yönetici doğrudan bir etkinliği (yerine proje) ile ilgili hiç anlamına gelir.

Kafam Admin kullanıcı bir yönetici siler zaman, ben de silinecek (kendi projeleri için) tüm proje ve faaliyetlere ihtiyaç var. Bir kullanıcı için benim silmek komut kadar basit ve çalışır, ancak ben (silinmek üzere olan projeler ile ilişkili) kaldırmak için hangi faaliyetleri bilmek için projectID kazanmak için nasıl sorun yaşıyorum:

$ Userid = $ _GET ['kimliği'];

$query = "DELETE FROM users WHERE userid=".$userid;
$result = mysql_query($sql, $connection)
    or die("Error: ".mysql_error());

$query = "DELETE FROM projects WHERE userid=".$userid;
$result = mysql_query($sql, $connection)
    or die("Error: ".mysql_error());

$query = "DELETE FROM userprojects WHERE userid=".$userid;
$result = mysql_query($sql, $connection)
    or die("Error: ".mysql_error());


$query = "DELETE FROM activities WHERE projectid=".$projectid;
$result = mysql_query($sql, $connection)
    or die("Error: ".mysql_error());

Kimliği başarıyla alındığını çünkü artık ilk üç sorguları açıkçası, ince yürütmek. Yerden elde edilecek hiçbir projectid yoktur çünkü ancak ben biliyorum 4. ve son sorgu ancak ben almaya çalışıyorum ne anlamak için oraya koydum, yanlış! : D

I gibi bir şey olacağını tahmin im 'WHERE projectid =' o proje (ler) için faaliyetleriyle ilgili olabilir kullanıcı'kimliği gelen kaldırıldı projelerini toplamak için bir şey! Ben de öğreniyorum olarak basit bir kavram ama sorun yaşıyorum ... herhangi bir kötü kod lütfen bağışlayın. Herhangi bir yardım için teşekkür ederiz!

3 Cevap

Okumalıdır: MySQL Manual - FOREIGN KEY Constraints .

ON DELETE CASCADE tetikleyen özel bir dikkat, bu sizin için tüm ağır kaldırma yapar. =)

Sorunuzu doğru anlamak, ilk re-sipariş sorguları var. Eğer Projeleri silmeden önce, kullanıcı için projeler için faaliyetlerini silmek zorunda. Belirtilen sırayla bunu yaparak, daha sonra silmeleri için gerekli bilgileri kaybedersiniz.

Yani (Ben ne yaptığımı daha anlaşılır hale getirmek için gerçek sözdizimi kullanımı yoktu) bu sırayla bunları deneyin:

- delete from activities where projectid in (select projectid from projects where userid = $userid)
- delete from users...
- delete from projects...
- delete from userprojects...

Bir kenara, ben yerine böyle sinek SQL dizeleri oluşturmak Eğer bind değişkenleri kullanmanızı tavsiye yasa gereği duyuyorum. Eğer bu dizeleri kendinizi doldurma gibi görünüyor, ama böyle kod SQL Injection tabidir, ve muhtemelen istemiyorum.