Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Przekazywanie zmiennych - formularz
falko
post 21.05.2004, 18:23:20
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 25.03.2004
Skąd: pomorskie

Ostrzeżenie: (0%)
-----


Nie mam problemu, raczej szukam bardziej optymalnego rozwiązania co do przekazywania zmiennych. A mianowicie: przypuscmy ze mam stronkę formularza "formularz.php" , w którym podaje wszystkie dane. jest tu kod html oraz forma,która po "zasubmitowaniu" odwołuje sie do pliku "test_formularz.php". Zmienne z "formularz.php" są tu widziane. Przypuścmy jednak,ze użytkownik wprowadził jakieś błędne dane i chcemy go przekierować z powrotem do "formularz.php" jednocześnie jednak podstawiając we wszystkie jego pola to, co już wcześniej w nie użytkownik wpisał (dodając ewentualnie jakis komunikat o błędzie). Niestety,aby przekazać zmienne z "test_formularz.php" musiałbym użyć funkcji header("Location: formularz.php.... i tutaj przekazać wszystkie zmienne-co spowoduje,że dane te powrócą (ale metodą GET niestety!)więc pokaże się ich zawartość w pasku adresowym(co własnie chciałbym ominąć,nie tylko by ukryć co przekazuję,lecz też z powodu ograniczeń długości tak przekazywanych danych metodą GET).
Zastosowałem więc drugą metodę:) "formularz.php" odnosi się do "test_formularz.php", tutaj weryfikacja danych i napisałem sobie specjalny skrypcik, który przeklei wszystkie zmienne z tablicy $_REQUEST (czyli te przekazane metodą GET lub POST do "test_formularz.php"), łącznie z tablicami tablic:) i wracamy metodą POST do "formularz.php" (doklejając do tablicy $_REQUEST dajmy na to zmienną $blad,która będzie odpowiednio traktowana przez "formularz.php"). Nie rozwiązuje jednak to do konca sprawy,zaraz wytłumaczę czemu. Oto ten skrypcik:



plik "test_formularz.php":
[php:1:48d1222927]<?php
//funkcja przygotowujaca dane POST
//tworzy ciag dla curla w postaci "&domena=xx&ala=tak&bela=nie...."
//kopiuje takze cale tablice,tak wiec uniwersalna fajna funkcyjka
//ktora tworzy dokladna kopie tego co bylo w formularzu,nie martwimy
//sie, ze cos nam zginelo
function prepare_postdata(&$tab,$keyname)
{
static $ciag;
foreach ($tab as $klucz => $wartosc)
{
if (is_array($tab[$klucz]))
{
if ($keyname=="") prepare_postdata(&$tab[$klucz],$klucz);
else prepare_postdata(&$tab[$klucz],$keyname."[".$klucz."]");
}
else
{
if ($ciag!="") $ciag.="&";
if ($keyname=="") $ciag.="$klucz=$wartosc";
else $ciag.=$keyname."[$klucz]=$wartosc";
}
}
return $ciag;
//tutaj curl
}


function goto_url($adres_url)
{
$ch = curl_init($adres_url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS,prepare_postdata(&$_REQUEST));
curl_setopt ($ch, CURLOPT_RETURNTRANSFER,1); //zawartosc do bufora
echo curl_exec ($ch);
curl_close ($ch);
}

//tutaj weryfikacja danych z "formularz.php"
//jesli niepoprawne, to wykonujemy funkcję:

goto_url("http://costamcostam/formularz.php");
//i mamy pięknie wszystkie zmienne przekazane
[/php:1:48d1222927]?>

i mamy pięknie wszystkie zmienne przekazane...

ALE ! jest jednak małe co nieco,które wszystko chrzani. Przez jakiś czas wszystko działało pięknie, dopóki nie napisałem skryptu testującego,który już troszkę więcej "ważył" ORAZ łącznie z użyciem sesji ! (i w "formularz.php", i w "test_formularz.php"). Owszem, CURL'em przekazuje sie wszystko,łącznie z identyfikatorem sesji,jednak w momencie,gdy w "formularz.php" istnieje session_start(); ,skrypt się zacietrzewia i ni cholipy nie ruszy z miejsca, a taki niby narowisty no...!winksmiley.jpg
Ta metoda więc spaliła na panewce ...(chlip chlip)

W tym momencie wchodzi więc trzecia metoda w grę: skrypt "formularz.php", który odwołuje się do samego siebie (już nie "test_formularz.php"),czyli mamy wszystkie zmienne z powrotem w formularzu.Tu następuje test,czy wcisnieto przycisk dajmy na to "DALEJ" (żeby było wiadomo,którą część skryptu wykonać-formularz czy część testową).Jesli wcisnieto,to znaczy ze formularz był wypełniony i trzeba przetestowac. Jednak w momencie gdy tych przycisków mam powiedzmy pięć, i do każdego chcę inną część testującą oraz coś wykonującą zastosować, robi mi się jeden dłuuuuuuuuuuuuugi plik, który później trudno ogarnąć myślowo (gdzie jest ta sekcja od trzeciego przycisku,kurcze??winksmiley.jpg ) i powstaje bałagan.

Teraz plusy i minusy wszystkich wersji:
- Wersja pierwsza - header: PLUS taki,że nie ma bałaganu,bo odwołania są do takich plików testujących,których nazwy sam sobie określam, MINUS: tylko przekazywanie metodą GET ...lipa,odpada.

- Wersja druga - własna funkcja, przekazująca wszystkie zmienne. PLUS taki jak w wersji pierwszej oraz dodatkowo wszystkie zmienne przekazane z powrotem, MINUS: nie bardzo (czasem jednak tak!(?) współpracuje z sesjami

- wersja trzecia - którą jestem zmuszony zastosować PLUS: wszystko pięknie przekazywane, działa z sesjami, ale MINUS: bałagan i dłuuuuugi plik.

A więc o co mi chodzi? Pytanie mam mianowicie takie, czy znacie moze jeszcze jakis sposób na przekazywanie zmiennych, najlepszy byłby taki,który by połączył wszystkie PLUSY powyższych, a nie miał ich MINUSÓW laugh.gif biggrin.gif biggrin.gif. Dodam także, że owszem można wszystko zapamiętywać w sesji,np. w "test_formularz.php" zrobić
$_SESSION['zmiennezformularza']=$_REQUEST;
i przy powrocie do "formularz.php" odzyskać prosto z sesji przez np.
$tablica=$_SESSION['zmiennezformularza'];
ale nie mam wtedy zmiennych bezposrednio, tylko przez tablice sad.gif ,poza tym sesja to nic innego jak plik na serwerze, moze sie zrobic długi..chciałbym bez sesji... :cry:

Troche to długie,jak ktoś przebrnął to gratulacje smile.gif))))) biggrin.gif:D:D:D
Go to the top of the page
+Quote Post
hawk
post 21.05.2004, 21:12:40
Post #2





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

Ostrzeżenie: (0%)
-----


Długi plik? A od czego jest include() :wink:
Go to the top of the page
+Quote Post
Bora
post 21.05.2004, 21:30:48
Post #3





Grupa: Zarejestrowani
Postów: 270
Pomógł: 0
Dołączył: 15.06.2003

Ostrzeżenie: (0%)
-----


oop i kod będzie prosty nie bęzie problemów z sekcjmi.
Gdzieś na forum było już o tym. Przyda sie poczytać o stosie. Dane nejlepiej trzymać e sesji.

php PRo -> php
Go to the top of the page
+Quote Post
FiDO
post 21.05.2004, 23:28:23
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 717
Pomógł: 0
Dołączył: 12.06.2002
Skąd: Wolsztyn..... Studia: Zielona Góra

Ostrzeżenie: (0%)
-----


Do takiego prostego problemu uzywasz CURL'a? Niepotrzebnie... Wystarczy ze wszystkie dane z formularza zapiszesz w sesji (chocby i $_SESSION['_form'] = $_POST;), nie ma co utrudniac rzeczy prostych.

PS. Pro -> php


--------------------
Brak czasu :/
Go to the top of the page
+Quote Post
rze-X-nik
post 25.05.2004, 08:40:01
Post #5





Grupa: Zarejestrowani
Postów: 53
Pomógł: 0
Dołączył: 20.03.2004
Skąd: Szczebrzeszyn

Ostrzeżenie: (10%)
X----


Możesz przecież dać sprawdzanie po stronie klienta napisane w JSie np. z alertami i nie musisz się już martwić. Wypróbowane rozwiązanie. Submitujesz gdy zmienna z błędami jest równa 0.[/code]


--------------------
while(!$wakacje){ czekaj();
}
if($wakacje){ yuppie();
} exit;
Go to the top of the page
+Quote Post
rzseattle
post 25.05.2004, 09:36:05
Post #6





Grupa: Przyjaciele php.pl
Postów: 554
Pomógł: 0
Dołączył: 4.04.2002
Skąd: Tychy

Ostrzeżenie: (0%)
-----


Cytat
Możesz przecież dać sprawdzanie po stronie klienta napisane w JSie np. z alertami i nie musisz się już martwić. Wypróbowane rozwiązanie. Submitujesz gdy zmienna z błędami jest równa 0.[/code]


A jak ktos ma wylaczony js to sypie ci sie caly system :/.

ps. FIDO ma calkowita racje - do przesylania danych pomedzy stronami naszego servisu sluzy sesja a nie curl. Pozatym ztego co pamientam curl nie jest standartowa biblioteka wiec mozesz miec problem z kompatybilnoscia skryptu na roznych serverach.

pss. http://forum.php.pl/viewtopic.php?t=965&st...=asc&highlight=


--------------------
"Real children don't go hoppity-skip unless they are on drugs."
Go to the top of the page
+Quote Post
falko
post 25.05.2004, 09:50:55
Post #7





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 25.03.2004
Skąd: pomorskie

Ostrzeżenie: (0%)
-----


Hawk: fakt, jak zwykle na najprostsze rozwiazania najtrudniej wpasc:) (trzeba do takich spraw tak jak dziecko-z czystym umyslem, a ja tu kombinuje niepotrzebnie:) ) .No i zdecydowalem sie faktycznie na te przekazywanie zmiennych w sesji, jednak najbardziej uniwersalnie i nie martwie sie,ze cos zgubie:) Aa takie pytanko na marginesie: czy ktos wie jak to jest z tymi sesjami? Otwieram, tworzy sie plik na serwerze, zamykam powiedzmy okno przegladarki i co (przed zamknieciem sesji) ? co dzieje sie z tymi plikami? Od razu sie kasuja? Raczej nieee... Zeby nie bylo,ze zasmiecam serwerek:) Coz,to raczej faktycznie nie jest php->pro,aale chyba nie dostane od moderatorow w tylka?winksmiley.jpg (auc, to booli;) )

Pozdrawiam i dziekuje za wskazowki:)
Go to the top of the page
+Quote Post
treewood
post 25.05.2004, 11:53:04
Post #8





Grupa: Zarejestrowani
Postów: 215
Pomógł: 0
Dołączył: 18.01.2003

Ostrzeżenie: (0%)
-----


if ($ciag!="") $ciag.="&";

polecam zamienic na

if ($ciag!="") $ciag.="&amp;";


--------------------
Działam w OpenSolution.org, autor Quick.Cms i Quick.Cart już od ponad 10 lat
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 07:50