Как можно улучшить код для внесения изменений в таблицу, используя переменные в качестве названия столбца? Как оптимизировать код для правильного формирования запроса при изменении значений в столбцах id, count1, count2 и count3, чтобы избежать повторяющихся конструкций условий с if?
Для того чтобы использовать переменную как название столбца в запросе UPDATE, можно использовать конструкцию типа CONCAT для формирования строки запроса. Например: ```sql SET @column_name = 'название_столбца'; SET @new_value = 'новое_значение'; SET @query = CONCAT('UPDATE таблица SET ', @column_name, ' = ', @new_value); PREPARE stmt FROM @query; EXECUTE stmt; DEALLOCATE PREPARE stmt; ``` Чтобы улучшить код и избежать повторяющихся конструкций условий с if, можно использовать CASE выражения. Например: ```sql UPDATE таблица SET count1 = CASE WHEN id = 1 THEN count1 + 1 ELSE count1 END, count2 = CASE WHEN id = 2 THEN count2 + 1 ELSE count2 END, count3 = CASE WHEN id = 3 THEN count3 + 1 ELSE count3 END WHERE id IN (1, 2, 3); ``` Это позволит избежать повторяющихся конструкций с условиями if и сделает код более читаемым и легким для поддержки.
Как насчет оператора CASE?
$sql = "UPDATE `list` SET count1 = CASE WHEN id = ? AND ? = 1 THEN count1 - ? ELSE count1 END, count2 = CASE WHEN id = ? AND ? = 2 THEN count2 - ? ELSE count2 END, count3 = CASE WHEN id = ? AND ? = 3 THEN count3 - ? ELSE count3 END WHERE id = ?"; $stmt = $conn->prepare($sql); foreach ($data as $id => $value) { $idParts = explode("-", $id); $count = $value['count']; $stmt->execute([$idParts[0], $idParts[1], $count, $idParts[0], $idParts[1], $count, $idParts[0], $idParts[1], $count, $idParts[0]]); }
Здесь используется оператор CASE для обновления нужного столбца в зависимости от значения $idParts[1]. Если $idParts[1] не соответствует ни одному из условий, то значение столбца остается неизменным. Ну и не забываем про подготовленный запрос prepare чтобы избежать возможной инъекции