Использование массивов в PDO UPDATE Подготовленное утверждение

У меня есть этот массив заголовков.

$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 = ?"; 

Его основательно основывается на принятом ответе, с несколькими хитростями, чтобы заставить его работать!

Solutions Collecting From Web of "Использование массивов в PDO UPDATE Подготовленное утверждение"

Вам нужен запрос, который выглядит примерно так:

 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