Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z formularzem/przekierowaniem
Forum PHP.pl > Forum > PHP
Belze
hej

mam problem, z którym już kilka godzin się głowię i nic.

a mianowicie: mam sobie formularz zmiany hasła w cmsie. po sprawdzeniu wartości w javascript przesyła dane do pliku change.php w którym dokonywane są wszystkie zmiany w panelu admina. plik change.php wyłapuje poprzez switch dane z $_POST i kwalifikuje do odpowiedniego działania. jeżeli widzi, że jest to zmiana hasła wyrzuca dane do funkcji changePassword($starehaslo, $nowehaslo) - tam zakłada nową instancje klasy change_password, wysyła dane. po tym jak już wszystko przetworzy chciałbym aby zwracał headerem lokacje do początku, z ewentualnym ustawieniem statusu (powiodło się lub nie) bądź kodem błędu. wszystko fajnie, zwraca dane, ale w przeglądarce pojawia się adres pliku change.php a gdy wcisnę f5 pojawia się komunikat o ponownym przesłaniu formularza.
gdziekolwiek bym nie wrzucił deklaracji lokacji (czy to w pliku change.php, czy w funkcji changePassword czy tez w klasie której instancje powołuje) robi to samo.
kombinowałem z output buffering, ale nawet nie mam pojęcia jak w tym przypadku to zaimplementować.

co ciekawe, jak wrzucę w lokacji inny plik (login.php - który jeżeli widzi, że w sesji jest admin, przekierowuje na główną stronę) i "podwójnie" przejdzie przez header to jest ok.
nie chcę jednak kaszanić i obchodzić tego problemu w taki sposób

czy ktoś wie jak to dobrze zrobić albo jak użyć poprawnie output buffering do tego?

pozdrawiam
maly_swd
a mozemy zobaczyc jak Ty to robisz? przyklad?
Belze
formularz:
  1. <form action="change.php" name="formularz-zmianahasla" id="formularz-zmianahasla" method="post" class="formularz">
  2. Stare hasło:&nbsp;<input type="text" name="haslostare" id="haslostare" class="input-box"/><br><br>
  3. Nowe hasło:&nbsp;<input type="password" name="haslonowe" id="haslonowe" class="input-box"/><br><br>
  4. Powtórz nowe hasło:&nbsp;<input type="password" name="haslonowe2" id="haslonowe2" class="input-box"/><br><br>
  5. <input type="hidden" name="wyslany" value="1"/>
  6. <input type="hidden" name="action" value="password"/>
  7. <input type="submit" id="button" value="Zmień"/>
  8. </form>


dalej walidacja js

dalej przechodzi przez submit do change:

  1. if (isset($_POST['wyslany'])) {
  2. $akcja = $_POST['action']; } else { header("Location: index.php", false); }
  3.  
  4. switch($akcja) {
  5. case "password":
  6. changePassword($_POST['haslostare'], $_POST['haslonowe'], $_POST['haslonowe2']);
  7. break;
  8. // tutaj reszta ...
  9. default:
  10. header("Location: ".ADMIN_URL."index.php?error=NN");
  11. die();
  12. }


dalej w functions

  1. function changePassword($oldpass, $newpass, $newpass2) {
  2.  
  3. // tutaj includuje config i plik z klasa dbadmin
  4.  
  5. if ($newpass != $newpass2) { header("Location: ".ADMIN_URL."index.php?error=6"); die(); }
  6. //tworzy nową klasę
  7. $zmianahasla = new dbadmin;
  8. $admin_login = $_SESSION['login'];
  9.  
  10. // zmienia haslo lub wyswietla blad (nieprawidlowe haslo)
  11. $zmianahasla -> change_password($admin_login, $oldpass, $newpass, $db_host, $db_name, $db_password);
  12.  
  13. }


i klasa:
  1. function change_password($admin_login, $old_password, $new_password, $db_host, $db_name, $db_password)
  2. {
  3.  
  4. // tutaj laczy sie z baza, pobiera haslo etc.
  5.  
  6. if ($admin_password != sha1($old_password)) {
  7. header("Location: ".ADMIN_URL."index.php?error=8");
  8. } else {
  9.  
  10. $new_password = sha1($new_password);
  11.  
  12.  
  13. // tutaj udejtuje w bazie haslo
  14.  
  15. header("Location: ".ADMIN_URL."index.php?status=1");
  16. }
  17.  
  18. }
Ociu
@Belze: Proszę używać odpowiedniego kolorowania składni. Mamy kolorowanie dla języków HTML [HTML], PHP [PHP] i kupę innych, dostępnych w select'cie "Kolorowanie składni". Proszę zmienić poprawić swój post i używać kolorowania, ponieważ może to doprowadzić do usunięcia tematu.

pozdrawiam.
Belze
wybaczcie, często tu nie bywam, więc zapomniałem o takiej opcji, już poprawiłem smile.gif

edit:
ok. podwojne przekierowanie nie dziala, nie mam pojecia czemu w przypadku jednego pliku zadziałało.
czy ktoś ma jakiś pomysł? nie chcę stosować asynchronicznych zadan, bo za duzo zachodu dla takiej glupoty
thek
Jeśli nie wiesz tego, to sobie zdebuguj zmienne. Możliwe, że na etapie przekazywania ich do odpowiednich funkcji, nadpisujesz je w jakiś sposób innymi widocznymi dla reszty klasy/strony lub w jakiś sposób różnią sie one. Może zrób sobie jakiś plik logu, gdzie te informacje sobie będziesz zapisywał., wraz z wyjściem i errorami.
Belze
szczerze powiedziawszy nie wiem jak do tego mogę się zabrać ;/
wiem, co zresztą jest oczywiste, że mimo powrócenia w lokacji do pliku który go wywołał nadal ma ustawione $_POST..

ktoś pomoże?
Sky_walker
Nie wczytywałem się w treść, ale:
Jeśli masz ustawione POST a nie chcesz, to robisz $POST=null; i po problemie smile.gif

w Change.php przed zmianą header spróboj dać:
  1. $_POST['haslostare']=null;


czy coś analogicznego, żeby sprawiło, że wsio działa smile.gif
Belze
no niestety - to samo. po wrzuceniu phpinfo widze, ze wyzerowal POST, ale nadal mysli ze przeslal formularz, a request url jest change.php. czy jest mozliwosc aby zmusic go do porzucenia trybu przesylania danych.. sam juz niewiem..

wynullowalem wszystkie zmienne które odnoszą się do change.php i nic. jedyne referencje są w 'Environment'. czyli i z tego lipa

ok mam. ale nie pojmuje czemu tak to mi wyświetlało..

  1. header("Location: ".ADMIN_URL."index.php?blabla");

trzeba było wywalić ADMIN.URL - czyli bezwzględny adres. a dziwne, bo header powinno się z nim wysyłać...
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.