#php #mysql #sql
#php #mysql #sql
Вопрос:
У меня есть массив данных, который поступает из пользовательского ввода (выберите выпадающий список). Выпадающий список содержит некоторые значения по умолчанию, и пользователь может выбрать больше или отменить выбор значений по умолчанию (данные базы данных). После отправки я хочу проверить, есть ли они в БД, и пользователь отменяет выбор из выпадающего списка, или если пользователь выбрал больше и вставил эти.
$sql_insert_update_locations = $dbi->prepare("INSERT INTO my_items_table (user_id,location_id) VALUES (?,?) ON DUPLICATE KEY UPDATE user_id=VALUES(user_id), location_id=VALUES(location_id)");
foreach ($location_id as $loc_id) {
$sql_insert_update_locations->bind_param("ii", $user_id, $loc_id);
$sql_insert_update_locations->execute();
}
приведенный выше запрос вставляет / обновляет вновь выбранные, но не проверяет, было ли что-либо отменено, чтобы удалить их из БД.
Комментарии:
1.Не стоит отвечать, но я бы создал новый массив, выбрав строки БД перед обновлением, используйте
array_diff()
php.net/manual/en/function .array-diff.php чтобы найти элементы в этом массиве, которые не существуют в новом выделении, и написать запрос на удаление для повторной итерации из результирующего массива2. @TCooper итак, в основном напишите два запроса: один для вставки / обновления и один для удаления, верно?
3. Я не знаю ни одной rdbms, которая объединяла бы insert / update / delete в один оператор sql, поэтому вам нужен другой запрос для удаления записей.
4. Хотя это ваш код, и вы можете делать все, что хотите, такие имена переменных, как
$sql_insert_update_locations
, действительно, слишком подробны и значительно сокращают ваш код, что делает его намного сложнее для чтения. Что-то вроде$stmt
более обычного.5. @Shadow . , , На самом деле, я бы сказал, что больше баз данных, чем не поддерживают
merge
, что делает именно то, что запрашивает OP. Однако MySQL не является одной из этих баз данных.