Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Nie można przekazać zmiennej?
Forum PHP.pl > Forum > Przedszkole
Nagareteku
To dopełnienie tego tematu.

Zachodziłem w głowę, co sprawia, że nie mogę się zalogować i odkryłem problem. Ale za nic nie mogę odnaleźć rozwiązania.

Taki kod pozwala mi się logować bez problemu:

  1. $curl = curl_init();
  2. curl_setopt($curl, CURLOPT_URL, "http://strona.com/login.html");
  3. curl_setopt($curl, CURLOPT_HEADER, 1);
  4. curl_setopt($curl, CURLOPT_POST, 1);
  5. curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
  6. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  7. curl_setopt($curl, CURLOPT_COOKIESESSION, true);
  8. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false );
  9. curl_setopt($curl, CURLOPT_POSTFIELDS, "login=login&password=haslo");
  10. curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
  11. curl_setopt($curl, CURLOPT_COOKIEJAR, $_SERVER["DOCUMENT_ROOT"].'/panel/cookies/cookie.txt');
  12. curl_setopt($curl, CURLOPT_COOKIEFILE, $_SERVER["DOCUMENT_ROOT"].'/panel/cookies/cookie.txt');
  13. return curl_exec($curl);


ale już taki kod nie pozwala - strona zwraca komunikat, że cookies nie są włączone.

  1. $cookiefile = "cookie";
  2. $curl = curl_init();
  3. curl_setopt($curl, CURLOPT_URL, "http://strona.com/login.html");
  4. curl_setopt($curl, CURLOPT_HEADER, 1);
  5. curl_setopt($curl, CURLOPT_POST, 1);
  6. curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
  7. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  8. curl_setopt($curl, CURLOPT_COOKIESESSION, true);
  9. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false );
  10. curl_setopt($curl, CURLOPT_POSTFIELDS, "login=login&password=haslo");
  11. curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
  12. curl_setopt($curl, CURLOPT_COOKIEJAR, $_SERVER["DOCUMENT_ROOT"].'/panel/cookies/'.$cookiefile.'.txt');
  13. curl_setopt($curl, CURLOPT_COOKIEFILE, $_SERVER["DOCUMENT_ROOT"].'/panel/cookies/'.$cookiefile.'.txt');
  14. return curl_exec($curl);


Ja potrzebuję by to działało w drugiej wersji, ale skoro cURL mi takie coś odrzuca to... co mam zrobić?
Dodam, że plik cookie.txt istnieje i w obu wersjach ciasteczko zapisuje się i można je odczytać. Ale nie działa. Bo nie.

Ja nie rozumiem, jak miałbym to rozwiązać.

Z góry dzięki za pomoc!
lukasz1985
Haha, niezłe cookie smile.gif no ciekawe..


A sprawdziłeś może czy w pliku, poza kodem PHP nie masz białych znaków (przed <?php i po ?>) ?
Nagareteku
Sprawdzałem, wszystko jest czyste :x
Gość
Cytat(Nagareteku @ 17.01.2014, 16:05:02 ) *
Sprawdzałem, wszystko jest czyste :x

Sprawdzałeś BOM?
Nagareteku
Tak, w końcu używam Notepada++, chociaż nie wiem, co to ma do rzeczy, skoro te dwa kody operują na tym samym pliku, dwa te kody zapisują dobrze, ale ten drugi jakoś działa tak, że z podaną zmienną, ciasteczka są "wyłączone".
sowiq
Cytat(Nagareteku @ 17.01.2014, 16:29:50 ) *
ale ten drugi jakoś działa tak, że z podaną zmienną, ciasteczka są "wyłączone".

Nie ma takiej opcji. Te dwa kody są równoważne, a problem musi leżeć gdzie indziej.

Dla testu wykonaj poniższy scenariusz:
1. var_dump( $_SERVER["DOCUMENT_ROOT"] . '/panel/cookies/cookie.txt' );
2. Utwórz pusty plik z lokalizacją jak w 1.
3. Wykonaj pierwszą wersję skryptu kilka razy
4. Wykonaj 1. i 2., a w 3. punkcie uruchamiaj drugą wersję skryptu.

[edit]
Aha, jeszcze jedno, chyba najważniejsze. Kiedy używasz pliku COOKIEJAR, musisz wykonać curl_close, żeby wyzwolić zapis ciastek.

http://php.net/manual/en/function.curl-setopt.php

Cytat
CURLOPT_COOKIEJAR
The name of a file to save all internal cookies to when the handle is closed, e.g. after a call to curl_close.
Nagareteku
@sowiq

Nawet nie muszę robić tego dla drugiego scenariusza.

Dla pierwszego scenariusza to wygląda tak:

1. Tworzę plik dla ciasteczka.
2. Uruchamiam logowanie.
3. Błąd - "cookies are not enabled"
4. Wciskam F5, nie usuwam pliku ciasteczka.
5. Logowanie działa.

Zrobiłem też wersje bez tworzenia pliku manualnie: daję go utworzyć cURLowi.
1. Uruchamiam logowanie.
2. Błąd - "cookies are not enabled", ale plik jest utworzony, ciasteczko zapisane
3. Wciskam F5, nie usuwam pliku ciasteczka.
5. Logowanie działa.

Tego to ja już w ogóle nie rozumiem.


#edit

1. zrobiłem jednak wersję dla drugiego scenariusza (ze zmienną) - to samo
2. var_dump dla każdego scenariusza wygląda tak samo, po każdym uruchomieniu:

  1. string(36) "D:/WebServ/httpd//panel/cookies/cookie.txt"
sowiq
Niektóre strony sprawdzają, czy masz włączoną obsługę cookies. W tym celu za pierwszym razem (kiedy jeszcze ciastko nie jest dostępne do odczytu) odświeżają stronę. Widocznie ta Twoja robi to inaczej niż za pomocą nagłówka HTTP. Po prostu cURL nie rozumie tego przekierowania i za pierwszym razem po prostu pokazuje Ci komunikat. Za drugim razem, kiedy ciastko już jest w pliku i zostanie wysłane na serwer, wszystko jest OK.

Rozwiązanie jest proste. Przed zalogowaniem zrób jednego dodatkowego requesta tylko po to, żeby utworzyło Ci ciastko smile.gif
Nagareteku
Podziałało, ale tylko pod warunkiem, że pobieranie ciasteczka i logowanie będzie odbywało się w dwóch różnych modułach, nie mogły następować po sobie.

Dzięki wielkie, masz u mnie piwo! : )
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.