обновить множественный выбор в базе данных - PullRequest
0 голосов
/ 13 апреля 2011

Опция множественного выбора

Например, пользователь с идентификатором '10' имеет возможность выбрать, на каких языках он говорит.Он выбирает каждый язык, используя «множественный выбор» или «несколько флажков», например:

<input name="lang[]" value="en" type="checkbox" />
<input name="lang[]" value="es" type="checkbox" />
<input name="lang[]" value="jp" type="checkbox" />

Что я хочу знать, как выглядит таблица БД, в которой хранятся эти параметры, и как быphp на стороне сервера вставьте / обновите их?

Мое предположение до сих пор

Я предполагаю, что таблица будет выглядеть примерно так:

CREATE TABLE user_langs (id INT AUTO_INCREMENT PRIMARY KEY, lang VARCHAR, fk_user INT);

В то время как для вставки значений в нового пользователя php выполняет простой цикл вставки:

$stmt = $pdo->prepare('INSERT INTO user_langs (lang,fk_user) VALUES(?,?)');
foreach($_POST['lang'] as $lang){
    $stmt->execute(array($lang, $user_id));
}

Проблема, с которой я сталкиваюсь, связана с UPDATES, самый простой способ - удалить все существующиезаписи этого пользователя и вставьте новые.

$stmt1 = $pdo->prepare('DELETE FROM user_langs WHERE fk_user=?');
$stmt1->execute(array($user_id));
$stmt2 = $pdo->prepare('INSERT INTO user_langs (lang,fk_user) VALUES(?,?)');
foreach($_POST['lang'] as $lang){
    $stmt2->execute(array($lang, $user_id));
}

Но я думаю, что это будет слишком быстро увеличивать первичный идентификатор, если он активно используется, даже если верхние пределы идентификатора астрономические.Мне не нравится идея загрязнения моей базы данных, поэтому я предполагаю, что я делаю что-то не так, поэтому я хотел бы знать, как профессионал справляется с этим.

Ответы [ 2 ]

1 голос
/ 13 апреля 2011

Вы также можете использовать некоторые различия.

Алгоритм:

  1. Пользователь отправил форму с выбранными языками
  2. Вы выбираете текущие языки
  3. Используя array_diff() дважды (разница между старым и новым, и наоборот), вы получаете 2 массива языков, которые вам нужно удалить, и которые вам нужно добавить
  4. В соответствии с массивами из 3, которые вы выполняетеодин INSERT и один DELETE запрос
0 голосов
/ 19 мая 2012

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

Тогда становится возможным использовать следующую таблицу:

CREATE TABLE user_langs (
  lang VARCHAR, 
  fk_user INT, 
  PRIMARY KEY(lang,fk_user)
);

Это улучшает целостность данных, поскольку у одного пользователя больше не может быть 2 записейна том же языке.

Чтобы вставить значение, вы делаете то же самое:

$stmt = $pdo->prepare('INSERT INTO user_langs (lang,fk_user) VALUES(?,?)');
foreach($_POST['lang'] as $lang){
    $stmt->execute(array($lang, $user_id));
}

И самый простой способ обработать обновление - удалить все записи, привязанные к этому пользователю, и вставить правильные.снова таким же образом:

$stmt1 = $pdo->prepare('DELETE FROM user_langs WHERE fk_user=?');
$stmt1->execute(array($user_id));
$stmt2 = $pdo->prepare('INSERT INTO user_langs (lang,fk_user) VALUES(?,?)');
foreach($_POST['lang'] as $lang){
    $stmt2->execute(array($lang, $user_id));
}

Вы также можете сделать это, как предлагает zerkms , чтобы ВЫБРАТЬ все языки, затем запустить array_diff, чтобы найти старые и новые значения, и удалитьстарые и вставьте новые, но это означает выполнение 3 запросов и сравнение результатов, в то время как в случае языков пользователь очень редко говорит больше 3, поэтому просто удаляетd вставка снова кажется лучшим вариантом.

...