Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Pętla while + mysql
Majcon
post 22.02.2013, 20:35:18
Post #1





Grupa: Zarejestrowani
Postów: 113
Pomógł: 1
Dołączył: 27.11.2012
Skąd: Sieradz

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


witam mam taki kod
  1.  
  2. $staff = 50;
  3. $tekst = 'test';
  4. do{
  5. $pobranie_numerow_z_users = $db->query("SELECT `number` FROM `users` WHERE `zgoda` = '0' AND `globalban` = '0'");
  6. $la = $pobranie_numerow_z_users->num_rows;
  7. while($pnu = $pobranie_numerow_z_users->fetch_assoc())
  8. {
  9. $pobranie_numerow_z_whois = $db->query("SELECT * FROM `whois` WHERE `ranga` >= {$staff} AND `number` = '".$pnu['number']."'");
  10. $nr = array();
  11. while($pnw = $pobranie_numerow_z_whois->fetch_assoc())
  12. {
  13. $nr[] = $pnw['number'];
  14. }}
  15. $tekst->allsay($co, $tekst, $nr);
  16. $q = $db->query("UPDATE `users` SET `wyslano` = '1' WHERE `globalban` = '0' AND `wyslano` = '0' AND `zgoda` = '0'");
  17. sleep(1);
  18. } while($la > 0 && $la <= 1000);

tylko problem jest taki że pętla się nie zatrzymuje i wysyła cały czas wiadomość
Go to the top of the page
+Quote Post
netmare
post 22.02.2013, 22:23:09
Post #2





Grupa: Zarejestrowani
Postów: 285
Pomógł: 37
Dołączył: 18.12.2007
Skąd: Łódź

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


Może spróbuj zastanowić się co chciałeś napisać w tym kodzie. Może go sformatuj żeby innym się łatwiej czytało. I może spróbuj poczytać o złączeniach, żeby zrobić sobie jedno zapytanie.
Go to the top of the page
+Quote Post
Majcon
post 22.02.2013, 23:34:29
Post #3





Grupa: Zarejestrowani
Postów: 113
Pomógł: 1
Dołączył: 27.11.2012
Skąd: Sieradz

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


chodzi o to żeby pobrać paczkę 1000 numerów z tabeli users następnie sprawdzić który numer posiada rangę wtym przypadku 50 i pobrać te numery następnie wywołać funkcję allsay i wszystko byłoby ok tylko że właśnie max 1000 numerów więc pętla while
Go to the top of the page
+Quote Post
werek
post 23.02.2013, 11:24:39
Post #4





Grupa: Zarejestrowani
Postów: 25
Pomógł: 1
Dołączył: 24.04.2007
Skąd: wwa

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


  1. $pobranie_numerow_z_users = $db->query("SELECT `number` FROM `users` WHERE `zgoda` = '0' AND `globalban` = '0'");
  2.  
  3. $la = $pobranie_numerow_z_users->num_rows;


w tym kodzie pobierasz numery i sprawdzasz ile ich jest, ustawiajac warunek $la, a warunkiem wyjscia z całej pętli jest sytuacja kiedy ich liczba bedzie mniejsza od zera bądź większa od tysiąca

  1. while($la > 0 && $la <= 1000);


natomiast nie robisz nic co sprawiłoby że pierwszy select miałby zwrócić mniej bądź wiecej numerów tj. updateujesz pola:

  1. $q = $db->query("UPDATE `users` SET `wyslano` = '1' WHERE `globalban` = '0' AND `wyslano` = '0' AND `zgoda` = '0'");


ale nie zmieniasz nic co mogłoby wpłynąć na wynik warunku wyjścia z pętli, myslę że źle wziąłeś się za pętle która miała się przeiterować przez wszystkie numery. poniżej moja wersja twojego kodu przy założeniach które podałeś (nie znam struktury twoich danych ale mysle ze będzie ok)

  1. $staff = 50;
  2. $tekst = 'test';
  3.  
  4. $pobranie_numerow_z_users = $db->query("SELECT * FROM `users` WHERE `zgoda` = '0' AND `globalban` = '0'");
  5. $la = $pobranie_numerow_z_users->num_rows;
  6.  
  7. //sprawdzenie zakresu
  8. if ($la > 0 && $la <= 1000) {
  9. //iteracja przez wszystkie wyniki
  10. while($pnu = $pobranie_numerow_z_users->fetch_assoc())
  11. {
  12. $pobranie_numerow_z_whois = $db->query("SELECT * FROM `whois` WHERE `ranga` >= {$staff} AND `number` = '".$pnu['number']."'");
  13. $nr = array();
  14. while($pnw = $pobranie_numerow_z_whois->fetch_assoc())
  15. {
  16. $nr[] = $pnw['number'];
  17. }
  18. $tekst->allsay($co, $tekst, $nr);
  19. $q = $db->query("UPDATE `users` SET `wyslano` = '1' WHERE `globalban` = '0' AND `wyslano` = '0' AND `zgoda` = '0'");
  20. }
  21. //to jest w sumie niepotrzebne, po co sleep na 1 sekunde?
  22. //zakładając że wysyłasz maile to i tak wysyłasz do potencjalnie różnych nadawców
  23. //chyba że twój serwer jest uznany za spamerski, ale w takim wypadku
  24. //i tak wiadomość nie dotrze
  25. sleep(1);
  26. }


ps. tak jak kolega już wspomniał, popracuj nad formatowaniem bo za rok, dwa będziesz rwał włosy z głowy próbujac doszukać się zależności w kodzie

Ten post edytował werek 23.02.2013, 11:27:25
Go to the top of the page
+Quote Post
Majcon
post 23.02.2013, 15:20:29
Post #5





Grupa: Zarejestrowani
Postów: 113
Pomógł: 1
Dołączył: 27.11.2012
Skąd: Sieradz

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


Pierwsza sprawa to nie do maila
Druga żeby wysłać wiadomość do wszystkich czyli do 2050 osób muszę wysłać po 1000 bo inaczej nie pójdzie
więc pobieram numery z users zliczam i wykonuje dalszy kod i jeżeli jest więcej od 0 i mniej niż 1000 wykonuje to wszystko jeszcze raz i dopiero gdy jest 0 przepuszcza i idzie dalej ale chyba już znalazłem błąd
Go to the top of the page
+Quote Post
pr0woKator
post 24.02.2013, 12:54:33
Post #6





Grupa: Zarejestrowani
Postów: 63
Pomógł: 1
Dołączył: 9.02.2012

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


Dodaj na końcu zapytania LIMIT
Go to the top of the page
+Quote Post
Majcon
post 24.02.2013, 18:55:04
Post #7





Grupa: Zarejestrowani
Postów: 113
Pomógł: 1
Dołączył: 27.11.2012
Skąd: Sieradz

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


Właśnie o to chodziło
  1.  
  2. $te = "test";
  3. $staff = 50;
  4. do{
  5. $pobranie_numerow_z_users = $db->query("SELECT `number` FROM `users` WHERE `globalban` = '0' AND `wyslano` = '0' AND `zgoda` = '0' ORDER BY `id` ASC LIMIT 1");
  6. $la = $pobranie_numerow_z_users->num_rows;
  7. while($pnu = $pobranie_numerow_z_users->fetch_assoc()) {
  8. $pobranie_numerow_z_whois = $db->query("SELECT `number` FROM `whois` WHERE `ranga` >= '{$staff}' AND `number` = '".$pnu['number']."'");
  9. $nr = array();
  10. while($pnw = $pobranie_numerow_z_whois->fetch_assoc()){
  11. $nr[] = $pnw['number'];
  12. }}
  13. $tekst->allsay$te , $nr);
  14. $q = $db->query("UPDATE `users` SET `wyslano` = '1' WHERE `globalban` = '0' AND `wyslano` = '0' AND `zgoda` = '0' ORDER BY `id` ASC LIMIT 1");
  15. } while($la > 0 && $la <= 1);


tylko teraz strasznie obciąża to serwer bo musi każdy numer sprawdzić może można jakoś to przerobić
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: 13.08.2025 - 23:03