Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Problem z file_get_content oraz fopen
Forum PHP.pl > Forum > Przedszkole
marqo87
Mam napisać skrypt, który po podaniu nazwy miasta łączy się z serverem Poczty Polskiej (http://www.poczta-polska.pl/kody.php) i pobiera z niej odpowiednie kody pocztowe. Zrobiłem to w taki sposób, że po podaniu nazwy miasta jest ona wklejana do odpowiedniego adresu zawierającego wyniki przeszukiwania (http://www.poczta-polska.pl/kody.php?kod=&ulica=&miejscowosc=nazwa_miasta&powiat=&wojewodztwo=dowolne&action=search gdzie nazwa_miasta zostaje zamieniona na tę podaną przez użytkownika). Dodatkowo mam jeszcze problem z funkcją ereg(). W całości wygląda to tak:

  1. <html>
  2. <head>
  3. <title>kody pocztowe</title>
  4. </head>
  5. <body>
  6. <?php
  7. if ($_GET["miasto"]){
  8. $miasto = $_GET["miasto"];
  9.  
  10. $adres = 'http://www.poczta-polska.pl/kody.php?kod=&ulica=&miejscowosc=nazwa_miasta&powiat=&wojewodztwo=dowolne&action=search';
  11.  
  12. $adres2 = str_replace("nazwa_miasta", "$miasto", "$adres");
  13.  
  14. $kod = file_get_content('$adres2');
  15. echo $kod;
  16.  
  17. //wyszukiwanie kodów pocztowych na tej stronie, powinny one być zapisane w tablicy
     $tab, ale niestety to nie działa
  18.  
  19. $ciag = '^([0-9]{2})(-[0-9]{3})? ;
  20. ereg($ciag, $kod, $tab);
  21.  
  22. $rozmiar = count($tab);
  23.  
  24. for($i = 0; $i <= $rozmiar; $i++)
  25. {
  26. echo $tab[$i].'<br />;
  27. } 
  28. }
  29. ?>
  30. <form action="kody4.php" method="get">
  31. Podaj nazwę miasta: <input type="text" name="miasto" />
  32. <input type="submit" value="szukaj" />
  33. </form>
  34. </body>
  35. </html>


Wydaje mi się, że tak to powinno wyglądać, ale coś nie działa. Wywala mi:

Fatal error: Call to undefined function: file_get_content() in c:\usr\krasnal\www\marqo\kody4.php on line 14

Widze, że chodzi o file_get_content() ale nie mam pojęcia co z tym zrobić.Napisałem alternatywny skrypt gdzie file_get_content() zamieniłem na fopen. Tym razem nie ma żadnych błędów, ale nie dostaję żadnych wyników. Druga wersja wygląda tak:

  1. <html>
  2. <head>
  3. <title>kody pocztowe</title>
  4. </head>
  5. <body>
  6. <?php
  7. if ($_GET["miasto"]){
  8. $miasto = $_GET["miasto"];
  9.  
  10. $adres = 'http://www.poczta-polska.pl/kody.php?kod=&ulica=&miejscowosc=nazwa_miasta&powiat=&wojewodztwo=dowolne&action=search';
  11.  
  12. $adres2 = str_replace("nazwa_miasta", "$miasto", "$adres");
  13.  
  14. $kod = fopen("$adres2", "r");
  15.  
  16. $ciag = '^([0-9]{2})(-[0-9]{3})? ;
  17. ereg($ciag, $kod, $tab);
  18.  
  19. $rozmiar = count($tab);
  20.  
  21. for($i = 0; $i <= $rozmiar; $i++)
  22. {
  23. echo $tab[$i].'<br />;
  24. }
  25.  
  26. fclose($kod);
  27. }
  28. ?>
  29. <form action="kody.php" method="get">
  30. Podaj nazwę miasta: <input type="text" name="miasto" />
  31. <input type="submit" value="szukaj" />
  32. </form>
  33. </body>
  34. </html>


Proszę o jakieś wskazówki, może podeszłem w zły sposób do tego problemu, może da się to zrobić w inny sposób, albo poprostu wystarczy poprawić coś w jednym z moich skryptów. Pomocy!!!
mike
file_get_contents()
marqo87
Dzięki za błyskawiczną odpowiedz, teraz wiem, że coś się dzieje, ale nadal jest problem:
Warning: file_get_contents($adres2): failed to open stream: No such file or directory in c:\usr\krasnal\www\marqo\kody4.php on line 14

file_get_contents() musi w moim przypadku zawierać adres, który zamieściłem wcześniej, tylko, że ten adres ulega zmianie podczas działania skryptu dlatego przypisałem go do zmiennej $adres2 i podałem jako argument: file_get_contents('$adres2'). Taka opcja niestety nie działa:( czy można coś z tym zrobić?
Nekro
file_get_contents($adres2) bez " ' " przed i po zmiennej $adres2
mike
Cytat(marqo87 @ 24.01.2008, 15:10:26 ) *
(...) podałem jako argument: file_get_contents('$adres2'). Taka opcja niestety nie działa:( czy można coś z tym zrobić?

Łańcuchy znaków (string)
1. Zwróć uwagę na różnicę pomiędzy ' a "
2. Pisanie czegoś takiego file_get_contents('$adres2') to błąd. Umieszczanie zmiennych w cudzysłowiach jest zbędne a często błędne.
Wstaw sobie w linii 13 taki kod:
  1. <?php
  2.  
  3. echo '$adres2'; // bardzo źle
  4. echo "$adres2"; // źle bo zbędnie
  5. echo $adres2; // poprawnie
  6.  
  7. ?>
a zobaczysz w czym problem
marqo87
Faktycznie już to poprawiłem i działa, ale do pewnego momentu:

  1. <?php
  2. $ciag = '^([0-9]{2})(-[0-9]{3})? ;
  3. ereg($ciag, $kod, $tab);
  4.  
  5. $rozmiar = count($tab);
  6.  
  7. for($i = 0; $i <= $rozmiar; $i++)
  8. {
  9. echo $tab[$i].'<br />;
  10. }
  11. ?>

Z tego co znalazłem na necie o funkcji ereg() wynika, że powinna ona wyszukać ciąg odpowiadający formie kodu pocztowego ('^([0-9]{2})(-[0-9]{3})? przypisanego zmiennej $ciag) w $kod (który zawiera wyniki poszukiwania kodów pocztowych dla danego miasta) i zapisać je w tablicy $tab. Potem przy użyciu count() sprawdzam ile elementów zawiera ta tablica, dzięki czemu moge wyświetlić jej zawartość kożystając z pętli for. Problem w tym, że &tab jest pusta.
mike
  1. <?php
  2. $ciag = '([0-9]{2})-([0-9]{3})';
  3. ereg($ciag, $kod, $tab);
  4.  
  5. foreach($tab as $item) {
  6. echo $item . "<br />\n";
  7. }
  8.  
  9. ?>
questionmark.gif
marqo87
Teraz skrypt już daje jakieś wyniki, ale to jeszcze nie to. Po wpisaniu nazwy miasta, np. Radlin dostaje coś takiego:
44-310
44
310
Wydaje mi się, że dzieje się tak z powodu warunku, który podałeś '([0-9]{2})-([0-9]{3})', dlatego ja miałem go bardziej rozbudowany: ^([0-9]{2})(-[0-9]{3})?$ gdzie znak karetki miał oznaczać, że dwie cyfry mają znaleść się na początku, trzy na końcu, a pomiędzy nimi ma być myślnik. Takie wyrażenie powoduje jednak błąd:
Warning: Invalid argument supplied for foreach() in c:\usr\krasnal\www\marqo\kody4.php on line 22 czyli w:
  1. <?php
  2. foreach($tab as $item) {
  3. ?>

Jest jeszcze jeden mankament: dla dowolnego miasta np. Radlina powinny być wyświetlone dwa kody 44-310 i 44-313, a on podaje tylko pierwszy znaleziony.

Metodą prób i błędów doszedłem do tego jak wyszukać cały kod, wystarczyło pozbyć się nawiasów z warunku. Teraz w wyniku działania skryptu dostaję cały kod pocztowy, co niezmienia faktu, że dostaję tylko pierwszy znaleziony kod. Czy jest jakiś sposób żeby ereg() przeszukał cały ciąg, a nie tylko do pierwszego pasującego fragmentu?

Teraz wygłąda to tak:

  1. <?php
  2. $ciag = '[0-9]{2}-[0-9]{3}';
  3. ereg($ciag, $kod, $tab);
  4.  
  5. foreach($tab as $item) {
  6. echo $item . &#092;"
  7. &#092;n\";
  8. }
  9. ?>


A teraz przyszedł czas na zupełnie inny wątek moich rozważań na temat mego skryptu. Pogłówkowałem troche (pare dobrych godzin smile.gif ) i rozwiązałem problem z funkcją ereg(). Teraz mój skrypt wygląda tak:
  1. <?php
  2. if ($_GET[&#092;"miasto\"]){
  3. $miasto = $_GET[&#092;"miasto\"];
  4.  
  5. $adres = 'http://www.poczta-polska.pl/kody.php?action=search&miejscowosc=nazwa_miasta&lim=50';
  6.  
  7. $adres2 = str_replace(&#092;"nazwa_miasta\", \"$miasto\", \"$adres\");
  8.  
  9. $kod = file_get_contents($adres2);
  10.  
  11. $kod2 = explode(' ', $kod);
  12.  
  13. $rozmiar = count($kod2);
  14.  
  15. $ciag = '[0-9]{2}-[0-9]{3}';
  16.  
  17. echo 'Kody pocztowe dla miasta '.$miasto.':'.'
  18.  
  19. ';
  20.  
  21. for($i = 0; $i <= $rozmiar; $i++){
  22. if (ereg($ciag, $kod2[$i])){
  23. echo &#092;"&nbsp;&nbsp;\".$kod2[$i].'
  24. ';
  25. }
  26. }
  27.  
  28. echo '
  29. ;
  30. }
  31. ?>
  32.  
  33. Podaj nazwę miasta:

Do pełni szczęścia pozostaje mi do rozwiązania tylko jeden problem jakim jest dublowanie wyników (czasami w wynikach pojawia się kilka razy ten sam kod, ale to już wina PP, a nie skryptu). Może ktoś ma jakiś pomysł jak to zrobić, a może istnieje jakaś funkcja, która sprawdza daną tablicę i usówa z niej powtarzające się wartości?
Na koniec wypada podziękować tym którzy mnie wsparli w tej ciężkiej przeprawie smile.gif
mike
Cytat(marqo87 @ 25.01.2008, 00:35:45 ) *
(...) a może istnieje jakaś funkcja, która sprawdza daną tablicę i usówa z niej powtarzające się wartości?
To łatwo sprawdzić w manualu tongue.gif
array_unique()
marqo87
Jeszcze raz wielkie dzięki!!! Teraz po małym tuningu dostaję to co chiałem. PS. w czasie studiowania na temat funkcji array_unique() znalazłem jeszcze jedno ciekawe rozwiązanie problemu duplikatów w tablicy:
  1. <?php
  2. $array = array_keys(array_flip($array));
  3. ?>
Działa to w identyczny sposób, z tą różnicą, że tutaj nie trzeba tworzyć nowej tablicy.
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.