• 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
90 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 (254,570 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ź 225 wizyt
pytanie zadane 25 lutego 2021 w PHP przez domkub12 Początkujący (480 p.)
0 głosów
1 odpowiedź 228 wizyt
pytanie zadane 21 sierpnia 2020 w PHP przez Bakkit Dyskutant (7,600 p.)

92,687 zapytań

141,599 odpowiedzi

320,089 komentarzy

62,048 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

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!

...