@ingeniero

Как обновить данные трех столбцов таблицы в БД данными из массива при помощи PDO PHP?

Привет.
Имеется массив вида:
var_dump ($dateArray[$index]);
string(10) "2018-07-24" string(10) "2018-07-11" string(10) "2018-07-23"


Массив состоит из 3 элементов. Обновление ячеек БД должно идти последовательно по-порядку: 1ый элемент массива - в ячейку day1, 2ой - в day2, 3ий - в day3.

Итак, пытаюсь обновить 3 столбца в таблице БД средствами, указанными в тегах вопроса, следующим образом:
$id = $_POST['id'];
$day = $dateArray[$index];
  
$sql = "UPDATE day_table SET day_1=:day, day_2=:day, day_3=:day WHERE id=:id";
$stmt3 = $pdo->prepare($sql);

foreach ($day as $dates=>$v) {
    $stmt3->bindParam(':day_1', $day);
    $stmt3->bindParam(':day_2', $day);
    $stmt3->bindParam(':day_3', $day);
    $stmt3->bindParam(':id', $id);
    $id = $v['id'];
    $stmt3->execute();
}
//$stmt3->execute();


По итогу данные не обновляются.
Ошибок в консоли нет.

Вопросы:
Где ошибка и как ее можно исправить?
Как 'правильно' (логично, рационально) обновлять данные в БД из массива?
  • Вопрос задан
  • 207 просмотров
Решения вопроса 1
Decadal
@Decadal
foreach ($day as $dates=>$v) {
    $stmt3->bindParam(':day_1', $day);
    $stmt3->bindParam(':day_2', $day);
    $stmt3->bindParam(':day_3', $day);
    $stmt3->bindParam(':id', $id);
    $id = $v['id'];
    $stmt3->execute();
}


подумайте об этом фрагменте.
у вас три даты. Массив из трех дат. Вы перебираете каждую дату.
Для каждой даты делаете три действия (ещё и неправильных). Делаете три апдейта, по одному на каждой итерации.

Либо делайте так:

$stmt3->bindParam(':day_1', $day[0]);
    $stmt3->bindParam(':day_2', $day[1]);
    $stmt3->bindParam(':day_3', $day[2]);
    $stmt3->bindParam(':id', $id);

обходясь без цикла. Либо, если ожидается рост количества полей day4 day5 dayN - перебирайте в цикле и присваивайте плейсхолдерам итератор
$stmt3->bindParam(':day_'.$i, $day[$i]);
но тогда учтите что первая часть апдейта тоже должна генерироваться через перебор.

И всю эту махину завершайте одним вызовом execute.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы