Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z file_get_contents i pętlą for
Warmix
post 25.02.2012, 12:54:21
Post #1





Grupa: Zarejestrowani
Postów: 173
Pomógł: 0
Dołączył: 13.06.2011

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


Najpiewr przedstawię skrypt, a potem opiszę problem...
  1. $kod = 'forum.php.pl
  2. forum.php.pl
  3. forum.php.pl
  4. <a href="http://phpedia.pl/wiki/Specjalna:Ostatnie_zmiany';" target="_blank">http://phpedia.pl/wiki/Specjalna:Ostatnie_zmiany';</a>
  5.  
  6. $exp = explode("\n", $kod);
  7. $ile_exp = count($exp);
  8.  
  9. for($x = 0; $x < $ile_exp; $x++)
  10. {
  11.  
  12. $down_html = file_get_contents($exp[$x]);
  13.  
  14.  
  15. if(!preg_match('/Przedszkole/', $down_html))
  16. {
  17. $ilescan++;
  18.  
  19. }
  20. }
  21. echo $ilescan;


Oczywiście tutaj tylko przykład, nie wiem, czy działa...

Na początku wszystko działa dobrze. Explode robija mi zmianną $kod po \n oraz w zmiennej $ile_exp zapisuje się ile mamy wartości w tablicy (w tym przypadku 4).
I teraz zaczyna się problem... Funkcje w pętli for nie dzialają, jak powinny...
Do zmiennej down_html pobierany jest HTML strony. Dzięki '(exp[$x])' za każdym wykoaniem pętli jest inny HTML. I teraz źle sprawdza mi instrukcja. Czyli jeżeli nie znajdzie mi w tym HTML 'Przedszkole', to do zmiennej $ilescan dodaje +1. Słowo 'Przedszkole' znajduje w 'forum.php.pl', ale w 'http://phpedia.pl/wiki/Specjalna:Ostatnie_zmiany'. Czyli zgodnie z warunkiem, podczas pierwszego wykonania skryptu, do zmiennej $ilescan nie powinno dodawać się +1, dlatego, że warunek nie zostaje spełniony, powieważ znajduje "przedszkole'. Pętla leci dalej i 3 razy warunek nie zostaje spełniony.
Teraz pojawia się problem. Za czartym razem także sprawdza mi, czy jest słowo "przedszkole' i tym razem warunek zostaje spełniony, czyli do zmiennej $ilescan dodaje się +1.
Teraz koniec pętli. Wyświetlam $ilescan, i pojawia mi się wartość '4', a powinno '1', ponieważ warunek został spełniony tylko jeden raz.

Co może być nie tak?

Dodatkowo powiem tak:
W pętli zaraz po $down_html = file_get_contents($exp[$x]);
Dodałem dla testu, żeby mi wyświetliło te HTMLy (echo $down_html)...
Po uruchomieniu skryptu okazało się, że nie wyświetlają się 3 pierwsze HTML. Pojawia się błąd "bad request', ale to zrozumiałe, bo przy wyświetlaniu nie może się na jednaj stronie wyświetlić kilka stron.
Wyświetlił mi się tylko ostatni HTML i teraz ważne. Czyli jeżeli za 3 razami pętli pojawiało się 'Bad request', to od razu wiadome, że warunek if(!preg_match('/Przedszkole/', $down_html)) zostaje spełniony, dlatego dodaje mi +1 do $ilescan, a sprawdza mi tylko ostatnie, a ze względu na to, że w tym ostatnim nie ma tego słowa 'Predszkole', to też dodaje +1.
Łącznie zmienna $ilescan ma '4'.
I teraz nasuwa się pytanie. Bad request pojawia się tylko w przypadku, gdy chcę wyświetlić HTML, czy może nawet wtedy, gdy nie wyświetlam??

Co zrobić, aby działało dobrze?
Go to the top of the page
+Quote Post
kaki2308
post 25.02.2012, 15:29:04
Post #2





Grupa: Zarejestrowani
Postów: 10
Pomógł: 2
Dołączył: 15.10.2011

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


Użyć curla:

  1. <?php
  2. function curl($url){
  3.  
  4. $ch = curl_init($url);
  5. curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; U; Linux i686; pl; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3');
  6. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  7. $page=curl_exec($ch);
  8. curl_close($ch);
  9. return $page;
  10. }
  11. $kod = 'http://www.forum.php.pl/
  12. <a href="http://www.forum.php.pl/" target="_blank">http://www.forum.php.pl/</a>
  13. <a href="http://www.forum.php.pl/" target="_blank">http://www.forum.php.pl/</a>
  14. <a href="http://www.phpedia.pl/wiki/Specjalna:Ostatnie_zmiany/';" target="_blank">http://www.phpedia.pl/wiki/Specjalna:Ostatnie_zmiany/';</a>
  15.  
  16. $exp = explode("\n", $kod);
  17.  
  18.  
  19.  
  20. $ile_exp = count($exp);
  21. $ilescan=0;
  22.  
  23. for($x = 0; $x < $ile_exp; $x++)
  24. {
  25.  
  26. $down_html = curl($exp[$x]);
  27.  
  28.  
  29.  
  30.  
  31. if(!preg_match('/Przedszkole/', $down_html))
  32. {
  33. $ilescan++;
  34.  
  35. }
  36. }
  37. echo $ilescan;
  38.  
  39. ?>
Go to the top of the page
+Quote Post
Warmix
post 25.02.2012, 15:38:07
Post #3





Grupa: Zarejestrowani
Postów: 173
Pomógł: 0
Dołączył: 13.06.2011

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


Najlepsze jest to, że używam curla, tylo napisałem tutaj file_get_contents, bo to nie duża różnica...

Mam taką funkcję:
  1. function curl_file_get_contents($URL)
  2. {
  3. $c = curl_init();
  4. curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
  5. curl_setopt($c, CURLOPT_URL, $URL);
  6. $contents = curl_exec($c);
  7. curl_close($c);
  8.  
  9. if($contents)
  10. {
  11. return $contents;
  12. }
  13. else
  14. {
  15. return FALSE;
  16. }
  17. }


I to samo...

Ten post edytował Warmix 25.02.2012, 15:40:36
Go to the top of the page
+Quote Post
kaki2308
post 25.02.2012, 15:50:13
Post #4





Grupa: Zarejestrowani
Postów: 10
Pomógł: 2
Dołączył: 15.10.2011

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


Zauważ jak daję linki w tablicy:

http://pastebin.com/0SR6eZ4a
W twoim były jeszcze tabulatory/spację a nie tylko znak nowej linii.

btw.
Na xampp kiedy używam file_get_contents wywala 404, dlatego wolę curla - bardziej niezawodny.

Ten post edytował kaki2308 25.02.2012, 15:53:54
Go to the top of the page
+Quote Post
Warmix
post 25.02.2012, 17:49:11
Post #5





Grupa: Zarejestrowani
Postów: 173
Pomógł: 0
Dołączył: 13.06.2011

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


ALe to akurat nie ma znaczenia... Oprócz tego, co jest tutaj, sprawdza mi warunek, czy linki są poprawne i żadnych błędów nie ma...
Go to the top of the page
+Quote Post
mortus
post 25.02.2012, 18:18:30
Post #6





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


forum.php.pl nie jest prawidłowym adresem url. Prawidłowy adres to http://forum.php.pl (odnośnik sam się z tego zrobił).

EDIT:
  1. ini_set('display_errors', 'on');

załatwiłoby sprawę

Poza tym sprawdzaj, czy file_get_contents(), czy też CURL pobiera to, co powinien - curl_error()

Ten post edytował mortus 25.02.2012, 18:31:38
Go to the top of the page
+Quote Post
Warmix
post 25.02.2012, 18:27:55
Post #7





Grupa: Zarejestrowani
Postów: 173
Pomógł: 0
Dołączył: 13.06.2011

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


Wiem, wiem... mam linki zaczęte od http...

A co to robi? Żadnych zmian nie ma...
Go to the top of the page
+Quote Post
mortus
post 25.02.2012, 18:33:21
Post #8





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Cytat(Warmix @ 25.02.2012, 18:27:55 ) *
Wiem, wiem... mam linki zaczęte od http...

Jeśli tak, to użyj trim() na $exp[$x].

Poza tym - jak wyżej - curl_error().

Cytat(Warmix @ 25.02.2012, 18:27:55 ) *
A co to robi? Żadnych zmian nie ma...

To umieszczasz na początku pliku i powinieneś otrzymać trzy ostrzeżenia.

Ten post edytował mortus 25.02.2012, 18:39:57
Go to the top of the page
+Quote Post
Warmix
post 25.02.2012, 18:51:33
Post #9





Grupa: Zarejestrowani
Postów: 173
Pomógł: 0
Dołączył: 13.06.2011

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


Dzięki, wystarczyło zastosować trim... tongue.gif
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: 29.06.2025 - 21:54