Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: dwa problemy ze sklepem
Forum PHP.pl > Forum > PHP
john_doe
Witam,
tworzę sobie zupełnie dla treningu koszyk zakupów. Mam już dodawanie i edycję ilości. Pojawiły się dwa problemy. Jeden estetyczny drugi nie.
Mam sobie plik addToCart.php w którym wyświetlam koszyk. Ma on postać takiego linku

http://127.0.0.1/myShop/addToCart.php?id=1&productId=3

gdzie id to id kategorii a produktId wiadomo. plik ten ma postać

  1. <?php
  2.  
  3. include('connect.php');
  4. include('functions.php');
  5.  
  6. print '<h1>Zawartosc koszyka</h2>';
  7.  
  8. if(isSet($_SESSION['koszyk']))
  9. {
  10.    $checkExistance = findValue($_GET['productId'], $_SESSION['koszyk']);
  11. }
  12. if( $checkExistance == 1 )
  13. {
  14.    print 'TOWAR JEST JUZ w KOSZU <br />';
  15. }elseif(isSet($_GET['productId'])) {
  16.  
  17.        $_SESSION['koszyk'][$_SESSION['id']] = array('id' => $_GET['productId'], 'ile' => 1);
  18.        
  19.        $_SESSION['id']++;    
  20. }
  21.  
  22.  
  23. print '<a href="shop.php">Enter to my shop centre</a><br /><br />';
  24. print '<a href="dump.php">Dump</a><br /><br />';
  25.  
  26.  
  27.  
  28.  
  29. if ( count($_SESSION['koszyk'] ) > 0)
  30. {
  31.  
  32.        print '<table border="1">
  33.                    <tr>
  34.                        <th>ID</th>
  35.                        <th>NAME</th>
  36.                        <th>PRICE</th>
  37.                        <th>VOLUME</th>
  38.                        <th>ILE</th>
  39.                        <th>edit</th>
  40.                    </tr>';
  41.        
  42.        $iter = -1;
  43.        
  44.        foreach($_SESSION['koszyk'] as $product)
  45.        {    
  46.            $iter++;
  47.            
  48.            $id = $product['id'];    
  49.            
  50.            $sql = "SELECT product_id, product_name, product_price, product_volume
  51.                            FROM products
  52.                    WHERE product_id = " . $id;
  53.            
  54.            $result = mysql_query($sql);
  55.            
  56.            while ($row = mysql_fetch_array($result))
  57.            {
  58.                print '<tr>';
  59.                print '<td>' . $row[0] . '</td>';
  60.                print '<td>' . $row[1] . '</td>';
  61.                print '<td>' . $row[2] . '</td>';
  62.                print '<td>' . $row[3] . '</td>';
  63.                print '<td>' . $product['ile'] . '</td>';
  64.                print '<td><a href="java script:showEditForm('editForm.php?id=' . $iter . '')">edit</a></td>';
  65.            }
  66.            
  67.        }
  68.        print '</table>';
  69. } else print 'koszyk pusty';
  70.  
  71.  
  72. //print var_dump($_SESSION);
  73. ?>
  74.  
  75. <script type="text/javascript">
  76.  
  77. function showEditForm(address)
  78. {
  79.    okno = window.open(address, "okno", "toolbar=no, location=no, status=no, menubar=no, width=210, height=150, scrollbars=no, resizable=no, left=450, top=200");
  80. }
  81.  
  82. </script>


teraz muszę wkleić jeszcze pliki dwa służące edycji (krótkie są)

editForm.php
  1. session_start();
  2.  
  3. print_r($_SESSION['koszyk']);
  4.  
  5. print '<br>';
  6.  
  7. print 'ile: ' . $_SESSION['koszyk'][$_GET['id']]['ile'];
  8.  
  9. print '<br>';
  10.  
  11. ?>
  12.  
  13. <form action="edit.php?id=<?php print $_GET['id'] ?>" method="POST">
  14.    
  15.    <select name="increaseVolume">
  16.        <option value="0">0</option>
  17.        <option value="2">2</option>
  18.        <option value="3">3</option>
  19.        <option value="4">4</option>
  20.        <option value="4">5</option>
  21.        <option value="4">6</option>
  22.    </select>
  23.    
  24.    <input type="submit" value="Zmien" />
  25. </form>


oraz sama akcja edit.php

  1. <?php
  2.  
  3. //if( $_POST['increaseVolume'] == 0 )
  4. //{
  5.    //unset session
  6. //    unset( $_SESSION['koszyk'][$_GET['id']] );
  7. //}else {
  8.  
  9.            $_SESSION['koszyk'][$_GET['id']]['ile'] = $_POST['increaseVolume'];
  10.  //    }
  11.  
  12.  
  13. print '<script>opener.location.reload(true); window.close();</script> ';
  14. ?>


o i teraz tak. Jeden estetyczny bląd bo gdy zmienie liczbe sztuk to oczywiście zmienia ale wypisuje, że towar jest już w koszyku. I dobrze bo tak jest zakodowane i nie wiem jak to poprawić. Jest coś co namierza skąd pochodzą zmiany? wtedy by sie zrobiło że gdy z pliku edit to coś tam coś tam.
Drugi problem to usuwanie z koszyka. Linie w edit są zakomentowane bo to usuwanie jakoś nie kosi. Gdy ilość updejtowana = 0 wtedy unset session.
Nie wiem czy to, że źle działa nie jest spowodowane wyświetlaniem koszyka? nawet wtedy źle updejtuje ilość gdy <> 0. Np. jak dodam jeden towar do koszyka i chce go usunąć to nie usuwa. gdy dodam drugi to moge usunąć który kolwiek, jednak ten co zostanie nie mogę nadać mu innej ilosci. Zwariuje.
sorry za długiego posta.

pozdro
dr_bonzo
Wez uzyj jakiegos prostego Frameworka, np Kohana, tam bedziesz mial wszystkie akcje podzielone na metody, tak ze edycja nie bedzie ci sie mieszac z dodawaniem. I prosciej bedzie zrozumiec/zakodzic co w danej chwili sie uruchomi.
Do tego odzielisz troche SQL, od PHP i od HTMLa
john_doe
wiem i masz napewno rację, jednak robie to zupelnie na surowo i po raz 1szy i chciałbym aby najpierw mój pomysł zadziałał a potem wezmę się za frameworki.
jakieś sugestie co do poprawki mojego zamąconego kotła?

wydaje mi się, że źle używam funkcji unset(); bo po jej wykonaniu zostaje taki array

Array (
[1] => Array ( [id] => 2 [ile] => 1 ) [0] => Array ( [ile] => 4 ) )
ile: 4

czyli tam gdzie wyboldowałem nie usuwa się wszystko zostaje ile. Tablica winna przyjąć postać
Array (
[1] => Array ( [id] => 2 [ile] => 1 )
dr_bonzo
Cytat
jakieś sugestie co do poprawki mojego zamąconego kotła?

No chyba zartujesz ze bede probowal to spagetti przeanalizowac, wlasnie temu sugeruje ci FW bo zmusi cie do lekkiego porzadku w kodzie./
john_doe
bez przesady 60 linijek kodu to nie jakieś spaghetti smile.gif
deirathe
Tragedia kolejny osc się rodzi skąd ludzie takie nawyki biorą sad.gif
To może jak w koszu masz zero to daj unset całego przedmiotu a nie zmieniasz ilość na 0, bo przedmiot Ci zostaje i podejrzewam że wyświetla że jest przez tą funkcję findValue czy jakoś tak.
A w tablicy masz indeks 'ile', który pokazuje że jest 0 sztuk.
Ablo 2 sprawa zmień funkcję findValue, żeby sprawdzała ilość sztuk danego przedmiotu w koszyku i jak jest 0 to żeby zwracała false.
john_doe
no właśnie jak daje

  1. <?php
  2. unset( $_SESSION['koszyk'][$_GET['id']] );
  3. ?>


to usuwam tylko id produktu z koszyka, pozostaje mi ilość sztuk

Array (
[1] => Array ( [id] => 2 [ile] => 1 ) [0] => Array ( [ile] => 4 ) )

i mam kłopot by usunąć wszystko.

P.S. Każdy się czegoś uczy. Robię to cudo po raz 1wszy. Kombinuje po swojemu i dlatego tak to wygląda. Najpierw chcę osiągnąć za wszelką cenę funkcjonalność. Potem to porządkować, przerabiać itp. Nie chce się przekomarzać ale nawyków nie mam skąd nabierać bo nie pracuję jako programista php w jakimś zespole choć byłoby fajnie. Programuje codziennie po 10 h w Transact SQLu.
deirathe
Wiesz czasem po osiągnięciu funkcjonalności właśnie tym sposobem który tu przedstawiasz, będziesz musiał wszystko pisać od nowa- niestety taki fakt. Co do programowania jeżeli chcesz się nauczyć jak pisać ciekawie, a masz jakieś podstawy to polecam Ci książkę
http://webmade.org/recenzje/wzorce-projekt...e-obiektowe.php

Co do problemu- masz źle zbudowaną w takim razie tablicę. Przebuduj ją na
koszyk ->idproduktu->(ilosc,nazwa,i inne)
i wtedy jak zrobisz unset koszyk[id_produktu] to masz pewnosc ze wywali wszystko

I trochę o bezpieczeństwie poczytaj tongue.gif
john_doe
spoko wiem, że nie jest to bezpieczne ale nie o to chodzi. Co do funkcjonalności to na bank będę musiał napisać na nowo ale już z bogatszym portfelem doświadczenia.
Tablica może nie jest źle zbudowana tylko coś mi nie wychodzi by to zunsetować
Przecież ma postać

Array (
[1] => Array ( idProduktu, ileTegoProduktu )
)
phpion
Mając 1 produkt w koszyku musisz wykonać 1 zapytanie aby wyświetlić zawartość koszyka. Mając 10 produktów zapytań tych masz 10, przy 20 produktach 20. Niezależnie od ilości produktów możesz pobrać produkty 1 zapytaniem. Jak? Zamiast w pętli wykonywać:
  1. ... WHERE product_id=1
  2. ... WHERE product_id=2
  3. ... WHERE product_id=3

lepiej użyć do tego IN:
  1. ... WHERE product_id IN (1, 2, 3)

czyli zrobić implode(', ', $tablica_id_produktow).
john_doe
racja, dzięki. podziałam po pracy. Dobre spostrzeżenie <gitara>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.