Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pętla while + mysql
Forum PHP.pl > Forum > PHP
Majcon
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ść
netmare
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.
Majcon
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
werek
  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
Majcon
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
pr0woKator
Dodaj na końcu zapytania LIMIT
Majcon
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ć
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.