Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Puste obiekty i sesja, czyli skad skrypt ma wiedziec kiedy wykonac unset()?
Edpl
post
Post #1





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 6.05.2006

Ostrzeżenie: (0%)
-----


Witam,
pisze koszyk internetowy na podstawie klasy podpatrzonej gdzies w necie (nie pamietam juz mozliwe cos zmienialem). Jednak mam problem z usuwaniem ostatnich elementow. Jesli np w koszyku zostaly 2 sztuki jakiegos produktu i chce sie je usunac... w tym momencie poprawnie wypisuje ze usunieto, koszyk nie wyswietla zawartosci, ale po przeladowaniu znowu te 2 sztuki sie pojawiaja (tak jakby zmiany nie byly wprowadzone do zmiennej sesyjnej). Probowalem wiec uzyc unset gdy obiekt jest pusty... ale cos niebardzo chce dzialac. Poradzcie cos. Zamieszczam skrypt:
  1. // fragment index.php:
  2. <? if (isset($_SESSION[cart])){
  3. $take=unserialize($_SESSION[cart]); }
  4. else
  5. {
  6. $take=new cart; 
  7.  }
  8.  if ($_GET[page]=='cart') { include('cart.php');}
  9. ?>
  10. //a tu cart.php
  11. <?
  12. function showall(cart $take){
  13. while ( list($ky,$vl) = each($take->goods)){
  14. $dbase=new database;
  15. $wynik=$dbase->search('id',$klucz); //od tego momentu $wynik jest obiektem. wlasciwosci wyciagniete z bazy danych na p
  16. dstawie id3
  17. $klucz=$wynik->name;
  18. echo "nazwa:$ky - ilosc:$vl<br>";
  19. unset($wynik);
  20. $_SESSION[cart]=serialize($take);
  21. if (empty($take)) {
  22. unset($_SESSION[cart]);
  23. unset($take); 
  24. }
  25. }
  26. }
  27.  
  28. switch ($_GET[action]) {
  29. case 'add':
  30. if(isset($_GET[id]) && isset($_GET[amount])){
  31. $take->add($_GET[id],$_GET[amount]);
  32.  
  33. echo "added<br><br>";
  34. showall($take);
  35. }
  36. else
  37. {
  38. echo "Error";
  39. }
  40. break;
  41. case 'del':
  42. if(isset($_GET[id]) && isset($_GET[amount])){
  43. $take->del($_GET[id],$_GET[amount]);
  44.  
  45. echo "deleted";
  46. showall($take);
  47. }
  48. else
  49. {
  50. echo "Error";
  51. }
  52. break;
  53. default:
  54. showall($take);
  55. break;
  56. }
  57.  
  58. ?>
  59. //klasa cart:
  60. <?
  61. class cart {
  62.  
  63. public $goods = array();
  64.  
  65. function add($id, $amount) {
  66. $this->goods[$id] += $amount;
  67. }
  68. function del($id, $amount) {
  69.  if ($this->goods[$id] > $amount) {
  70. $this->goods[$id] -= $amount;
  71. return true;
  72. } 
  73. elseif ($this->goods[$id] == $amount) {
  74. unset($this->goods[$id]);
  75. return true;
  76. } 
  77. else {
  78. return false;
  79. }
  80. }
  81. }
  82. ?>


Ten post edytował Edpl 6.08.2008, 08:03:04
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
php1983
post
Post #2





Grupa: Zarejestrowani
Postów: 19
Pomógł: 1
Dołączył: 3.08.2008
Skąd: Radom

Ostrzeżenie: (0%)
-----


Rzutem na taśmę to nie widać błędu, tylko powiedz co to jest cart w kontekście $_SESSION[cart], dlaczemu nie jest $_SESSION['cart']?

Pozatym sam nie wiem co się dzieje z unset()?

To cały skrypt, sprawdzony, można wkleić i sprawdzić debugiem. Może jest coś jak w C++, że istnieje
jakiś unreference operator. Jak dla mnie to $this w php5 to jakaś magia, albo kopia lustrzanego odpićia jakiegoś wskażnika do ref itd... W każdym razie, jak w swoim projekcie przeprowadze wewnętrzne testy w obiekcie i coś jest nie tak, to nie mogę go żadną siłą uśmiercić, tylko odradza mi się jako dummy. Co jest?
  1. <?php
  2. class terminator{
  3. function terminate($obj){
  4. unset($obj);
  5. }
  6. //przekazywanie przez ref. też ni zrobi nic zombiemu
  7. function terminate1(&$obj){
  8. unset($obj);
  9. }
  10. }
  11.  
  12. class A{
  13. function main(){
  14. $term=new terminator;
  15. $term->terminate($this);
  16. $term->terminate1($this);
  17. //jak to odkomentować to wogóle jest masakra
  18. //if(isset($this)) $this->main();
  19. }
  20. }
  21. $zombi=new A;
  22. $zombi->main();
  23. if(isset($zombi)){
  24. //sprawdź! zombi jest nie do zaj......
  25. $zombi->main();
  26.  
  27. }
  28. unset($zombi);
  29. if(!isset($zombi)){
  30. echo 'zombi zdechł';
  31.  
  32. }
  33. ?>
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 8.10.2025 - 21:58