Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: pobranie pliku i wyslanie emaila po Submit
Forum PHP.pl > Forum > PHP
robert1974
czesc,
troche sie zaplatalem...

mam prosta forme z name, email i guzik Submit.

po wcisnieciu Submit chce by:
1. zapisalo sie do bazy name, email
2. sciagnal sie plik

opcja1 ktora probuje:
  1. <form action="downloadFile.php" method="post">


a w php mam wowczas:

  1. <?php
  2.  
  3. // questionmark.gifquestionmark.gifquestionmark.gifquestionmark.gif? czy tu dadac zapis do bazy questionmark.gifquestionmark.gifquestionmark.gif?
  4.  
  5. // We'll be outputting a PDF
  6. header('Content-type: application/pdf');
  7.  
  8. // It will be called downloaded.pdf
  9. header('Content-Disposition: attachment; filename="downloaded.pdf"');
  10.  
  11. // The PDF source is in original.pdf
  12. readfile('original.pdf');
  13. ?>


na poczatku tego php moge dodac zapisa do bazy, ale jak pobrac do niego wartosci name i email





Aqu
  1. <input type="text" name="email"/>


  1. $_POST['email'] // zmienna w ktorej masz tresc tego pola
robert1974
zaraz probuje, dzieki

pytanie:
jesli robie tak:
  1. <form name="before_form" method="POST" action="">


to wtedy przeladowuje akutalna strone. I wtedy moge uzyc var_dump($_POST); by zobacz ustawione wartosci.


a tuta robie:
  1. <form action="downloadFile.php" method="post">


czyli z odp rozumiem, ze $POST bedzie dostepna w downloadFile.php pliku. A w jaki sposob moglbym zobaczyc co rzeczywiscie tam jest dostepne? bo var_dump($_POST); mi tam nie zadziala.

..........................................



albo jeszcze inaczej czy daloby sie zrobic to w ten sposob:

  1. <form name="before_form" method="POST" action="">


by przeladowac obecna strone, wtedy moge sprawdzic czy $POST name i email sa ustawione i zapisac je do bazy, tylko jak wowczs zapoczatkowac pobieranie pliku?
Aqu
po prostu zakończ skrypt za tym:
  1. var_dump($_POST); exit;
robert1974
genialne, dzieki. teraz php pokazuje co dostaje w $POST a zatem latwiej mi zakododowac jego zawartosc.







jeszcze musze dopytac:

1. w przypadku uzycia oddzilenego php ktory sciaga plik, zapisuje do bazy i wysyla email .... jesli potrzebuja jeszcze jakiesj wartosc ktora nie jest w form a zatem nie jest dostepna w POST to co najlepiej zrobic? Czy wstawic ja do form jako hidden wartosc by w ten sposob byla dostepna w php?

2. czy nie da sie zrobic tego (jak pisalem w opcji2) by nie uzywac dodatkowego pliku php, a zeby logika wyslania emaila, zapisu do bazy (te dwie wiem ze sie da) oraz sciagniecia pliku byly czescia glownej strony?

cos jak:
  1. <?php
  2. if((!isset($_POST['BtnSubmit']) || (isset($_POST['BtnSubmit']) && strlen($_POST['myEmail'])==0))) //or not pressed, or pressed by with empty field and not entry from email
  3. {
  4. //wyswietlam formularz
  5. }
  6. else
  7. {
  8. //zapis info do bazy
  9.  
  10. //wslanie emaila
  11.  
  12. // no i w questionmark.gif? jakis sposob podbranie pliku questionmark.gif?
  13. }

Aqu
1. Ale o jaką wartość chodzi? Czemu nie możesz tego na sztywno wstawić do skryptu?
2. Wstaw po prostu do else ten kod, który teraz masz w oddzielnym pliku.
robert1974
ad2.
jak pobieranie pliku przeniose to dostaje blad typu:

Warning: Cannot modify header information - headers already sent by (output started at /moj-plik-download/index.php:5) in /moj-plik-download/index.php on line 173

Aqu
Bo przed header wysyłasz coś innego do przeglądarki (html, echo w php).

http://phpedia.pl/wiki/Cannot_add_header_i...rs_already_sent
robert1974
tak, wiem, czytalem o tym, to prawda wysylam, ale to by oznaczalo ze moj else musialby robic tylko te rzeczy i nic nie rysowac.
Czyli moze jednak w oddzilnym pliku sprobuje smile.gif

@Acu, jeszcze jedno, bo znow utknalem smile.gif

wciskam guzik DOWNLOAD, ...jesli uzywam tej opcji (<form action="downloadFile.php" method="post">) to $POST wartosci sa dostepne w downloadFile.php i to dziala juz OK: pobieram plik i zapisuje info do bazy.


... tylko ze jeszcze to na stronie glownej (gdzie jest guzik) musze sie jakos dobrac do tych wartosci z $POST, bo teraz po kliknieciu ten guzik DOWNLOAD musi zniknac i wypisac musze podziekowania.

na stronie glownej dodalem dla debugowania : var_dump($_POST); ale zarowno przed wcisnieciem guzika jak i po, tablica $POST jest pusta.

rozumiem, ze to zachowawnie jest zwiazane z <form action="downloadFile.php" method="post"> bo w przeszlosci gdy uzywalem <form name="before_form" method="POST" action=""> (akcja pusta) to $POST byl dostepny na stronie glownej/wywolujacej.

....


jeszcze taki mialem pomysl, ale tez niewypal sad.gif

chcialem w tym skrypcie php na jego koncu zrobic tak:

$_SESSION['FM_downloaded'] = true;
header("Location: ". $_SERVER['REQUEST_URI']);

a potem w glownym programie sprawdzac czy zmienna sesyjna jest ustawiona i jesli tak, to nie wyswietlac ponownie formularza. Niestety poniewaz w tym php mam juz na koncu:

  1. header('Content-type: application/pdf');
  2.  
  3. // It will be called downloaded.pdf
  4. header('Content-Disposition: attachment; filename="downloaded.pdf"');
  5.  
  6. // The PDF source is in original.pdf
  7. readfile('original.pdf');



to wywolanie trugi raz: header("Location: ". $_SERVER['REQUEST_URI']); nie dziala


jakis pomysl ktos moze?



ogolnie, tak jak pisalem wyzej, daze to tego by po wypelnioneniu formularza i wcisnieciu guzika Submit od razu sciagal sie plik (i to sie robi) ale tez by przeladowywala sie strona glowna i juz nie pojawial formularz.

.... naczytalem sie w google, chyba to jednak nie takie proste, musze zmienic sposob rozwiazania sad.gif
Turson
Cytat
ogolnie, tak jak pisalem wyzej, daze to tego by po wypelnioneniu formularza i wcisnieciu guzika Submit od razu sciagal sie plik (i to sie robi) ale tez by przeladowywala sie strona glowna i juz nie pojawial formularz.

Zrób to na odwrót. Po przesłaniu formularza:
- ustaw zmienną sesyjną na true
- przekieruj na stronę formularza
- sprawdz zmienna sesyjna i jezeli jest true to nie wyswietlaj formularza, ustaw zmienna sesyjna na false albo ją usuń i pobieraj plik, w przeciwnym wypadku po prostu pokaz formularz
robert1974
teraz sobie Wiadomosci ogladalem i wymyslilem cos takiego:

1. na stronie glownej mam formularz
2. wypelniam go i wciskam guzik "Request file", to spowoduje przeladowanie strony glownej, z ustawionymi wartociami w $POST. to pozwoli mi w php na glownej stronie obsluzyc: a.sprawdzenie poprawnosci danych wpisanych przez uzytkownika, b. zapisanie info do bazy, c. wyswietlenie drugiego guzika o nazwie "Download file".
3. wcisniecie guzika "Download file" pobierze plik

taki pomysl, ale czy dobry to sam jeszcze nie wiem.

Cytat(Turson @ 13.04.2015, 19:28:03 ) *
Zrób to na odwrót. Po przesłaniu formularza:
- ustaw zmienną sesyjną na true
- przekieruj na stronę formularza
- sprawdz zmienna sesyjna i jezeli jest true to nie wyswietlaj formularza, ustaw zmienna sesyjna na false albo ją usuń i pobieraj plik, w przeciwnym wypadku po prostu pokaz formularz


to tez super pomysl, zaraz sprawdze w praniu.

@Turson: w Twoim rozwiazaniu otrzymuje ten blad: "Cannot modify header information - headers already sent by ..." z ktorym nie potrafie sobie poradzic. Probuje.
Turson
Wklej treść błędu w Google a na pewno sobie poradzisz. Dość popularny temat. No i pochwal się kodem
robert1974
tak, buszuje w google, ...no i poradzilem sobie ze przenioslem ta logike (sprawdzenie czy zmienna $SESSION ustawiona jest (przez php)) na sam poczatek glownej strony, wtedy bledu o headerze nie dostaje, ale plik sie czemus nie sciaga. Sprawdzam jeszcze.

wyglada to tak:

formularz jest tak:
  1. <form name="before_form" method="POST" action="downloadFile.php">


w pliku downloadFile.php zapisuje do bazy info i na koncu ustawiam zmienna $SESSION po czym przekierowuje na strone glowna:

  1. ...
  2. $_SESSION['FM_downloaded'] = true;
  3. header("Location: /strona_glowna/");
  4. ?>



a na stronie glownej, na samym poczatku zrobilem:

  1. <?php
  2. if($_SESSION['FM_downloaded'] == true)
  3. {
  4. //echo 'jest';
  5. unset($_SESSION['FM_downloaded']);
  6.  
  7. // We'll be outputting a PDF
  8. header('Content-type: application/pdf');
  9.  
  10. // It will be called downloaded.pdf
  11. header('Content-Disposition: attachment; filename="downloaded.pdf"');
  12.  
  13. // The PDF source is in original.pdf
  14. readfile('original.pdf');
  15. }
  16. ?>
  17.  
  18. i tutaj jest dalsz czesc strony glownej (czesc w HTMLu, czesc w PHP)


czy dam exit; po readfile() czy nie dam, nic nic nie zmienia. Bledu header teraz nie wyrzuca teraz, bo jest na poczastku, ale z jakiegos powodu pliku nie sciaga. A sam kod pobrania pliku powinen byc OK, bo jak go wkleje do php i usune stamtad przekierowanie header("Location: /strona_glowna/"); to dziala.
Turson
Po readfile daj exit
robert1974
nie pomoga, nie ma zadnego bledu na stronie, ...ale nie sciaga pliku.
Turson
  1. if($_SESSION['FM_downloaded'] == true)

tutaj powinieneś mieć sprawdzenie czy taki element w sesji w ogóle istnieje i jak istnieje to czy jest prawdą.
Nigdzie nie widzę session_start(), włącz pełne raportowanie błędów
Aqu
Możesz to wszystko uprościć w ten sposób, że:
form action=""
po naciśnięciu Wyślij javascriptem: otwierasz w nowym oknie downloadFile.php + wysyłasz formularz, na stronie głównej wyświetlasz komunikat

albo na stronie głównej dajesz iframe src="downloadFile.php" 1px i chyba też powinno zadziałać.
robert1974
@Turson:
bravo!!!!
jak wstawialem ten kod sciagania na poczatku strony glownej to wstawilem go nawet przed: <?php session_start(); ?> sad.gif(( shame.
i wtedy nie widzial $_SESSION['FM_downloaded'] czyli nie wchodzil do IF, czyli nie sciagal. Juz dziala. Krok do przodu. Wielkie dzieki.

czyli w sumie wrocilismy do wersji ktora wczesniej rozwazalem z Acu, ze mozna by wszystko zrobic na stronie glownej, bez oddzielnego php. Musze to przemyslec, bo teraz w sumie w php pliku jest tylk zapis do bazy i ustawianie Session.


A co to znaczy wlaczenie pelnego logowania? Oj, sporo nauki przede mna smile.gif
Turson
Można w jednym pliku. Pseudokod:
  1. if(!empty($_POST)){
  2. zapisz do bazy
  3. session=true
  4. }
  5. if(session === true){
  6. session=false
  7. pobierz plik
  8. }
  9. wyswietl formularz


miałem na myśli właczenie pełnego raportowania błędów error_reporting
robert1974
oic... znow cos nie tak... wlasnie patrze, ze jak po pobierz plik robie exit to on juz nie przetwarza reszty strony / reszty kodu z tego pliku.
czyli nie moge zrobic sprawdzenia czy jesli $SESSION ustawiona to nie wyswietlaj formularza ponownie.

znow cos robie zle?
Turson
Więc przenieś pobieranie na sam koniec pliku jak już jest strona załadowana. Tyle że przed pobieraniem bodajże musisz wyczyścic bufor, bo wcześniej był content
robert1974
zatoczylismy kolo smile.gif, bo jesli przenoisze ta czesc sprawdzajaca i sciagajaca plik nizej to dostaje slynny blad: Warning: Cannot modify header information - headers already sent by

kombinuje jeszcze z tymi funkcjami:
ob_start();
ob_end_flush();
ob_end_clean()

ale wciaz nie ogarniam.
Nattfarinn
Tak tylko dodam: unikaj readfile do pobierania plików. W przypadku większych plików (a wbrew pozorom wcale nie tak dużych) z łatwością przekroczysz limit dostępnej pamięci i wysypiesz aplikację. Readfile wczytuje zawartość całego pliku do pamięci, a na potrzeby pobierania pliku to trochę bez sensu. Dla 1mb plików problem raczej nie wystąpi, ale w ramach "dobrych zwyczajów" proponuję rozważyć jakieś rozwiązanie z porcjowaniem czy wykorzystaniem serwera HTTP do pobierania pliku. smile.gif
robert1974
dzieki za komentarz, dobra uwaga, ja pliki mam akurat male, ... no i wydawalo mi sie ze to wygodne rozwiazanie w stylu, wciaskasz guzik i masz plik u siebie.
niestety, wciaz sie z tym zmagam i cos robie zle.
Turson
Przypomniało mi się, że nie musisz używać niczego specjalnego do pobierania pliku. header() na ścieżkę z plikiem powininen wymusic przeglądarce pobieranie
robert1974
a ja sie dzis poddalem z tamtym rozwiazaniem :-( ... i sprobowalem swojego pomyslu z 2 krokowym sciagnieciem. Wyglada ze dziala. Ale walka byla. Dzieki za pomoc.

dzieki i za ten kolejny pomysl, sprobuje z tym headerem tylko, ale jak psychicznie odpoczne od tematu smile.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.