• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dodawanie rozmiaru koszulki w cookies

Object Storage Arubacloud
+1 głos
79 wizyt
pytanie zadane 14 stycznia w PHP przez vog Początkujący (370 p.)

Witam na samym wstępie napiszę iż jestem w kwestii php absolutnie początkującym. Obecnie walczę w swoim projekcie z kwestią dodania trzeciego elementu jaki chciałbym przekazywać przez cookies. Jest nim rozmiar produktu. Obecnie z powodzeniem przekazuję id produktu oraz ilość sztuk, jednakże z tym trzecim na prawdę nie mam już pomysłu co zmienić, a na poszukiwania poświęciłem już szmat czasu, bezskutecznie. Niżej jest kod ze strony konkretnego produktu, gdzie powinno się wybrać rozmiar produktu oraz kliknąć "dodaj do koszyka"

<?php
$koszyk=$_COOKIE["koszyk"];
@$id = $_GET["id"];
@$ile = $_GET["ile"];
$rozmiar = $_GET["size_product"];
if ($ile<0) unset($ile);

function dodaj($koszyk,$id,$ile,$rozmiar) {
  $zakupy = explode("|",$koszyk);
  for ($i=0;$i<count($zakupy)-1;$i++) {
    $p = explode("#",$zakupy[$i]);
    if ($p[0]==$id) {
      if (isset($ile)) $p[1]=$ile;
      else $p[1]++;
      $jest=true;
    }
    if ($p[1]>0) $nowy .= "$p[0]#$p[1]#$p[2]|";
  }
  if (!$jest) $nowy .= "$id#1|";
  return $nowy;
}

if ($id<>"") {
  $koszyk = dodaj($koszyk,$id,$ile,$rozmiar);
  setcookie("koszyk", $koszyk, 0, "/");
  header("Location: index.php");
  exit;
}
?>

Pobieranie rozmiaru chciałbym wykonywać poprzez kliknięcie wybranego inputa:

<div class="selection-size-product">
                        <form method="post">
                            <input type="submit" name="size_product" value="s">
                            <input type="submit" name="size_product" value="m">
                            <input type="submit" name="size_product" value="l">
                            <input type="submit" name="size_product" value="xl">
                            <input type="submit" name="size_product" value="xxl">
                        </form>

Jednakże do tej pory z przekazywaniem produktu po id radziłem sobie poprzez przekazywanie metodą get w linku:
Próbowałem też i tutaj przemycić rozmiar produktu, ale to nie działa.

<div class="btn-add-to-cart">
                            <?php
                        echo 
                        "<a href=\"./cart.php?idItem=$this_product&size=$size_product\"><p>Dodaj do koszyka</p></a>"
                        ?>
 </div>


Z kolei w pliku cart.php ponownie umieszczona jest ta sama funkcja 'dodaj' oraz pobrane metodą get te same zmienne jak wyżej wkleiłem. Następnie, pominąwszy zbedne linie, wrzucam kod odpowiadający za wyświetlenie się bloku w którym powinien się min rozmiar produktu pojawić:

    <?php

        $zakupy = explode("|", $koszyk);

        for ($i=0; $i<count($zakupy)-1; $i++) 
        {
            $p = explode("#", $zakupy[$i]);
            // $size = $_POST['size'];
            $size = $_GET['size'];
        $sql = "SELECT * FROM products WHERE idproduct='$p[0]'";
        $rezultat = mysqli_query($polaczenie, $sql);

        $row = mysqli_fetch_assoc($rezultat);

            $companyCode = $row['companyCode']; 
            $nameProduct = $row['nameProduct'];
            $newPrice = $row['newPrice'];
            $pictureA = $row['pictureA'];
            

// TEST BLOCZKU POCZĄTEK
echo<<<END
            <div class="product-block">
            
                            
            <div class="product-block__photo-box">
                <a href="./product_details.php?idproduct=$p[0]" target="_blank">
                <figure>
                <img class="photo-box-img" src="$pictureA" alt="fotografia produktu">
                </figure>
                </a>
            </div>
            <div class="product-block__info-box">
                <div class="company-name">$companyCode</div>
                <div class="product-name">
                    <h1>$nameProduct</h1>
                </div>
                <div class="product-size">Rozmiar: M      

//tu już nawet zmiennej nie podstawiam ponieważ i tak nie potrafię jej wrzucić w cookies. Gdy dodam do koszyka kilka produktów session mi nie pomoże, więc sądzę iż wyłącznie należałoby wrzucić w ciasteczka, ale nie mam pojęcia jak to uczynić.
                
</div>
                <div class="product-price">
                    Cena: $newPrice ZŁ
                </div>
                <div class="product-quality-title">
                    <p>szt. produktu:</p>
                </div>
                <div class="product-quantity">
                  <div class="product-quantity--minus">
                    <form action="cart.php" method="get">    
                        <input type="hidden" name="idItem" value="$p[0]" />
                        <input type="hidden" name="ile" value="$p[1]" style="width:50px;" />
END;

Z góry przepraszam za chaotyczność kodu, nie mam doświadczenia z PHP dla tego proszę o wyrozumiałość.

2 odpowiedzi

0 głosów
odpowiedź 15 stycznia przez niezalogowany
W przykładzie masz w linku klucz 'size' a wyżej 'size_product'. Poza tym nie używaj @ :D  Proponuję też podszkolić się w tym jak formularze działają. Może skorzystaj z radio buttona? Ogólnie to zapraszam na mojego YT @DamianoSmok
0 głosów
odpowiedź 17 stycznia przez VBService Ekspert (253,420 p.)
edycja 17 stycznia przez VBService

IMHO, trzymałbym tyko w cookie id koszyka, a resztę danych z koszyka albo w bazie danych (tabela o nazwie np. basket) lub ewentualnie w folderze (o nazwie np. baskets) w postaci plików o nazwie id koszyka, dane w plikach w postaci JSON-a.

 

Do generowania unikalnego id dla koszyka proponuje użyć np.

[ kod on-line ]

function uniqidReal($lenght=13) {
  if (function_exists("random_bytes")) {
    $bytes = random_bytes(ceil($lenght / 2));
  } elseif (function_exists("openssl_random_pseudo_bytes")) {
    $bytes = openssl_random_pseudo_bytes(ceil($lenght / 2));
  } else {
    throw new Exception("no cryptographically secure random function available");
  }
  return substr(bin2hex($bytes), 0, $lenght);
}

echo uniqidReal();

wtedy mamy w przypadku użycia folderu np.

przykładowy zapis do pliku

// Dwa produkty znajdują się w koszyku
$basket = [
    [
        'id_item' => 1111,
        'content'   => [
            'quantity' => 1,
            'size'     => 'XL',
            'color'    => 'white'
        ]
    ],
    [
        'id_item' => 2222,
        'content'   => [
            'quantity' => 2,
            'size'     => 'M',
            'color'    => 'blue'
        ]
    ]
];

// dla demonstracji zawartości
// print_r($basket);

// Zapisujemy dane do pliku, używamy jako nazwy wcześniej wygenerowany id
// pobrany czy to z $_COOKIE, czy z $_SESSION, czy z $_POST
file_put_contents("baskets/{$id}.dat", json_encode($basket));

pobieranie danych z pliku np.

$basket_json_data = file_get_contents("baskets/{$id}.dat");
$basket = json_decode($basket_json_data, true);

if ($basket === null) {
    // to jest tylko bardzo prosty przykład obsługi problemu
    // odczytu danych
    echo "Wystąpił problem z pobraniem zawartości koszyka";
} else {
    // dla demonstarcji
    print_r($basket);
}

 

id koszyka możesz mieć w $_COOKIE, czy w $_SESSION lub

<form action="cart.php" method="post">
  <input type="hidden" name="id_basket" value="<?=$id_basket?>">
  <input type="hidden" name="id_item" value="<?=$this_product?>">

  <label for="size_product">Wybierz rozmiar:</label>
  <label>
    <input type="radio" name="size_product" value="s" required>
    S
  </label>

  <label>
    <input type="radio" name="size_product" value="m">
    M
  </label>

  <label>
    <input type="radio" name="size_product" value="l">
    L
  </label>

  <label>
    <input type="radio" name="size_product" value="xl">
    XL
  </label>

  <label>
    <input type="radio" name="size_product" value="xxl">
    XXL
  </label>

  <button type="submit" name="btn_add_to_basket">Dodaj do koszyka</button>
</form>

wersja z  <select>

<form action="cart.php" method="post">
  <input type="hidden" name="id_basket" value="<?=$id_basket?>">
  <input type="hidden" name="id_item" value="<?=$this_product?>">

  <label for="size_product">Wybierz rozmiar:</label>
  <select id="size_product" name="size_product" required>
    <option value="" disabled selected hidden></option>
    <option value="s">S</option>
    <option value="m">M</option>
    <option value="l">L</option>
    <option value="xl">XL</option>
    <option value="xxl">XXL</option>
  </select>

  <button type="submit" name="btn_add_to_basket">Dodaj do koszyka</button>
</form>
<form action="cart.php" method="post">
  <input type="hidden" name="id_basket" value="<?=$id_basket?>">
  <input type="hidden" name="id_item" value="<?=$this_product?>">
  
  <label for="quantity_product">Ilość:</label>
  <input type="number" id="quantity_product" name="quantity_product" min="1" value="1" required>

  <label for="size_product">Wybierz rozmiar:</label>
  <select id="size_product" name="size_product" required>
    <option value="" disabled selected hidden></option>
    <option value="s">S</option>
    <option value="m">M</option>
    <option value="l">L</option>
    <option value="xl">XL</option>
    <option value="xxl">XXL</option>
  </select>

  <label for="color_product">Wybierz kolor:</label>
  <select id="color_product" name="color_product" required>
    <option value="" disabled selected hidden></option>
    <option value="white">Biały</option>
    <option value="black">Czarny</option>
    <option value="blue">Niebieski</option>
  </select>

  <button type="submit" name="btn_add_to_basket">Dodaj do koszyka</button>
</form>

 

Podobne pytania

0 głosów
2 odpowiedzi 200 wizyt
pytanie zadane 18 lipca 2016 w Systemy operacyjne, programy przez misiek555 Nowicjusz (140 p.)
0 głosów
1 odpowiedź 211 wizyt
pytanie zadane 25 lutego 2021 w PHP przez domkub12 Początkujący (480 p.)
0 głosów
1 odpowiedź 219 wizyt
pytanie zadane 21 sierpnia 2020 w PHP przez Bakkit Dyskutant (7,600 p.)

92,584 zapytań

141,433 odpowiedzi

319,666 komentarzy

61,966 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...