Witaj, Gościu O nas | Kontakt | Mapa
Wortal Forum PHPEdia.pl Planeta Kubek IRC Przetestuj się!

cURL cz. 1: Podstawy i protokół HTTP

Formularze

Formularze są jednym z najważniejszych sposobów na interakcję użytkownika ze stroną umieszczoną na serwerze HTTP. Dane pochodzące z nich mogą być przesyłane dwiema różnymi metodami: GET oraz POST. O ile pierwsza z nich nie powinna wymagać wyjaśnień, o tyle używanie drugiej wymaga nieco innego podejścia.

Na początku powiadamiamy przeglądarkę o nadchodzących danych z formularza za pomocą nagłówka Content-Type (multipart/form-data lub application/x-www-form-urlencoded). Client URL Library robi to automatycznie, lecz możemy narzucić to zachowanie przypisując wartość true opcji CURLOPT_POST. Następnie przekazujemy nazwy i zawartość zmiennych poprzez CURLOPT_POSTFIELDS. Niestety dokumentacja przedstawia tylko jeden, mniej wygodny sposób na wykonanie tej czynności, czyli przekazanie spreparowanego ciągu znaków.

Pojawia się tu problem ze znakami specjalnymi, które należy zakodować poprzez użycie funkcji urlencode. Ręczne przygotowywanie powyższego ciągu może być męczące, dlatego pomożemy sobie funkcją, która znajduje się w listingu 7.1.

<?php
function createPostString($aPostFields) {
    foreach ($aPostFields as $key => $value) {
        $aPostFields[$key] = urlencode($key) . '=' . urlencode($value);
    }
    return implode('&', $aPostFields);
}
?>

Oto skrypt wykorzystujący ją:

<?php
$postFields['zwykły_tekst'] = 'tekst1';
$postFields['e-mail'] = 'example@example.com';
$postFields['non-alfanum'] = '~!@#$%^&*()_+';
$ch = curl_init('http://localhost/curl/site.php');
curl_setopt($ch, CURLOPT_POSTFIELDS, createPostString($postFields));
curl_exec($ch);
curl_close($ch);
?>

Powyższa metoda pozwala wyłącznie na przesyłanie danych tekstowych, więc przy przesyłaniu plików będziemy musieli wykorzystać drugi, prostszy sposób - przekazanie samej tablicy. Modyfikacja skryptu z listingu 7.2 ogranicza się do usunięcia wywołania funkcji createPostString i przekazania zmiennej $postFields.

<?php
$postFields['zwykły_tekst'] = 'tekst1';
$postFields['e-mail'] = 'example@example.com';
$postFields['non-alfanum'] = '~!@#$%^&*()_+';
$ch = curl_init('http://localhost/curl/site.php');
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
curl_exec($ch);
curl_close($ch);
?>

Niestety, nic nie jest idealne - ten sposób posiada również jedną znaczącą wadę, która wyjdzie na jaw przy wysyłaniu plików.

Informacje na podobny temat:
Wasze opinie
Wszystkie opinie użytkowników: (10)
dlaczego
Wtorek 27 Styczeń 2009 2:02:34 pm - yaotzin <yaotzin1_at_o2.pl>

dlaczego znowu nie można wydrukować sobie tego artykułu ??

pobieranie nagłówków
Środa 13 Luty 2008 10:10:17 am - jarmiar <jarek21-1992_at_tlen.pl>

jak można pobrać nagłówki wysyłane przez serwer, do którego chcemy się połączyć i zapisać je w tablicy lub w jakiejś zmiennej

ciastka w zminnych
Piątek 02 Listopad 2007 3:49:11 am - Gacek89 <czupa_at_vp.pl>

witam,
na poczatek chiał bym pogratulowaćdobrego artyku, jak narazie njlepszy jaki w seci znalazłem o curl

chciałbym sie dowedzieć jak mozna zapisać cookies do zmiennej i puźniej z niej odczytać je

Kasowanie ciastek
Wtorek 06 Marzec 2007 1:20:50 am - gustawgustaw <gustawsolski_at_gmail.com>

A jak wykasować automatycznie ciastka po zakończeniu sesji curl?

Nawiasy klamrowe.
Czwartek 08 Luty 2007 9:04:27 pm - Ludvik

Słuszna uwaga. Poprawiłem to. Wielkie dzięki za wskazanie błędu. Dziwne, że u mnie nie wywalało nic.

Re: problem
Piątek 17 Listopad 2006 3:49:05 pm - pako1979

przelicz nawiasy klamrowe w funkcji showAll , brakuje jednego zamykajcego, jak dodasz powinno zadzaialac

Re...
Poniedziałek 06 Listopad 2006 1:29:51 pm - Ludvik

Nie mam jak tego sprawdzić teraz dokładnie, ale w drugim skrypcie prawdopodobnie zamiast URL wpisałeś nazwę samego pliku.

Sprawdzałem skrypty wcześniej i dziwię się, że coś takiego wyskakuje... Jeszcze raz bym rzucił na to okiem, ale nie mam jak, niestety...

problem
Środa 25 Październik 2006 8:05:17 pm - teo <morfeusz215_at_wp.pl>

Witam mam pewien problem : skopiowałem przykładowa stronke - "site.php" jednak gdy ją włańczam manualnie wyskakuje bład :

Parse error: syntax error, unexpected $end in .........../site.php on line 20

lub poprzez L.2.2 wtedy nic sie nie dzieje a gdy przez 3.1 , został wygenerowany nastepujacy bład :

Błąd #6: Couldn't resolve host 'site.php'

Re: bezpieczeństwo
Piątek 18 Sierpień 2006 10:15:35 am - Ludvik

Wszystkie informacje o transferze są zwracane przez metodę curl_getinfo, tak jak jest napisane w 3. części. Nie chciałem zamieszczać spisu stałych, gdyż wszystkie znajdują się manualu.

http://pl.php.net/curl_getinfo

bepieczeństwo
Czwartek 17 Sierpień 2006 11:20:52 pm - takeshin

wszystko pięknie i fajnie,
ale jak to wygląda od strony bezpieczeństwa?

jak sprawdzić, jaki dokument pobieram i ile zajmuje?
co w przypadku jeśli przy wykonaniu:
$ch = curl_init('http://localhost/curl/site.php');
okaże się, że to wcale nie jest plik typu,
którego chciałbym (xml, html) a na przykład 700 avi?

Mentax.pl    NQ.pl- serwery z dodatkiem świętego spokoju...   
O nas | Kontakt | Mapa serwisu
Copyright (c) 2003-2022 php.pl    Wszystkie prawa zastrzeżone    Powered by eZ publish Content Management System eZ publish Content Management System