Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Wyświetlanie wieku z tabeli - cURL
Forum PHP.pl > Forum > Przedszkole
benzulli
  1. while ($row = mysql_fetch_array($rows))
  2. {
  3. $name = $row['name'];
  4. $nameS = str_replace(" ", "+", $name);
  5. $nameS = str_replace("&", "%27", $nameS);
  6. $nameC = str_replace("&", "'", $name);
  7. $nameCsec = str_replace(" ", " ", $nameC);
  8. $nameF = str_replace("&", "'", $name);
  9. if(preg_match("/$nameCsec/", $link)) {
  10. [b] preg_match("@width:20%;\" >(.*?)</td>@", $link, $age);[/b]
  11. $arr_online .= '<tr><td><span style="color:green"><a target="_blank" href="http://strona.pl/index.php&name='.$nameS.'">'.$nameF.'</a></span></td><td>'.[b]$age[0][/b].'</td></tr>';
  12. } else {
  13. $arr_offline .= '<tr><td><span style="color:red">'.$nameF.'</li></span></td></tr>';
  14. }
  15. }


Witam

Mam tabelę użytkowników z imieniem i nazwiskiem, potrzebuję wydobyć wiek tych użytkowników, którzy są online. Próbowałem komendą preg_match, ale niestety wydobywa ona tylko pierwszy rekord, a resztę zostawia i rekordy wyświetlone się powtarzają (powtarza się pierwszy rekord we wszystkich komórkach).

Chciałem zrobić coś takiego, że np preg_match('@$name - tutaj wszystkie reguły i droga do wieku (.*?) a po lewo byłby wiek@', $link, $age), lecz niestety nie działa, bo w pierwszej opcji nie można z tego co wiem mieszać warunków ze zmiennymi.

Dzięki z góry za pomoc.
Michael2318
Napisałeś co chcesz osiągnąć, ale nie napisałeś co masz w tej zmiennej...
Co konkretnie zawiera zmienna $name?
I gdzie tu w ogóle masz curl'a? ohmy.gif
benzulli
  1. <?php
  2. include("connect.php");
  3. $curl = curl_init();
  4. curl_setopt($curl, CURLOPT_URL, 'http://strona.pl/listaludzi.php');
  5. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  6. $link = curl_exec($curl);
  7. $rows = mysql_query("SELECT * FROM ludzie ORDER BY name ASC");
  8. $arr_online = '';
  9. $arr_offline = '';
  10. while ($row = mysql_fetch_array($rows))
  11. {
  12. $name = $row['name'];
  13. $nameS = str_replace(" ", "+", $name);
  14. $nameS = str_replace("&", "%27", $nameS);
  15. $nameC = str_replace("&", "'", $name);
  16. $nameCsec = str_replace(" ", " ", $nameC);
  17. $nameF = str_replace("&", "'", $name);
  18. if(preg_match("/$nameCsec/", $link)) {
  19. preg_match("@width:20%;\" >(.*?)</td>@", $link, $wiek);
  20. $arr_online .= '<tr><td><span style="color:green"><a target="_blank" href="http://www.strona.pl/index.php?czlowiek='.$nameS.'">'.$nameF.'</a></span></td><td>'.$wiek[0].'</td></tr>';
  21. } else {
  22. $arr_offline .= '<tr><td><span style="color:red">'.$nameF.'</li></span></td></tr>';
  23. }
  24. }
  25.  
  26. echo $arr_online.$arr_offline;
  27. ?>


Imiona są w tabeli, po prostu w takiej postaci

<table>
<tr><td>Anna Kowalska</td><td>20</td></tr>
<tr><td>Jan Kowalski</td><td>40</td></tr>
</table>

Kiedy pobieram dane z tabeli w sposób, który pokazałem wyżej, to pobiera mi tylko pierwszy rekord wieku, i wstawia do każdego nazwiska pierwszy wiek.
Michael2318
No więc tak. Tu masz regexpa odpowiedzialnego za wyciągnięcie tego wieku:

  1. $txt = '<table>
  2. <tr><td>Anna Kowalska</td><td>20</td></tr>
  3. <tr><td>Jan Kowalski</td><td>40</td></tr>
  4. </table>';
  5.  
  6. $reg = preg_match_all("'<td>([0-9]+)</td>'si", $txt, $matches);


w TABLICY $matches[0] znajdują się zapisane wartości wiekowe.

Teraz jak je podpiąć pod to co Ty masz. Zakładam, że wartości w tabeli są poukładane w takiej samej kolejności jak wyniki, które dostajesz z bazy danych.

  1. $i = 0;
  2. while ($row = mysql_fetch_array($rows))
  3. {
  4. // jakieś tam Twoje instrukcje
  5. // ...
  6.  
  7. echo 'Wiek '.$i.' osoby: '.$matches[0][$i]; // wyświetlamy wiek
  8. $i++; // zwiększamy licznik
  9. }


Podsumowując ważne jest, abyś zdefiniował przed pętlą, że zmienna $i jest równa zero na start, a potem wewnątrz pętli while, na samym końcu zwiększał ten licznik o jeden ($i++). Przy takim układzie, Twój wiek dla danej osoby odczytujesz w ten sposób: $matches[0][$i].
benzulli
Nie zarysowałem całej sytuacji.

Na stronie, którą pobieram z cURLa jest 1000 imion i nazwisk wraz z wiekiem. Ja pobieram tylko te, które mam u siebie w bazie danych (a one występują losowo na stronie, którą pobieram) i chcę zidentyfikować wiek kazdej osoby z tej mojej bazy. Zrobiłem tak jak mówiłeś, lecz niestety wyświetla się puste pole. Jak dam po staremu, to pierwszy rekord wieku pobrany z cURL pojawia się we wszystkich komórkach na mojej stronie.

Ze strony, z której pobieram użytkowników - wszyscy oni są 'online', tak więc jest to losowa liczba, kto akurat w danej chwili będzie online. Ja pobieram tylko część użytkowników online z cURLa, tylko tych, którzy są u mnie w bazie.

Tak samo chciałbym pobrać miejscowość tylko, że zakładam jak z wiekiem dostanę dobrą odpowiedź to analogicznie z miejscowością bez problemu zrobię, tylko dałem taki przykład.
aniolekx
pierwszy preg_match sprawdza dla całej pobranej czy strony czy istnieje ta osoba, a drugi znów dla całego setu szuka wieku, ale to nie oznacza ze weźmie wiek dla tej konkretnej osoby, weźmie zawsze dla pierwszej, ww drugim preg match nie masz wyszczególnionej tej osoby (pattern znow powinien uwzględniać jak ta osoba się nazywa)

ja bym pobrane dane obrobił do tablicy i sprawdzał w tablicy po imieniu i nazwisku (to nie jest unikalne niestety)
benzulli
Nie da się dać w patternie zmiennej z bazy, która by wyszukiwała imię, które znajduje się najbliżej wieku?? Co do imion i nazwisk - mogą się powtarzać, nie ma to znaczenia, czy dwa razy będzie np. Anna Kowalska.
Michael2318
Pokaż wreszcie całą tą tabelę, razem z imieniem, wiekiem, miejscowością itd. Tak żeby szło wymyśleć do tego jakieś sensowne rozwiązanie.
benzulli
  1. <table class="normal">
  2. <tr class="Even" style="text-align:right;" ><td style="width:70%;text-align:left;" >Imię i nazwisko</td><td style="width:10%;" >Wiek</td><td style="width:20%;" >Miejscowość</td></tr>
  3. <tr class="Even" style="text-align:right;" ><td style="width:70%;text-align:left;" ><a href="#" >Anna Kowalska</a></td><td style="width:10%;" >21</td><td style="width:20%;" >Sopot</td></tr>
  4. <tr class="Even" style="text-align:right;" ><td style="width:70%;text-align:left;" ><a href="#" >Andrzej Jan</a></td><td style="width:10%;" >42</td><td style="width:20%;" >Warszawa</td></tr>
  5. <tr class="Even" style="text-align:right;" ><td style="width:70%;text-align:left;" ><a href="#" >Andrzej Rykat</a></td><td style="width:10%;" >23</td><td style="width:20%;" >Opole</td></tr>


Część tabeli, tak to wygląda.
Michael2318
  1. <?php
  2.  
  3. $txt = '<table class="normal">
  4. <tr class="Even" style="text-align:right;" ><td style="width:70%;text-align:left;" >Imię i nazwisko</td><td style="width:10%;" >Wiek</td><td style="width:20%;" >Miejscowość</td></tr>
  5. <tr class="Even" style="text-align:right;" ><td style="width:70%;text-align:left;" ><a href="#" >Anna Kowalska</a></td><td style="width:10%;" >21</td><td style="width:20%;" >Sopot</td></tr>
  6. <tr class="Even" style="text-align:right;" ><td style="width:70%;text-align:left;" ><a href="#" >Andrzej Jan</a></td><td style="width:10%;" >42</td><td style="width:20%;" >Warszawa</td></tr>
  7. <tr class="Even" style="text-align:right;" ><td style="width:70%;text-align:left;" ><a href="#" >Andrzej Rykat</a></td><td style="width:10%;" >23</td><td style="width:20%;" >Opole</td></tr>
  8. </table>';
  9.  
  10. $reg = preg_match_all("'<tr class=\"Even\" style=\"text-align:right;\" >(.*?)</tr>'si", $txt, $matches);
  11.  
  12. unset($matches[1][0]); // usuwamy nagłówek tabeli z naszego wyniku, czyli: "imię i nazwisko" bo to nam niepotrzebne
  13.  
  14. for($i=1; $i<=count($matches[1]); $i++)
  15. {
  16. $get_name = preg_match_all("'<a href=\"#\" >(.*?)</a>'si", $matches[1][$i], $matches_name);
  17. $get_age = preg_match_all("'<td style=\"width:10%;\" >([0-9]+)</td>'si", $matches[1][$i], $matches_age);
  18. $get_location = preg_match_all("'<td style=\"width:20%;\" >(.*?)</td>'si", $matches[1][$i], $matches_location);
  19.  
  20. echo $matches_name[1][0].' '.$matches_age[1][0].' '.$matches_location[1][0].'<br>';
  21. }
  22.  
  23. ?>


Zapisz to jako np. test.php i wywołaj w przeglądarce. W odpowiedzi dostaniesz:

Cytat
Anna Kowalska 21 Sopot
Andrzej Jan 42 Warszawa
Andrzej Rykat 23 Opole


Teraz pozostje Ci zapisać te zmienne z echo:

  1. echo $matches_name[1][0].' '.$matches_age[1][0].' '.$matches_location[1][0].'<br>';


do tablicy i jak wyciągasz z bazy nazwę danej osoby to suzkasz tego też w tablicy. Jak już znajdziesz to od razu masz miejscowość i wiek.
benzulli
  1. include("connect.php");
  2. $curl = curl_init();
  3. curl_setopt($curl, CURLOPT_URL, 'http://strona.pl/index.php);
  4. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  5. $link = curl_exec($curl);
  6. $reg = preg_match_all("'style=\"text-align:right;\" >(.*?)</tr>'si", $link, $matches);
  7.  
  8. for($i=1; $i<=count($matches[1]); $i++)
  9. {
  10. $get_name = preg_match_all("'\" >(.*?)</a>'si", $matches[1][$i], $matches_name);
  11. $get_age = preg_match_all("'<td style=\"width:10%;\" >([0-9]+)</td>'si", $matches[1][$i], $matches_age);
  12. $get_location = preg_match_all("'<td style=\"width:20%;\" >(.*?)</td>'si", $matches[1][$i], $matches_location);
  13.  
  14. echo $matches_name[1][0].' '.$matches_age[1][0].' '.$matches_location[1][0].'<br>';
  15. }
  16. $rows = mysql_query("SELECT * FROM people ORDER BY name ASC");
  17. $arr_online = '';
  18. $arr_offline = '';
  19. $arr_zmienna = array();
  20. while ($row = mysql_fetch_array($rows))
  21. {
  22. $arr_zmienna[] = $matches_name[1][0].' '.$matches_age[1][0].' '.$matches_location[1][0].'<br>';
  23. $name = $row['name'];
  24. $nameS = str_replace(" ", "+", $name);
  25. $nameS = str_replace("&", "%27", $nameS);
  26. $nameC = str_replace("&", "'", $name);
  27. $nameCsec = str_replace(" ", " ", $nameC);
  28. $nameF = str_replace("&", "'", $name);
  29. if(preg_match("/$nameCsec/", $arr_zmienna[0])) {
  30. $arr_online .= '<tr><td><span style="color:green"><a target="_blank" href="http://www.strona.pl/index.php&name='.$nameS.'">'.$nameF.'</a></span></td><td>'.$arr_zmienna[1].'</td><td>'.$arr_zmienna[2].'</td></tr>';
  31. } else {
  32. $arr_offline .= '<tr><td><span style="color:red">'.$nameF.'</li></span></td></tr>';
  33. }
  34. }
  35.  
  36. echo $arr_online.$arr_offline;
  37. ?>


Dałem do tablicy i przy wyszukiwaniu chcę porównać, lecz niestety w ogóle to nie działa (wiem, że coś na bank źle zrobiłem).

Ten preg_match u samej góry musiałem pozmieniać bo tam występowała dwukolorowa tabelka, co kilka rekordów tło się zmieniało (klasa td) więc to jest dobrze bo mi wyświetla całą liste i wszystko, tylko kiedy chcę porównać jest problem.
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.