Удаление пользователя> необходимо также удалить его проект, а затем действия для этого проекта? - PullRequest
2 голосов
/ 04 мая 2010

Действительно застрял с этим ... в основном моя система имеет 4 таблицы; пользователи, проекты, user_projects и действия. Таблица пользователя имеет поле типа пользователя, которое определяет, являются ли они администратором или пользователем (целым числом) ...

Администратор может создать проект, создать действие для проекта и назначить пользователю (пользователю с ограниченным доступом) действие. Следовательно, эта настройка означает, что администратор никогда напрямую не связан с действием (вместо проекта).

Когда мой главный администратор удаляет администратора, мне нужно также удалить все проекты и действия (для их проектов). Мой сценарий удаления для пользователя пока прост и работает, но у меня возникают проблемы с тем, как получить идентификатор проекта, чтобы узнать, какие действия удалить (связанные с проектами, которые будут удалены):

$userid = $_GET['userid'];

$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());

Теперь первые три запроса выполняются нормально, очевидно, потому что идентификатор пользователя успешно извлекается. Однако четвертый и последний запрос, который я знаю, неверен, потому что нет никакого проекта, который можно было бы получить из любого места, однако я поставил его там, чтобы помочь понять, что я пытаюсь получить!

Я предполагаю, что мне нужно что-то вроде 'WHERE projectid =', а затем что-то, чтобы собрать удаленные проекты из идентификатора пользователя, что может быть связано с действиями для этого проекта (-ов)! Это простая концепция, но у меня проблемы ...

Ответы [ 3 ]

4 голосов
/ 04 мая 2010

Необходимо прочитать: Руководство по MySQL - ограничения FOREIGN KEY .

Обратите особое внимание на триггеры ON DELETE CASCADE, это сделает всю тяжелую работу за вас. =)

1 голос
/ 04 мая 2010

Возможно, вы захотите взглянуть на многотабличный DELETE синтаксис , поддерживаемый MySQL:

$sql = "DELETE u, p, up, a 
        FROM users u
        LEFT OUTER JOIN projects p ON (u.userid = p.userid)
        LEFT OUTER JOIN userprojects up ON (u.userid = up.userid)
        LEFT OUTER JOIN activities a ON (p.projectid = a.projectid) 
        WHERE u.userid = {$userid}";

$result = mysql_query($sql, $connection)
    or die("Error: ".mysql_error());

В качестве дополнительной проблемы, , пожалуйста будьте осторожны при защите от рисков SQL-инъекций. Не используйте параметры веб-запроса без их фильтрации. По крайней мере, сделайте что-то вроде этого:

$userid = intval($_GET['userid']);
0 голосов
/ 04 мая 2010

Если я правильно понимаю ваш вопрос, вы должны сначала изменить порядок ваших запросов. Перед удалением проектов необходимо удалить действия для проектов для пользователя. Делая это в указанном порядке, вы теряете информацию, необходимую для последующего удаления.

Так что попробуйте их в следующем порядке (я не использовал реальный синтаксис, чтобы сделать его более понятным):

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

Кроме того, по закону я рекомендую вам использовать переменные связывания вместо того, чтобы создавать строки SQL на лету. Похоже, вы сами заполняете эти строки, но подобный код подвергается SQL-инъекции, и вы, вероятно, этого не хотите.

...