За последние 24 часа нас посетил 5261 программист и 682 робота. Сейчас ищет 201 программист ...

Как записать в базе несколько товаров в одно поле

Тема в разделе "PHP для новичков", создана пользователем kris1412, 15 авг 2019 в 20:00.

  1. kris1412

    kris1412 Новичок

    С нами с:
    Четверг
    Сообщения:
    6
    Симпатии:
    0
    Здравствуйте, пытаюсь сделать корзину товаров, написала какую то белиберду да еще не корректно работает, подскажите пожалуйста как сделать проще и главное чтоб работало корректно.
    Код (Text):
    1. if(isset($_POST['product_id'])){
    2.     $idtovar = $_POST['product_id'];
    3.     $result = $mysqli->query("SELECT `idproduct` FROM `cartbd` WHERE `iduser` = '$userid'");
    4.     if (mysqli_num_rows($result) > 0) {
    5.     $row = mysqli_fetch_array($result);
    6.     $idproduct = json_decode($row['idproduct']);
    7.     foreach ($idproduct as $key => $value);
    8.     if($key === $idtovar){
    9.         $nevtotalitem = array($key => $value +1, );
    10.         $nevtotalitem2 = json_encode($nevtotalitem);
    11.         $mysqli->query("UPDATE `cartbd` SET `idproduct`='$nevtotalitem2' WHERE `iduser` = '$userid'");
    12.     }else{
    13.        $total=1;
    14.        $idproductt = json_decode($row['idproduct']);
    15.        foreach ($idproductt as $keyy => $valuee);
    16.             $nevtotal = array($idtovar => $total, $keyy => $valuee,);
    17.       $nevtotal2 = json_encode($nevtotal);
    18.         $mysqli->query("UPDATE `cartbd` SET `idproduct`='$nevtotal2' WHERE `iduser` = '$userid'");
    19.     }
    20. }
    21.     else{
    22.         $cart = array($idtovar => $totalitem=1, );
    23.         $cart2 = json_encode($cart);
    24.         mysqli_query($mysqli, "INSERT INTO `cartbd` (`iduser`,`idproduct`,`dates`) VALUES ('$userid','$cart2','$dates')");
    25.     }
    26. }
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    6.767
    Симпатии:
    1.277
    Не писать несколько товаров в одно поле :) Если нужна сохранённая корзина, то сделай нормальные две таблицы, carts, cart_items, связь один ко многим, и не крути себе мозги.

    @kris1412, объём прочитанного про php и базы данных?
     
  3. kris1412

    kris1412 Новичок

    С нами с:
    Четверг
    Сообщения:
    6
    Симпатии:
    0
    я пытаюсь самой учится php как говорится ютуб в помощь.
    сейчас у меня в "idproduct" в базе записывается id товара и его количество, то чего и добивалась но больше двух позиции не добавляется а перезаписывается первая.
    bd.png
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    6.767
    Симпатии:
    1.277
    Плохая идея. Не зря же в детстве читать учили, надо книжечки читать :) Ну и https://www.php.net/manual/ru/
    --- Добавлено ---
    Ты с ассоциативными массивами работать не умеешь, отсюда все твои проблемы, в коде какой-то бред. Почитай про массивы, может сообразишь сама
     
  5. kris1412

    kris1412 Новичок

    С нами с:
    Четверг
    Сообщения:
    6
    Симпатии:
    0
    @mkramer то что бред я это знаю поэтому и прошу помощи на форуме, про массивы читала и смотрела как создать как перебрать вроде все понимаю, но как правильно использовать это?
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    6.767
    Симпатии:
    1.277
    @kris1412, для того, чтобы перезаписать элемент или дописать его, перебирать не обязательно.
    PHP:
    1.  $idproduct = json_decode($row['idproduct'], true);
    2. $idproduct[$idtovar] = ($idproduct[$idtovar]  ?? 0) + 1; // Надеюсь, php 7+...
    3. $idproduct_encoded = json_encode($idproduct);
    4.  
    5. // Привыкай использовать подготовленные запросы
    6. $smt = $mysqli->prepare("UPDATE `cartbd` SET `idproduct`=? WHERE `iduser` = ?");
    7. $smt->bind_param("si", $idproduct_encoded, $userid);
    8. $smt->execute();
     
    kris1412 нравится это.
  7. kris1412

    kris1412 Новичок

    С нами с:
    Четверг
    Сообщения:
    6
    Симпатии:
    0
    @mkramer к сожалению php 5 так как работаю c денвер 3, спасибо за помощь с кодом.
     
  8. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.199
    Симпатии:
    190
    @kris1412, денвер3 умер не родившись, что мешает поставить ОпенСервер?
     
  9. kris1412

    kris1412 Новичок

    С нами с:
    Четверг
    Сообщения:
    6
    Симпатии:
    0
    @Valick спасибо за совет позже посмотрю про Опен Сервер.
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    6.767
    Симпатии:
    1.277
    За php 5 в 2019 году должен прилетать дух php и шлёпать :D
     
  11. kris1412

    kris1412 Новичок

    С нами с:
    Четверг
    Сообщения:
    6
    Симпатии:
    0
    @mkramer, я прочла по быстрому про bind_param, немного поняла кроме как зачем нужен "si"
     
  12. miketomlin

    miketomlin Активный пользователь

    С нами с:
    9 авг 2016
    Сообщения:
    1.726
    Симпатии:
    256
    Указание на типы параметров?
     
    kris1412 нравится это.
  13. lastdays

    lastdays Активный пользователь

    С нами с:
    27 сен 2012
    Сообщения:
    253
    Симпатии:
    46
    Усложнила себе работу только.

    id - autoincrement
    id_item - айди предмета
    uniq_code - session_id например
    count_item - количество предметов
    add_time - время добавления

    Позволит даже гостям добавлять в корзину товар и манипулировать им, легко.
    Тебе будет проще работать с данными, удалять их спустя промежуток времени по крону.
    А ты играешься с массивами там, где они не нужны по-сути.