Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] przekierowanie w zależności od formularza
Forum PHP.pl > Forum > PHP
xandersky
Witam..

Nie mogę sobie poradzić z jedną rzeczą..

Potrzebuję zrobić coś takiego:

Formularz ma trzy rubryki :

- nazwa
- cena
- koszt

W zależności od tego czy koszt jest "0" czy jest inny potrzebuje:

- jeżeli jest 0 to dodać rekord do bazy danych
- jeżeli coś w formularzu kosztów wpiszę chcę by przekierowało mnie i przekazało dane do strony gdzie będę jeszcze mógł uzupełnić opis kosztów i dopiero to wszystko wysłać do bazy..

Co do kodu..

1) Sam formularz

  1. <tr>
  2. <td class="row1">
  3. <br />
  4. Dodaj nowy zakup:
  5. <br /><br />
  6. <form action="add.php" method="post">
  7. Telefon:&nbsp;
  8. <input type="text" name="telefon" />&nbsp;&nbsp;
  9. Kwota zakupu:&nbsp;
  10. <input type="text" name="kwota" />&nbsp;&nbsp;
  11. Koszty:&nbsp;
  12. <input type="text" name="koszt" />&nbsp;&nbsp;
  13. <input type="submit" value="&nbsp;Zapisz&nbsp;" />
  14. </form>
  15. </td>
  16. </tr>


2) Plik add.php

  1. $user= $_SESSION['uzytkownik'];
  2. $data=date("d-m-Y");
  3. $data1=date("m");
  4. $telefon = $_POST['telefon'];
  5. $kwota = $_POST['kwota'];
  6. $icon_warn = "<br /><img src=\"/telefony/images/warning-icon.png\">";
  7. $koszt = $_POST['koszt'];
  8.  
  9. if($koszt == 0)
  10. {
  11. if($telefon and $kwota)
  12. {
  13. // dodajemy rekord do bazy
  14. $ins = @mysql_query("INSERT INTO telefony_kupione SET telefon='$telefon', kwota='$kwota', data='$data', data1='$data1'");
  15.  
  16. if($ins)
  17. {
  18. $wyn="<br /><table width=\"100%\" cellpadding=\"3\" cellspacing=\"0\" border=\"0\" class=\"forumline\"><tr><td class=\"row1\" colspan=\"2\" height=\"28\">&nbsp;".$icon_warn."&nbsp;&nbsp;<b>Rekord został dodany poprawnie. Kliknij <a href=\"main.php\">Tutaj</a> aby powrócić</b></td></tr><tr><td class=\"catHead\" colspan=\"4\" height=\"28\"><span class=\"cattitle\"><b>&nbsp;</b></span></td></tr></table><br /><br />";
  19. }
  20. else
  21. {
  22. $wyn="<br /><table width=\"100%\" cellpadding=\"3\" cellspacing=\"0\" border=\"0\" class=\"forumline\"><tr><td class=\"row1\" colspan=\"2\" height=\"28\">Błąd nie udało się dodać nowego rekordu</td></tr><tr><td class=\"catHead\" colspan=\"4\" height=\"28\"><span class=\"cattitle\"><b>&nbsp;</b></span></td></tr></table><br /><br />";
  23. }
  24.  
  25. }
  26. }
  27. else
  28. {
  29. header("costs.php?step=add&amp;telefon=$telefon&amp;kwota=$kwota&amp;koszt=$koszt");
  30. }


Tu w przypadku else próbowałem przekierować dane GET'em do strony costs.php gdzie mógłbym dodać opis kosztów..

Niestety całe powyższe rozwiązanie nie działa..

W przypadku gdy koszt jest wpisany 0 to rekord dodaje się do bazy bez problemu natomiast gdy wpiszę cokolwiek innego poza zerem nic się nie dzieje..

Ma ktoś pomysł jak to rozwiązać? ewentualnie gdzie popełniłem błąd??

Pozdrawiam serdecznie
mortus
Możesz:
1. Dane zapisać i odczytać w/z $_SESSION.
2. Użyć url_encode() i url_decode(), bo jeśli wpisane dane zawierają znaki specjalne, spacje i tym podobne, to nie zostaną przekazane lub będą obcięte.
xandersky
Mimo dodania encode i decode nic się nie dzieje.. W Sesji nie bardzo mam pomysł jak to rozwiązać sad.gif

Normalnie dane z POSTa zapisać do sesji i na na następnej stronie je odczytać? Coś czuje że mogę nie poradzić sobie technicznie sad.gif

Micchaleq
Ogólnie można to też zrobic na klasie,

ale wydaje mi się, że jeżeli w cost.php masz jakies dane wyświetlania
to zamiast przejścia możesz je wczytać do add.php przez include i wówczas będziesz miał wszystkie zmienne z $_post

podeslij jeszcze plik cost
mortus
Użycie klasy niczego tutaj nie zmieni, bo nie w tym problem. Zresztą wartości pól klasy i tak trzeba by było gdzieś (np. sesja) przechować. Problem w tym, że funkcja header() jest użyta nieprawidłowo. Powinno być:
  1. header('Location: helpdesc.php?step=add&telefon='.urlencode($telefon).'&kwota='.urlencode($kwota).'&koszt='.urlencode($koszt));

Gwoli wyjaśnienia, problemem jest brak Location: , natomiast funkcji urlencode() użyłem, aby można było przesyłać również znaki specjalne (jak np. spacja).

Jednak do rozwiązania problemu użyłbym sesji, jak wcześniej wspomniałem. Zresztą nie ma w tym nic trudnego:
  1. // w pliku add.php
  2. $_SESSION['add']['telefon'] = $telefon;
  3. $_SESSION['add']['kwota'] = $kwota;
  4. $_SESSION['add']['koszt'] = $koszt;
  5.  
  6. // a w pliku costs.php
  7. if(isset($_SESSION['add'])) {
  8. $step = 'add';
  9. $telefon = $_SESSION['add']['telefon'];
  10. $kwota = $_SESSION['add']['kwota'];
  11. $koszt = $_SESSION['add']['koszt'];
  12. // jeśli te wartości nie będą nam potrzebne, to wypada je usunąć
  13. unset($_SESSION['add']);
  14. }

W powyższym kodzie zgrupowałem wszystkie informacje w tablicy o indeksie 'add', jednak Ty możesz użyć innego indeksu, albo zapisać wszystko bezpośrednio w $_SESSION.
xandersky
Mortus.. Bardzo dziękuję za przykład rozwiązania problemu, oczywiście wszystko działa już jak należy smile.gif co do location.. znów zapomniałem o drobnej rzeczy..

Micchaleq
i tak wydaje mi się, że w pliku cost.php jest kolejny formularz w tym też przypadku tak jak pisałem poza sesjami można by skorzystać z wczytania formularza do pliku add.php w przypadku kiedy koszta != 0
mortus
Cytat(Micchaleq @ 18.11.2011, 08:26:50 ) *
i tak wydaje mi się, że w pliku cost.php jest kolejny formularz w tym też przypadku tak jak pisałem poza sesjami można by skorzystać z wczytania formularza do pliku add.php w przypadku kiedy koszta != 0


Nie można, zmienne w PHP nie są bytem trwałym. Każde żądanie (wejście na stronę, odświeżenie strony) powoduje wygenerowanie i wczytywanie nowej zawartości, wykonanie skryptu ponownie. Zatem po przejściu z pliku add.php do costs.php zmienne z add.php kończą żywot. Mechanizmy, które pozwalają nam przechowywać te zmienne to m.in. ciasteczka, sesje, a w szczególnych przypadkach bazy danych, czy pliki.
Micchaleq
Cytat(mortus @ 18.11.2011, 08:41:43 ) *
Nie można, zmienne w PHP nie są bytem trwałym. Każde żądanie (wejście na stronę, odświeżenie strony) powoduje wygenerowanie i wczytywanie nowej zawartości, wykonanie skryptu ponownie. Zatem po przejściu z pliku add.php do costs.php zmienne z add.php kończą żywot. Mechanizmy, które pozwalają nam przechowywać te zmienne to m.in. ciasteczka, sesje, a w szczególnych przypadkach bazy danych, czy pliki.


Nie przeczytałeś mojego postu ze zrozumieniem.

Wydaje mi się, że plik cost.php zawiera formularz w większości html, więc

index.php->add.php ( if$koszt != 0, include cost.php )

i pracujemy na pliku add.php mając wewnątrz wczytany plik cost.php
xandersky
Cytat(Micchaleq @ 18.11.2011, 10:52:34 ) *
i pracujemy na pliku add.php mając wewnątrz wczytany plik cost.php


Ja generalnie potrzebuję wyświetlić ten plik.. Wczytanie go nic mi nie da - na jedno by wyszło jakbym kod PHP z costs.php zamieścił od razu w pliku add.php.. Fizycznie chodzi o to by:

- jeżeli w formularzu w add.php wpiszę koszty = 0 - zapisuje mi dane do bazy
- natomiast gdy wpiszę już jakąś sumę wtedy przekierowuje mnie do drugiego formularza w którym to wypełniam sobie co to za koszty i dopiero całość zapisuję do bazy danych..

Metoda z headerem i przekierowaniem danych getem do costs.php działa poprawnie także nie ma co już tutaj ruszać wink.gif

Teoretycznie mógłbym jeszcze wszystko zrobić w pliku add.php na zasadzie if($koszt == 0) oraz elseif($koszt != 0) natomiast formularz kosztów będzie operować na innej tabeli w bazie i wolałem mieć go oddzielnie
Micchaleq
Wydaje mi się, że jeżeli chodzi o wydajność to nie ma większego znaczenia czy go wczytasz czy go przekierujesz. Chciałem jedynie zaprezentować, ze nie konieczne jest używanie sesji w tym przypadku.

- Nie to samo, bo teoretycznie trzymasz formularze w 2 różnych plikach, jedynie wywołanie jest w jednym.
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.