Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySql] Pętle, sprawdzanie pomoc w optymalizacji
Forum PHP.pl > Forum > Przedszkole
webspy
Witam,
Mam mały problem z długim działaniu skryptu.


Pobieram kod strony przez:
  1. $strona = implode ('', file ('http://strona.pl'));


(na wyciaganej stronie mam ok 300 pozycji podzielonych np po 40 na stronie)

Potem metodą preg_match_all wyciągam potrzebne dane:
  1. preg_match_all( '#<span>([0-9]{1,})</span>#sU', $strona, $ile, PREG_PATTERN_ORDER);

sprawdza mi ile jest stron

nastepnie mam petle ktora powtarza się tyle ile jest stron, i wyciąga kolejne dane z kodu strony.
  1. while ($ile <= $strony) {
  2. $strona2 = implode ('', file ('http://strona.pl/cos.php?p='.$ile.'));
  3. preg_match_all( "#<td class=\"kljlk\">(.+)</tr>#sU", $strona2, $obrazek, PREG_PATTERN_ORDER);


W tej petli jest nastepna która sprawdza po kolei przedmioty na tej stronie
  1. foreach ($obrazek[0] as $val) {
  2. $t++;
  3. }
  4.  
  5. for ($ile2=0; $ile2<=$t; $ile2++) {
  6.  
  7. //wyciaganie potrzebnych danych i zapisywanie w bazie
  8. //sprawdzanie również czy dany element jest już w bazie, jeśli jest to go już nie zapisuje
  9. // największy problem to taki że jak dodam w tym miejscu sprawdzanie (na odwrót) czy to co w bazie jest na stronie to za dlugo to chodzi i wywala błąd.
  10. $zapytanie44 = "SELECT * FROM przedmioty";
  11. $wykonaj4 = mysql_query ($zapytanie44);
  12. while($wiersz=mysql_fetch_array ($wykonaj4)) {
  13. $tytul = "".$wiersz['tytul']."";
  14. $id = "".$wiersz['id']."";
  15. if ($tytul == $nazwa) {
  16.  
  17. } else {
  18. $sql77 = "UPDATE `nazwa tabeli`.`przedmioty` SET `zmiana` = '0' WHERE `przedmioty`.`id` = '".$id."';";
  19.  
  20. $wykonaj77 = mysql_query ($sql77);
  21. } }


I tak w skrócie to wygląda, czy da się to jakoś zoptymalizować i użyć innych metod?

Proszę o jakieś podpowiedzi i funkcje których mogę użyć.
Z góry dziękuję za pomoc, pozdrawiam.


mat-bi
Wykonujesz zapytania i pobieranie stron w petli. Pomyslales? (sorry za brak polskich polskich znakow, na razie nieogarniam Androida :-))

webspy
ale muszę jakoś wyciągnąć każdą pozycję ze stron.

przykład strony:

strona.php?page=1
jakiś tekst dane do wyciagniecia 1
jakiś tekst dane do wyciagniecia 2
jakiś tekst dane do wyciagniecia 3
jakiś tekst dane do wyciagniecia 4
jakiś tekst dane do wyciagniecia 5


strona.php?page=2
jakiś tekst dane do wyciagniecia 6
jakiś tekst dane do wyciagniecia 7
jakiś tekst dane do wyciagniecia 8
jakiś tekst dane do wyciagniecia 9
jakiś tekst dane do wyciagniecia 10

I tak dalej.
Jakimi metodami mogę to zrobić?
toaspzoo
explode()
webspy
z takiego kodu da się wyciągnąć dany tekst metodą explode() ?

  1. <div class="naviLeftContent" id="categoriesList">
  2. <ul class="category_list_main">
  3. <li>
  4. <h3 class="inline"><a href="/listing.php/user?us_id=9915110&category=5" class="bold alleLink small">
  5. <span>Dom i Ogród</span></a></h3> <span class="smaller">(225)</span> </li>
  6. <li>
  7. <h3 class="inline"><a href="/listing.php/user?us_id=9915110&category=3" class="bold alleLink small">
  8. <span>Motoryzacja</span></a></h3> <span class="smaller">(92)</span> </li>
  9. <li>
  10. <h3 class="inline"><a href="/listing.php/user?us_id=9915110&category=16696" class="bold alleLink small">
  11. <span>Przemysł</span></a></h3> <span class="smaller">(31)</span> </li>
  12. <li>
  13. <h3 class="inline"><a href="/listing.php/user?us_id=9915110&category=10" class="bold alleLink small">
  14. <span>RTV i AGD</span></a></h3> <span class="smaller">(4)</span> </li>
  15. </ul>
  16. </div>


I chce wyciągnąć te dane miedzy <span class="smaller">dane</span>

Rozumiem że w ten sposób:
  1. $zmienna = explode ("<span class=\"smaller\">", $kod_strony);


Tylko że chciałbym szukać tylko tych elementów które są zawarte między <div class="naviLeftContent" id="categoriesList"> a nie szukać ich w całym kodzie strony. i metoda preg_match_all może to zrobić.

Musiałbym najpierw explode() - <div class="naviLeftContent" id="categoriesList"> a potem dopiero explode() - <span ....

Czy dobrze myślę?
ActivePlayer
moja propozycja jest taka: dowiedz się co trwa tak długo.
aby to zrobić mozesz użyć np. narzędzia xdebug.

jesli nie chces sie w to bawic to powstawiaj w kod kilka flag czasowych pomiędzy różne jego fragmenty, po tym poznasz co trwa tak długo. dopiero potem próbuj optymalizować.
webspy
przerobiłem to na explode() i jak na razie w pierwszej fazie działa szybciej niż poprzednia metoda, ale jeszcze muszę dodać parę sprawdzeń i zobaczę co się będzie działo.
Dziękuję za podpowiedzi

Mam jeszcze takie małe pytanie, nie chcę zakładać nowego tematu więc piszę w tym.

Posiadam
  1. while($wiersz=mysql_fetch_array ($wykonaj11)) {
  2. $tytul = "".$wiersz['tytul']."";
  3. $id = "".$wiersz['id']."";
  4.  
  5. if ("$tytul" == "$nazwa") {
  6. $znalazlem++;
  7. } else {
  8. //nie znalazlem i dopisuje do tablicy $zmienna = $id
  9. }
  10. }


W jaki sposób dopisywać te elementy abym mógł je potem wykorzystać poza pętlą while?
Będę miał tablicę $zmienna i w niej wszystkie nie znalezione elementy.
Kiedyś coś takiego robiłem ale nie mogę znaleźć, czy może coś takiego: $zmienna. = ... ? (z kropką?)
CuteOne
  1.  
  2. $i = 1;
  3. while($wiersz=mysql_fetch_array ($wykonaj11)) {
  4. $tytul[$i] = $wiersz['tytul'];
  5. $id[$i] = $wiersz['id'];
  6.  
  7. if ($tytul[$i] == $nazwa) {
  8. $znalazlem++;
  9. } else {
  10. //nie znalazlem i dopisuje do tablicy $zmienna = $id
  11. }
  12. $i++;
  13. }
ActivePlayer
  1. $a = 'a'
  2. $a .= 'b';
  3. echo $a; // wyswietli ab


odnosnie Twojego problemu, ja bym to zrobił dopisując znalezione elementy do tablicy:
  1. $aFound[] = $id;
webspy
Jednak troszkę się zapędziłem i myślałem, że będzie to takie proste ale niestety nie.

W bazie mam tytuły i sprawdzam je ze zmienna $nazwa
  1. //jest petla np 30 razy sie powtarza i ma zmienna $nazwa
  2.  
  3. $zapytanie11 = "SELECT * FROM przedmioty";
  4. $wykonaj11 = mysql_query ($zapytanie11);
  5. $znalazlem = 0;
  6. while($wiersz=mysql_fetch_array ($wykonaj11)) {
  7. $tytul = "".$wiersz['tytul']."";
  8. $id = "".$wiersz['id']."";
  9.  
  10. if ("$tytul" == "$nazwa") {
  11. $znalazlem++; //jeśli w bazie jest taka nazwa jak zmienna dodaje aby bylo wiadomo ze jest
  12. } else {
  13. $cos .= $id;
  14. }
  15. }
  16. if ($znalazlem < 0) //jesli nie znalazlo nic to pobiera daną $id
  17.  


Wszystko ladnie pieknie tylko że ja chce aby tylko te $id ktorych nie znalazlo w caych 30 cyklach w petli. A pokazuje mi wszystkie ktorych nie znalazlo w 1 i 2 cyklu a np znalazło w 3.
CuteOne
  1. $i = 1;
  2. while($wiersz=mysql_fetch_array ($wykonaj11)) {
  3. $tytul[$i] = $wiersz['tytul'];
  4. $id[$i] = $wiersz['id'];
  5.  
  6. if ($tytul[$i] == $nazwa) {
  7. $znalazlem++;
  8. }
  9. else {
  10. $cos[$i] = $id[$i];
  11. }
  12. $i++;
  13. }
  14.  
  15. echo '<pre>';print_r($cos);
webspy
Mam w tablicy wszystkie $id które są zgodne z $nazwa,
Teraz chciałem zamienić w bazie te $id których nie ma w tablicy, jakieś propozycje?

//tablica

[1] => 1
.
.
.
[n] => 321

w bazie mam jeszcze id 322 którego nie ma w tablicy jak sprawdzić którego id nie ma w tablicy
muk4
Robisz drugą tablicę w której trzymasz id z bazy danych i porównujesz obie array_diff()
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.