odbieranie danych ze strony

0

Jak odebrać dane z formularza PHP wysłane metodą POST?
(również jak je wysłać do aplikacji)

czy jeśli serwer www i aplikacja są w tej samej lokalizacji skrypt może się odwoływać do localhost, czy jest wykonywany po stronie użytkownika? ;>

0

Php po stronie użytkownika... jprdl...

Już któryś raz to mówię, że nikt tu nie lubi ludzi którzy wchodzą na forum i oczekują że wszystko się samo zrobi. Mam dziś dobry humor, to napiszę ale na przyszłość szukaj najpierw w googlu lub czymś takim.

<?php

  echo "tekst do wysłania";

?>
var
  S: String;  
  HTTP: TidHTTP;
begin
  HTTP := TidHTTP.Create(Self);
  try
    HTTP.Host := 'mojastrona.pl';
    S := HTTP.Get('http://mojastrona.pl/skrypt.php');
  finally
    HTTP.Free;
  end;

end;

Będziesz potrzebował komponentu TidHTTP z pakietu Indy.

1

Przypuśćmy w głównym katalogu na serwerze jest plik o nazwie login.php a w nim formularz:

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<?php
if ((isSet($_POST['login'])) && (isSet($_POST['pass']))) {
    //dla przykladu wyswietlamy co user wpisal
    echo('login: ' . $_POST['login'] . ' hasło: ' . $_POST['pass']);
}   
else { ?>
    <form action="login.php" method="post" >
    <input type="text" name="login" />
    <input type="password" name="pass" />
    <input type="submit" value="Zaloguj" />
    </form
<?php } 
?>
</body>
</html>

W tym wypadku jak wskazuje atrybut action formularz ten wyśle dane sam do siebie (mógłby do innego pliku) w każdym razie trzeba wysłać tam gdzie wskazuje action, są tylko 2 o nazwach login i pass i to właśnie one maja zostać wysłane po naciśnięciu przycisku Zaloguj

W przypadku małych, nieskomplikowanych formularzy jak ten to jest oczywiste ale w większych można się posłużyć jakiś snifferem aby podglądać jakie nagłówki są wysyłane (w moim przypadku użyłem wtyczki do FF o nazwie Live HTTP Headers). W tym przypadku wysyłane nagłówki wyglądają tak:

http://localhost/login.php

POST /login.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: pl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Referer: http://localhost/login.php
Content-Type: application/x-www-form-urlencoded
Content-Length: 26
login=loginek&pass=haselko

a odbierane:

HTTP/1.1 200 OK
Date: Tue, 03 Jan 2012 09:52:45 GMT
Server: Apache/2.2.21 (Win32) PHP/5.3.8
X-Powered-By: PHP/5.3.8
Content-Length: 170
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html

Już wiadomo co trzeba wysłać teraz pozostaje to wysyłanie oprogramować. Do protokołu HTTP(S) w Delphi najczęściej się wykorzystuje pakiety Synapse (THttpSend), Indy (TIdHTTP) lub rzadziej WebBrowser (TWebBrowser). Opiszę na przykładzie Indy (aby olesio i pozostali mieli co krytykować ;) ) Dobra do rzeczy na formę TIdHTTP (którego domyślną nazwę IdHTTP1 zmieniamy po prostu na idHTTP), 2x TEdit (nazwy edLogin i edPassword), TMemo (tu także zmiana nazwy na memo) i TButton (zmiana nazwy na btnLogin) w którego zdarzenie OnClick wpisujemy kod kod:

procedure TForm1.btnLoginClick(Sender: TObject);
const
  //daklarujemy kilka najistotniejszych których zwykle (ale nie zawsze)
  //ustawienie wystarcza stalych które mozna odczytac z wspomnianych naglowkow
  //user-agent
  UA = 'Mozilla/5.0 (Windows NT 5.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1';
  //content-type
  CT = 'application/x-www-form-urlencoded';
  //adres strony gdzie wysylamy dane (poniewaz taki sam jak referer to nie po co
  //delarowac referer)
  URL = 'http://localhost/login.php';
var
  sl: TStringList;
  res: string;
begin
  idHTTP.HandleRedirects:= True; //obsluga przekierowan
  idHTTP.Request.UserAgent:= UA; //user-agent
  //na poczatek GET aby zachowa się jak przeglądarka czyli nor,malnie pobieramy
  //formularz to dosc istotne poniewaz tu moga by ustawiane jakies ciacha
  //do tego czesto potrzeba pobrac odpowiednie generowane dynamicznie wartosci
  //z pol formularza
  res:= idHTTP.Get(URL);
  //w zmiennej res jest kod strony tu mozna by go parsowac i pobrac pola
  //formularza ale w przykladzie nie bylo pol ktorych wartosci (rzadziej ale
  //zdarzaja sie tez nazwy) generowane byly dynamicznie
  //ustawiamy referer (w przykladzie nie istotne ale inne strony czesto sprawdzaja)
  idHTTP.Request.Referer:= URL;
  //ustawiamy content-type (bardzo wazne!)
  idHTTP.Request.ContentType:= CT;
  sl:= TStringList.Create;
  try
  //tu dodajemy wszyskie pola formularza i nadajemy im warosci
  sl.Add('login=' + edLogin.Text);
  sl.Add('pass=' + edPassword.Text);
  //i wysylamy formularz metoda POST
  res:= idHTTP.Post(URL, sl);
  //w res mamy kod html odpowiedzi i mozna cos z nim zrobic w przykladzie tylko
  //go wpisze do memo
  memo.Text:= res;
  finally
  sl.Free;
  end;
end;

Sorry za długi post ale mam nadzieję że się przyda nie tylko pytającemu.

0
  1. Od tego jest newbie
  2. Paczce Synapse został poświęcony cały Artykuł
    http://4programmers.net/Delphi/Artyku%C5%82y/Obs%C5%82uga_protoko%C5%82u_HTTP_przy_u%C5%BCyciu_pakietu_Synapse
  3. Ten człowiek nie ma pojęcia o czym mówi

    Jak odebrać dane z formularza PHP wysłane metodą POST?

PHP nie wysyła nic do formularza tylko aplikacja może wysłać coś metodą POST do skryptu PHP (przez przeglądarkę jest formularz).

kAzek ładnie to opisałeś ale oni nigdy się nie nauczą używać google.pl :(

0

@kAzek: ja się nie czepiam, podałeś rozwiązanie na tacy, natomiast proqix podał link do mojego artykułu opisującego alternatywę dla indy czyli Synapse. Nie podoba mi się natomiast reagowanie tomriddle, jeżeli masz gościu coś napisać to najpierw pomyśl, a nie jedziesz kogoś, jak sam pytałeś tutaj nie raz o banały i trollowałeś zamiast poszukać w googlach. Jak nie chcesz pomóć to nie pisz, a nie wypisujesz bzdety i wprowadzasz w błąd. Na koniec cytując klasyka: "dziękuję, dobranoc".

0

Dziękuję za wyczerpującą odpowiedź, ale chyba nie do końca się zrozumieliśmy.
Nie chodzi mi o wysłanie danych z programu do formularza (chociaż to też)
ale o to jak odebrać te dane w jakiś sensowny sposób.

na razie mam formularz action="localhost:1234" method="POST"
i aplikację zbierającą dane z tego portu (komponent TCP)
tylko że odbieranie danych jest w dość mało przejrzysty sposób:
kname=imi%EAi+nazwisko&[email protected]&ktemat=temat&ktext=tre%9C%E6wiadomo%9Cci&submit=Wy%9Clij

teraz pytanie jak odebrać te dane w czytelnej formie tak jak robi to skrypt PHP (np obsługa polskich znaków bez kwiatków typu "imi%EA+i+nazwisko")

i po drugie: co wysłać z powrotem do formularza, żeby przekierował się na odpowiednią stronę?

0

nie wiem, czy w takim razie dobrze główkuję - chodzi Ci o wysłanie informacji i otrzymanie zwrotnej?
zwykle wysyłając oczekujesz informacji zwrotnej w określonym formacie

0

wysyłam dane z formularza PHP metodą POST

obieram w aplikacji informacje z formularza (JAK?!)

odsyłam informację z przekierowaniem na odpowiednią stronę (JAK?!)

0

obieram w aplikacji informacje z formularza (JAK?!)

odsyłam informację z przekierowaniem na odpowiednią stronę (JAK?!)

Dowiesz się tego po przeczytaniu KURSU PHP.

0

albo ludzie nie rozumieją albo to ja się mylę...
PHP tu nie ma nic do tego!!!
nie ważne czy formularz został napisany ręcznie czy wygenerowany przez php czy jave... piszac o PHP tylko mieszasz. formularz to formularz.
Twoje pytanie powinno brzmieć jakoś tak:

jak odebrac dane wysyłane (metodą POST) do mojego programu przez formularz na stronie www.
czyli: na stronie klikam submit, przeglądarka łączy się z Twoim programem (będącym w tym momencie serwerem) i wysyła do niego POST'em zawartość pól. o to Ci chodzi?
a dalej Twoj program wysyła do przeglądarki informacje o przekierowaniu, a ta przechodzi pod odpowiedni adres html URL, tak?

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0