Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: serialize przed header
Forum PHP.pl > Forum > PHP
Civil
Witam,
Mam takie pytanie. Na początku kodu inicjuję koszyk:
  1. if (isset($_SESSION['cart']) and unserialize($_SESSION['cart']))
  2. {
  3. include_once("classes/class.basket_head.php");
  4.  
  5. $cart = unserialize($_SESSION['cart']);
  6. }
  7. else
  8. {
  9. $cart = new basket_head();
  10. }


Na końcu kodu go serializuję:
  1. <? $_SESSION['cart'] = serialize($cart); ?>



I teraz tworząc funkcje do zapisu użytkownika robię coś takiego:
  1. if($insert_client and $insert_client_data)
  2. {
  3. $_SESSION[register_proceed][customers_login]=$_POST[customers_login];
  4. //serializacja koszyka
  5. $_SESSION['cart'] = serialize($cart);
  6. header("location:index.php?mod=register_success");
  7.  
  8. }


Czyli jeżeli poprawnie został dodany rekord, no to zapisuję w sesji login usera, serializuję koszyk i robię przekierowanie headerem. Jeżeli są błędy to jest zwracany formularz bez użycia funkcji header (z danymi z tablicy $_POST)
Testowałem to i wygląda na to, że działa - ale chciałbym się spytać czy to jest optymalne rozwiązanie? Header jest po to, by przenieść usera na nową stronę i nie pozwolić mu np. na ponowne przesłanie danych za pomocą refresh.

Oczywiście, jeżeli po drodze wyskoczy jakiś błąd to nie dojdzie do serializacji koszyka i zostanie on zgubiony.
erix
Cytat
Testowałem to i wygląda na to, że działa

Włącz raportowanie błędów, to przestanie. winksmiley.jpg (wskazówka: masz stałe, których używasz w kluczach tablic?)

Cytat
ale chciałbym się spytać czy to jest optymalne rozwiązanie? Header jest po to, by przenieść usera na nową stronę i nie pozwolić mu np. na ponowne przesłanie danych za pomocą refresh.

Najprostsze rozwiązania są najlepsze. Chyba w którymś przyklejonym wątku został poruszony problem powtórnego wysyłania danych.
Pilsener
No dobrze, a cel tego?
1. Po co serializować? Serializuje tablicę się zazwyczaj wtedy, jeśli chcemy ją zapisać do pliku .cfg, przecież każda zmienna może być równie dobrze tablicą, nawet $_POST['formularz'].
2. Przekierowania nie są zalecane ze względu na wydajność i logikę - po co przekierowywać usera do strony, na której już jest? Aby się zabezpieczyć przed F5 czy przypadkowym błędem, wystarczy nadać każdemu formularzowi pole hidden z value:
  1. $token = md5(uniqid());
- i sprawdzić, czy nowy formularz ma nowy token.
Civil
Serialuję tutaj akurat z innego powodu - aby zachować tablice związaną z koszykiem. Za pomocą serializacji mogę od razu wywołać klasę z wartością zmiennych (id, ilość itd.), aczkolwiek pewnie też dałoby się to zrobić w ten sposób że za każdym razem jest uruchamiana klasa, do której podaję tablicę zapisaną za pomocą sesji czyli byłoby $cart=new basket_head($_SESSION[cart]). Ale opcja z serializacją nie jest głupia też winksmiley.jpg

Co do przekierowania: to user jest przekierowywany do innej strony - po to też zapisuje w sesji jego login.

Nie bardzo rozumiem o co chodzi z tymi stałymi jako kluczami, nie można używać znaków $_SESSION['cart'] , musi być $_SESSION[cart]?
erix
Cytat
Nie bardzo rozumiem o co chodzi z tymi stałymi jako kluczami, nie można używać znaków $_SESSION['cart'] , musi być $_SESSION[cart]?

Popatrz teraz na swój kod i powiedz, czy jesteś świadom tego, co powiedziałeś. winksmiley.jpg
Civil
No nie bardzo wiem, o co Ci chodzi, możesz jaśniej?
erix
Kłania się czytanie ze zrozumieniem...

Powiedziałeś zupełnie odwrotnie - w kodzie masz pseudostałe, w poście wyżej mówisz zupełnie na odwrót...
Civil
Czyli dobrze będzie:
  1. $_SESSION['register_proceed']['customers_login']=$_POST['customers_login'];


zamiast:
  1. $_SESSION[register_proceed][customers_login]=$_POST[customers_login];


snitch.gif


?
erix
Włącz sobie raportowanie błędów i zobacz... sciana.gif
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.