@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) во все поля.
Запрос формируется правильно(проверял), а вот с подстановкой параметров у меня сомнения. Можно ли так вообще делать? Или есть какой-нибудь не настолько извращенный способ решения этой задачи?
Заранее спасибо.
  • Вопрос задан
  • 3478 просмотров
Решения вопроса 3
sayber
@sayber Куратор тега PHP
Да, я программирую на PHP и еще асинхронно!
Для начала попробуйте научиться оформлять пост.
сухой текст без подсветки читать не будут.

вы побывали гуглить свою ошибку? Тут ведь явно указанно что не так.
1062 Duplicate entry '2498' for key 'PRIMARY'' in

Если уж совсем лень и не знаете другого языка как только русский, можно воспользоваться переводчиком.59ce531af194f745363063.png
Ответ написан
iqw
@iqw
Serior Software Engineer
Поле id должно быть auto increment (в базе), и его необходимо убрать из запроса, id будет генерироваться на уровне базы
Ответ написан
@myphpscript
но в БД записывается одно и то же значение (2498) во все поля.

в bindParam переменная привязывается по ссылке. на момент excute последнее значение у $value = 2498, поэтому пихает по все поля именно его
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@EvgenZZ
php, javascript developer
1. создаем поле TEXT, 2. $data=json_encode($products), 3. пишем в базу, 4 читаем $data=json_decode(TEXT)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы