Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MySql] Pętle, sprawdzanie pomoc w optymalizacji
webspy
post 10.07.2011, 11:48:34
Post #1





Grupa: Zarejestrowani
Postów: 186
Pomógł: 9
Dołączył: 3.03.2008

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


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.


Go to the top of the page
+Quote Post
mat-bi
post 10.07.2011, 11:54:57
Post #2





Grupa: Zarejestrowani
Postów: 690
Pomógł: 92
Dołączył: 6.02.2011

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


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

Go to the top of the page
+Quote Post
webspy
post 10.07.2011, 12:06:54
Post #3





Grupa: Zarejestrowani
Postów: 186
Pomógł: 9
Dołączył: 3.03.2008

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


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ć?
Go to the top of the page
+Quote Post
toaspzoo
post 10.07.2011, 12:18:41
Post #4





Grupa: Zarejestrowani
Postów: 778
Pomógł: 84
Dołączył: 29.07.2010
Skąd: Gliwice / Pławniowice Mistrz niezmordowanej klawiatury.

Ostrzeżenie: (20%)
X----


explode()


--------------------

LS Easter egg <
Go to the top of the page
+Quote Post
webspy
post 10.07.2011, 12:37:07
Post #5





Grupa: Zarejestrowani
Postów: 186
Pomógł: 9
Dołączył: 3.03.2008

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


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ę?
Go to the top of the page
+Quote Post
ActivePlayer
post 10.07.2011, 12:45:25
Post #6





Grupa: Przyjaciele php.pl
Postów: 1 224
Pomógł: 40
Dołączył: 6.07.2004
Skąd: Wuppertal

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


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ć.
Go to the top of the page
+Quote Post
webspy
post 10.07.2011, 15:15:50
Post #7





Grupa: Zarejestrowani
Postów: 186
Pomógł: 9
Dołączył: 3.03.2008

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


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ą?)
Go to the top of the page
+Quote Post
CuteOne
post 10.07.2011, 15:22:22
Post #8





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


  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. }
Go to the top of the page
+Quote Post
ActivePlayer
post 10.07.2011, 15:22:51
Post #9





Grupa: Przyjaciele php.pl
Postów: 1 224
Pomógł: 40
Dołączył: 6.07.2004
Skąd: Wuppertal

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


  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;
Go to the top of the page
+Quote Post
webspy
post 10.07.2011, 15:32:57
Post #10





Grupa: Zarejestrowani
Postów: 186
Pomógł: 9
Dołączył: 3.03.2008

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


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.
Go to the top of the page
+Quote Post
CuteOne
post 10.07.2011, 15:35:42
Post #11





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


  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);


Ten post edytował CuteOne 10.07.2011, 15:36:07
Go to the top of the page
+Quote Post
webspy
post 10.07.2011, 16:14:25
Post #12





Grupa: Zarejestrowani
Postów: 186
Pomógł: 9
Dołączył: 3.03.2008

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


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
Go to the top of the page
+Quote Post
muk4
post 10.07.2011, 20:31:12
Post #13





Grupa: Zarejestrowani
Postów: 309
Pomógł: 56
Dołączył: 3.11.2006
Skąd: Gliwice

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


Robisz drugą tablicę w której trzymasz id z bazy danych i porównujesz obie array_diff()

Ten post edytował muk4 10.07.2011, 20:31:29
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: 19.07.2025 - 20:24