2013-10-24 6 views
0

В основном у меня есть форма, содержащая несколько флажков (принадлежащих к одной группе), это выбор категории.PHP/MySQL - обновление флажков в базе данных

Когда пользователь хочет ОБНОВИТЬ их выбор, они могут просматривать эту форму, в которой уже есть свои ТЕКУЩИЕ выборы.

Затем пользователь меняет свой выбор и отправляет форму. Теперь мне нужно обновить эти выборки в базе данных. Вот код, у меня есть на данный момент:

// $old_selections contains an ARRAY of IDs - I use this to pre-select the checkboxes 
$old_selections = Listing::getSelections(); 

if(isset($_POST['update'])) 
{ 
     // $_POST['selections'] is an ARRAY of posted IDs 
     $new_selections = $_POST['selections']; 

     foreach($new_selections as $selection) 
     { 
       // insert a new record using $selection 
     } 
} 

Так в настоящее время это добавляет новые выборы в базе данных, но не удаляет существующие. В идеале это должно быть немного умно - вместо того, чтобы просто удалять все существующие записи, он должен сравнивать два массива и удалять/вставлять по мере необходимости.

Также, если пользователь отключает все выборы, ему, очевидно, необходимо будет удалить все существующие записи.

Что было бы самым эффективным способом достижения этого?

+0

Я думаю, что ваше мышление «чрезмерно». Я действительно думаю, что было бы более эффективно удалять все записи сначала, потому что тогда вам не нужно беспокоиться о сравнении. – bestprogrammerintheworld

ответ

1

В дополнение @ManZzup ответ.

Когда вы отправите форму, обновление может быть сделано следующим образом:

// You no longer need this 
// $old_selections = Listing::getSelections(); 

if(isset($_POST['update'])) 
{ 
    // $_POST['selections'] is an ARRAY of posted IDs 
    $new_selections = $_POST['selections']; 

    $list; 
    foreach($new_selections as $selection) 
    { 
     $list .= $selection + ","; 
    } 
    $list = substr($list, 0, strlen($list)); 

    $query = "DELETE FROM tablename WHERE selection_id NOT IN (" . $list .") AND user_id = " . $id; 
    mysqli_query($con, $query); 

    foreach($new_selections as $selection) 
    { 
     $query = "INSERT INTO tablename VALUES (" . $id . "," . $selection . ")"; 
     mysqli_query($con, $query); 
    } 
... 
} 

Попробуйте что-то вроде этого.

0

В таких случаях обычно у меня есть отдельная таблица с идентификаторами пользователя, SelectionID и «Y» или «N» - или даже более простое падение Y/N-бита и предположить, есть ли запись для пары пользователь/выбор, тогда они отметили это, если нет, они этого не сделали.

Я удалить все записи для пользователя х, когда они обновляются и писать новые записи. Там нет проверки, если запись уже существует точки ..

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

Я предпочитаю первый метод, если вам нужно получить доступ к данным другим способом - например, здесь «найти всех пользователей, которые выбрали вариант x» - это легко с помощью решения таблицы. Также, если вы удалите один из вариантов в будущем, вы можете просто удалить все записи с этим идентификатором из таблицы.

0

изменение структуры таблицы немного

имеют отдельную таблицу для хранения выбора Детали например:

selection_id selection_name 
1   New Selection 

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

user_id selection_id 
10   1 

так обновляющий выбор означает добавление новых записей в таблицу и вставку новых [простой sql функции могут использоваться]

Смежные вопросы