PHP & Mysql, обновляющая многих многим отношения с формой флажка

Вы хотите установить этот параметр по умолчанию при открытии менеджера пакетов? к сожалению, это невозможно

7
задан user73119 23 April 2009 в 16:43
поделиться

3 ответа

Поскольку количество ваших проектов достаточно мало для отображения в одной таблице, я полностью поддерживаю переписывание соответствующей части таблицы user_projects после отправки:

BEGIN TRANSACTION;
DELETE FROM user_projects WHERE user_id = $uid;
INSERT INTO user_projects (project_id, user_id)
    VALUES ($proj1, $uid), ($proj2, $uid), ...;
COMMIT TRANSACTION;

Обратите внимание на использование расширенного синтаксиса INSERT для записи ассоциации в одном операторе.

Вы также можете удалить user_projects.id , если вам это не нужно, сохранив треть места в таблице.

2
ответ дан 7 December 2019 в 16:46
поделиться

Вы можете сгруппировать действия и сократить сценарий до 3 запросов.

Восстановить текущую выбранную опцию, используя LEFT JOIN из Chad Birch anwser.

Перед циклом:

$delete_ids = array();
$add_ids = array();

Внутри цикла:

// delete from database
$delete_ids[] = $project_id;

и

// add to database
$add_values[] = '('.$user_id.', '.$project_id.')';

И после цикла for:

if (count($delete_ids) > 0) {
  mysql_query('DELETE FROM user_projects WHERE user_id = '.$user_id.' AND project_id IN ('.implode(', ', $delete_ids).')'); 
}

if (count($add_ids) > 0) {
  mysql_query('INSERT INTO user_projects (user_id, project_id) VALUES '.implode($add_values)); 
}
0
ответ дан 7 December 2019 в 16:46
поделиться

Что ж, если предположить, что каждый пользователь имеет право работать над каждым проектом, на странице обработки формы вы хотите сделать что-то вроде этого:

$query = 'SELECT p.id AS project_id, u_p.id AS user_project_id '.
            'FROM projects AS p '.
                'LEFT JOIN user_projects AS u_p ON (u_p.project_id = p.id AND u_p.user_id = ?)';

Оставив присоединение, вы получите список из всех проектов в системе, и второй столбец будет иметь значение, только если пользователь, который вы редактируете, уже находится в этом проекте. Для приведенных вами примеров данных это результат, который вы получите, запросив user_id 1:

+------------+-----------------+
| project_id | user_project_id |
+------------+-----------------+
|          1 |                 |
|          2 |               2 |
+------------+-----------------+

Затем выполните цикл по результатам этого запроса, и для каждого результата проверьте, есть ли значение в $ _ POST было отправлено для соответствующего project_id . Если значение было отправлено (флажок был установлен) и строка user_project_id пуста, вставьте строку в user_projects , чтобы добавить эту ссылку. Если значение не было отправлено (флажок снят) и в строке задан user_project_id , удалите эту строку из user_projects , используя user_project_id в качестве ключа. В противном случае ничего не делать, они не изменились бы так, как это было раньше.

Надеюсь, это понятно, дайте мне знать, если вы хотите, чтобы я попал в более подробно.

0
ответ дан 7 December 2019 в 16:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: