Задать вопрос
@postLaravel

Как записать массив в БД?

Доброго времени суток! Возникла такая проблема:
При попытке добавить массив в БД, выдает следующую ошибку:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '2498' for key 'PRIMARY'' in /home/n/n92687o9/n92687o9.beget.tech/public_html/controllers/AdminProductController.php:267 Stack trace: #0


Содержание массива: $products
Array
(
    [0] => Array
        (
            [id] => 0
            [name] => Ноутбук
            [code] => 2028029
            [price] => 2000
        )

    [1] => Array
        (
            [id] => 0
            [name] => Ноутбукк
            [code] => 2028069
            [price] => 2498
        )
)


Сам код добавления:
$db = Db::getConnection();
$sql = 'INSERT INTO product '
                . '(id, name, code, price )'
                . 'VALUES ';
//Формирование запроса:
 $j = 0;
        foreach ($products as $product) {
            if($j > 0) {$sql .= ', ';}
            $sql .= "(";
            $k = 0;
            foreach ($product as $key => $value) {
                $sql .= ":".$key;
                if($k < count($product)-1) {$sql .= ", ";}
                $k++;
            }
            $sql .= ")";
            $j++;
        }
//Формирование параметров для подстановки:
 $result = $db->prepare($sql);
        $j = 0;
        foreach($products as $product) {
            $k = 0;
            foreach($product as $key => $value) {
                $result->bindParam(':'.$key, $value, PDO::PARAM_STR);
                $k++;
            }
            $j++;
        }
$result->execute();


Пробовал изменить INSERT INTO на REPLACE INTO, тогда ошибка исчезает,но в БД записывается одно и то же значение (2498) во все поля.
Запрос формируется правильно(проверял), а вот с подстановкой параметров у меня сомнения. Можно ли так вообще делать? Или есть какой-нибудь не настолько извращенный способ решения этой задачи?
Заранее спасибо.
  • Вопрос задан
  • 4047 просмотров
Подписаться 2 Простой 1 комментарий
Решение пользователя Денис А. К ответам на вопрос (4)
@myphpscript
но в БД записывается одно и то же значение (2498) во все поля.

в bindParam переменная привязывается по ссылке. на момент excute последнее значение у $value = 2498, поэтому пихает по все поля именно его
Ответ написан