Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Koszyk na zakupy problem z wypisywaniem
Forum PHP.pl > Forum > PHP
Basia555
Witam
Mam problem z dodawaniem produktów do koszyka na zakupy. Niby zrobiłam że działa ale nie mam dalej pomysły jak dojść do finalnego rozwiązania. Problem polega na tym że gdy wybiore obojetnie jakie produkty z bazy danych to ten koszyk powiela mi tylko pierwszy element tablicy tak jakby innych nie było. Mógłbym ktoś zerknąć na ten kod byłabym wdzieczna smile.gif

  1. <?php
  2. if (!isset($_SESSION['koszyk'])) {
  3. $_SESSION['koszyk'] = array();
  4. }
  5.  
  6. if (isset($_GET['reset'])) //chcemy wyczyścić koszyk
  7. {
  8. unset($_SESSION['koszyk']);
  9. header('location: '. $_SERVER['PHP_SELF']. '?'. SID);
  10. exit();
  11. }
  12. ?>
  13.  
  14. <!DOCTYPE html>
  15. <html>
  16. <head>
  17. <meta charset="UTF-8">
  18. <title>Firma budowlana </title>
  19. </head>
  20. <body>
  21. <h1>Twoj koszyk z zakupami</h1>
  22.  
  23. <?php // definicja tablic z towarami oraz cenami
  24.  
  25.  
  26. $i= isset($_GET['i']) ? (int)$_GET['i'] : 0;
  27.  
  28.  
  29. $q = mysql_connect('localhost','root','haslo') or
  30. die('Padl serwer');
  31. $q = mysql_select_db('stronaphp') or die('Padla baza');
  32.  
  33.  
  34. $wynik = mysql_query("SELECT ID, Nazwa_uslugi, Cena_za_metr FROM cennik_uslug")
  35. or die('Błąd zapytania');
  36.  
  37.  
  38.  
  39. $towary = array();
  40. $ceny = array();
  41. while ($row = mysql_fetch_array($wynik))
  42. {
  43. $towary[]=$row['Nazwa_uslugi'];
  44. $ceny[]=$row['Cena_za_metr'];
  45. }
  46. ?>
  47.  
  48. <table border="1">
  49. </thead>
  50. <tr>
  51.  
  52. <th>Nazwa usługi</th>
  53. <th>Cena za metr</th>
  54. </tr>
  55. </thead>
  56. <tbody>
  57.  
  58.  
  59.  
  60. <?php
  61. $suma = 0;
  62. for ($i=0;$i < count($_SESSION['koszyk']); $i++)
  63. {
  64. echo '<tr>';
  65. echo '<td>'.$towary[$_SESSION['koszyk'][$i]].'</td>';
  66. echo '<td align="right">';
  67. echo number_format ($ceny[$_SESSION['koszyk'][$i]],2);
  68. echo ' zlotych</td></tr>';
  69. $suma = $suma + $ceny[$_SESSION['koszyk'][$i]];
  70. }
  71. ?>
  72.  
  73.  
  74. </tbody>
  75. <tfoot>
  76. <tr>
  77. <th align="right">Naleznosc: </th><br>
  78. <th align="right"><?php echo number_format($suma,2); ?> zlotych.</th>
  79. </tr>
  80. </tfoot>
  81. </table>
  82.  
  83. <p><a href="towary.php">Kupuj dalej</a> lub też: <a href="<?php echo $_SERVER['PHP_SELF']; ?>?reset=1">Wyczysc swoj koszyk</a></p>
  84. </body>
  85. </html>
  86.  
salfunglandyare
A co przechowujesz w tablicy $_SESSION['koszyk']? Identyfikatory z bazy danych, czy indeksy tablic PHP? Wstaw też kod dodawania czegoś do koszyka.
Próbuj debugować kod, wyświetl sobie print_r($_SESSION['koszyk']) - pokaże Ci, co zawiera ta zmienna, zrób to samo z $towary i $ceny.
Basia555

<?php
session_start();
if(!isset($_SESSION['koszyk']))
{
$_SESSION['koszyk']=array();
}
if (isset($_GET['kup']))
{
// jezeli dodajemy jaki¶ produkt do koszyka
$_SESSION['koszyk'][] = $_GET['kup'];
// przekierowanie z uwzględnieniem nie działaj±cych ciasteczek
header('location: '.$_SERVER['PHP_SELF']. '?' .SID);
exit();
}
?>



<b>Twoj koszyk zawiera:
<?php print count($_SESSION['koszyk']); ?> produktow.</b>
<p><a href="koszyk.php">Zobacz koszyk</a></p>

<?php //definicja tablic z towarami oraz cenami

$lacz = mysql_connect('localhost','root','haslo') or
die('Padl serwer');
$lacz = mysql_select_db('stronaphp') or die('Padla baza');

$wynik = mysql_query("SELECT ID, Nazwa_uslugi, Cena_za_metr FROM cennik_uslug ") or die('Błąd zapytania');

?>
<table border="1">
<thead>
<tr>
<th>Opis towaru</th>
<th>cena</th>
</tr>
</thead>
<tbody>

<?php //wyswietlamy towary z tablicy

$i= isset($_GET['i']) ? (int)$_GET['i'] : 0;

$towary = array();
$ceny = array();

while ($row = mysql_fetch_array($wynik))
{
$towary[]=$row['Nazwa_uslugi'];
$ceny[]=$row['Cena_za_metr'];

print '<tr><td>'.$row['ID'].'</td>';
print '<td>'.$row['Nazwa_uslugi'].'</td>';
print '<td>'.$row['Cena_za_metr'].'</td>';

print "<td><a href=\"".$_SERVER['PHP_SELF']."?kup=$i\">Kup produkt</a></td></tr>";
}
?>
</tbody>
</table>
</body>
</html>


</body>
</html>
salfunglandyare
No i widzisz...

ustawiasz:
  1. $i= isset($_GET['i']) ? (int)$_GET['i'] : 0;


więc na początku $i przyjmuje 0.

Dalej wstawiasz:

  1. print "<td><a href=\"".$_SERVER['PHP_SELF']."?kup=$i\">Kup produkt</a></td></tr>";

ale dla Ciebie $i jest cały czas = 0. Stąd dodajesz do koszyka w sesji kolejne 0, które pokrywa się z indeksem pierwszego towaru.

Zamiast tego, w kodzie, w którym dodajesz do koszyka:
  1. print "<td><a href=\"".$_SERVER['PHP_SELF']."?kup=".$row['ID']."\">Kup produkt</a></td></tr>";


a w kodzie z pierwszego posta:
  1. while ($row = mysql_fetch_array($wynik))
  2. {
  3. $towary[$row['ID']]=$row['Nazwa_uslugi'];
  4. $ceny[$row['ID']]=$row['Cena_za_metr'];
  5. }


Przed przetestowaniem opróżnij koszyk i jeszcze raz włóż do niego jakieś towary
Basia555
salfunglandyare dzięki wielkie za pomoc smile.gif koszyk działa smile.gif

jeszcze jakbyś mógł mi wyjaśnić jak zrobić żebym mogła zrobić coś takiego, mam np usługę i do niej potrzebne są jakieś materiały. np montaż glazury i do niej potrzeba klej, fugę i nie wiem co tam jeszcze. jak wybiorę tą usługę i wpiszę ilość m^2 to mi wyświetli w koszyku ostatecznie wynik sumy: montaż glazury x ilość m^2+klej*ilość m^2+fuga*ilość m^2

da radę coś takiego zrobić?

chyba najlepiej byłoby do każdej usługi i towaru przyporządkować oddzielne idkat i po tym identyfikować?
salfunglandyare
Najlepiej umieścić pole, np w osobnym formularzu:

  1. <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>?zapiszPowierzchnie=1">
  2. <legend>Powierzchnia</legend>
  3. <div>
  4. <label for="powierzchnia">Podaj powierznię [m<sup>2</sup>] remontowanego obszaru:</label>
  5. <input type="text" name="powierzchnia" id="powierzchnia" value="<?=htmlspecialchars($_SESSION['powierzchnia']); ?>">
  6. </div>
  7. <input type="submit" value="Zapisz">
  8. </form>


dalej w momencie gdy obsługujesz koszyk, będziesz mogła też obsłużych powierzchnię - można ją trzymać w sesji obok koszyka:
  1. /* inicjuje zmienna */
  2. if(empty($_SESSION['powierzchnia'])){
  3. $_SESSION['powierzchnia'] = 0;
  4. }
  5. if(isset($_GET['zapiszPowierzchnie'])){
  6. /* przetwarza dane formularza powierzchni */
  7. $_SESSION['powierzchnia'] = floatVal($_POST['powierzchnia']);
  8. }


Później już przy obliczeniach możesz wykorzystać:
  1. $suma = 0;
  2. $powierzchnia = 1;
  3. if($_SESSION['powierzchnia']>0{
  4. $powierzchnia = $_SESSION['powierzchnia'];
  5. }
  6. for ($i=0;$i < count($_SESSION['koszyk']); $i++)
  7. {
  8. echo '<tr>';
  9. echo '<td>'.$towary[$_SESSION['koszyk'][$i]].'</td>';
  10. echo '<td align="right">';
  11. echo $powierzchnia.' m<sup>2</sup> x '.number_format ($ceny[$_SESSION['koszyk'][$i]],2);
  12. echo ' zlotych</td></tr>';
  13. $suma = $suma + ($ceny[$_SESSION['koszyk'][$i]] * $powierzchnia);
  14. }


To oczywiście tylko zarys, pokazujący mniej więcej jedną z dróg do uzyskania tego co chcesz. Warunki itp. mogą być inne, dostosujesz to sobie wg. własnych potrzeb.

//EDIT, a może po prostu nie zrozumiałem, o co zapytałaś wink.gif
Basia555
Chodziło mi o dodanie pola w które bede wpisywała ilość i mnożyła przez cene danej usługi, a druga sprawa to ma sumować wszystkie pola z bazy z takim samym idkat i mnożyć przez to pole w którym wpisujemy ilość metrów kwadratowych. Chyba jeszcze nie to o co mi chodziło wink.gif
salfunglandyare
To ta pierwsza część już jest biggrin.gif

a gdzieś, gdzie chcesz to wszystko sumować

  1. SELECT *, (Cena_za_metr * ILOSC_M2) AS Cena_za_powierzchnie FROM towary WHERE idkat = IDKAT;

Podajesz ILOSC_M2 i IDKAT
w zwrocie dostajesz $row['Cena_za_powierzchnie']

Czy o to chodzilo?
Basia555
Cytat(salfunglandyare @ 5.05.2015, 21:03:02 ) *
To ta pierwsza część już jest biggrin.gif

a gdzieś, gdzie chcesz to wszystko sumować

  1. SELECT *, (Cena_za_metr * ILOSC_M2) AS Cena_za_powierzchnie FROM towary WHERE idkat = IDKAT;

Podajesz ILOSC_M2 i IDKAT
w zwrocie dostajesz $row['Cena_za_powierzchnie']

Czy o to chodzilo?


To chyba jeszcze nie jest to o co mi chodzi. Da radę zrobić abym mogła do każdego wiersza w koszyku oddzielnie wpisywać powierzchnię w m^2 lub cene za metr? A jeśli chodzi o tą drugą część to chodzi mi o to co na obrazku

http://naforum.zapodaj.net/6bab60629335.jpg.html
salfunglandyare
Jak najbardziej, ale będzie trzeba trochę przerobić całość. Generalnie, zamiast dodawania do koszyka przez url:
  1. <a href=\"".$_SERVER['PHP_SELF']."?kup=$i\">Kup produkt</a>

trzebaby całość zmodyfikować:
  1. <fprm method=\"get\" action=\"".$_SERVER['PHP_SELF']."\">
  2. <input type=\"hidden\" name=\"kup\" value=\"$i\">
  3. <input type=\"text\" name=\"powierzchnia\" value=\"$ilosc\">
  4. <input type=\"submit\" value=\"Kup produkt\">
  5. </form>


W takim przypadku dostaniesz $_GET['kup'] = ID (tak jak do tej pory), ale dodatkowo $_GET['powierzchnia'], którą będziesz musiała również zachować w sesji, np jako $_SESSION['koszyk_powierzchnia'][$_GET['kup']]=$_GET['powierzchnia'];

wtedy na tej samej zasadzie co produkt ($_SESSION['koszyk']) będziesz miała informacje o $_SESSION['koszyk_powierzchnia'] (ten sam klucz).
Basia555
Cytat(salfunglandyare @ 7.05.2015, 21:52:16 ) *
Jak najbardziej, ale będzie trzeba trochę przerobić całość. Generalnie, zamiast dodawania do koszyka przez url:
  1. <a href=\"".$_SERVER['PHP_SELF']."?kup=$i\">Kup produkt</a>

trzebaby całość zmodyfikować:
  1. <fprm method=\"get\" action=\"".$_SERVER['PHP_SELF']."\">
  2. <input type=\"hidden\" name=\"kup\" value=\"$i\">
  3. <input type=\"text\" name=\"powierzchnia\" value=\"$ilosc\">
  4. <input type=\"submit\" value=\"Kup produkt\">
  5. </form>


W takim przypadku dostaniesz $_GET['kup'] = ID (tak jak do tej pory), ale dodatkowo $_GET['powierzchnia'], którą będziesz musiała również zachować w sesji, np jako $_SESSION['koszyk_powierzchnia'][$_GET['kup']]=$_GET['powierzchnia'];

wtedy na tej samej zasadzie co produkt ($_SESSION['koszyk']) będziesz miała informacje o $_SESSION['koszyk_powierzchnia'] (ten sam klucz).



A jak zrobić żeby można było w koszyku dopiero zmieniać ilość i nie dla wszystkich pól taka sama powierzchnie tylko dla pól o danym IDKAT? I jeszcze jedno jak dodać do pliku towary.php fukcję która będzie mi wypisywała wszystkie potrzebne materiały z innej tabeli do danej usługi?
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.