У меня есть этот массив заголовков.
$first = array('title','first_name','surname','phone','email', 'add1','add2','add3','add4','add5');
Это как названия столбцов в базе данных, так и имена различных элементов формы на веб-странице. Перечисляя их в $first
я могу использовать этот массив для ссылки на базу данных и значения POST
созданные при отправке формы, используя следующий код.
$sql = "INSERT INTO first_page_data (" . implode(',',$first) . ") VALUES (" . implode(',', array_fill(0, count($first), '?')) . ")"; $stmt = $db->prepare($sql); foreach($first as $key=>$val){ $stmt->bindValue($key+1, $_POST[$val], PDO::PARAM_STR); $stmt->execute();
Этот код создаст действительный SQL-запрос, используя $first
массив $first
(и также создаст правильное количество вопросительных знаков для неназванных заполнителей). Затем он будет проходить через массив, связывающий значения POST
с правильным вопросительным знаком.
Этот код работает без проблем, но im теперь пытается адаптировать его для запроса UPDATE
а не INSERT
, в котором я нажимаю камень преткновения:
Запрос INSERT
имеет полный список заголовков столбцов базы данных, а затем полный список их значений, тогда как UPDATE
нуждается в них в UPDATE
title: value (насколько я могу видеть в любом случае!).
Есть ли способ обновления с использованием 2 отдельных списков (в соответствии с INSERT
) или мне нужно разбить $first
массив и массив POST
на «пары»?
Решение
Ниже приведен рабочий оператор SQL:
$sql = "UPDATE first_page_data SET " . implode(", ", array_map(function($v){ return "$v=?"; }, array_values($combined))) . " WHERE email = ?";
Его основательно основывается на принятом ответе, с несколькими хитростями, чтобы заставить его работать!
Вам нужен запрос, который выглядит примерно так:
UPDATE table SET title=?, first_name=?, ... WHERE id=?;
Чтобы построить выражение SET
, вы можете сделать что-то вроде этого:
implode(", ", array_map(function($v){ return "$v=?"; }, array_keys($first)));
Затем вы можете добавить свои параметры так же, как и в своем коде.
Важно помнить, что в запросе WHERE
есть дополнительный параметр, поэтому обязательно добавьте его. Порядок параметров важен, поэтому убедитесь, что последнее – ваше условие WHERE
.
Есть ли способ обновления с использованием 2 отдельных списков (согласно INSERT)
Нет.
Однако, если вы используете mysql, возможно противоположное действие. Таким образом, вы все равно можете использовать единую процедуру для запросов вставки и обновления, используя формат field = value. Пример такого кода можно найти в теге wiki