Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Dlaczego pętla nie działa? POMOCY[rozwiązany]
Forum PHP.pl > Forum > Przedszkole
miccom
Witam serdecznie.
Dlaczego moja petla nie wykonuje zleconych zadań?
Czy ktoś może mi pomóc ?
Proszę o pomoc i podpowiedzi.
Chcę wyciągnąć dane z tabeli koordy, i zapisać je do tabeli miasta, ale nie mogą się powtarzać właśnie w tabeli miasta i zablokowane.
Więc najpierw sprawdzam czy wylosowanych rekordów nie ma w tabeli miasta, potem czy nie ma ich w tabeli zablokowane.
I jeśli nie ma takich rekordów w tabeli miasta ani w tabeli zablokowane- to zapisuję te wylosowane rekordy do tabeli miasta.
Gdzie robię błąd?


  1. <?php
  2.  
  3. include('config.php');
  4.  
  5. $mapastart=1;
  6. $mapakoniec=30;
  7.  
  8. $mapa=rand($mapastart,$mapakoniec);
  9. $pole=rand(1,100);
  10. $wyjdz = true;
  11. while($wyjdz) {
  12. $wynik=mysql_query("SELECT * FROM miasta WHERE mapa='$mapa' AND koord='$pole' ");
  13. $cnt = mysql_num_rows($wynik);
  14. if( $cnt == 0 ) {
  15. $wynik=mysql_query("SELECT * FROM zablokowane WHERE mapa='$mapa' AND koord='$pole' ");
  16. $cnt = mysql_num_rows($wynik);
  17. }
  18.  
  19. if( $cnt == 0 ) {
  20. $wynik=mysql_query("SELECT * FROM koordy WHERE nr_mapy='$mapa' AND numer='$pole' AND rodzaj != 'morze' ");
  21. $cnt = mysql_num_rows($wynik);
  22. if( $cnt == 1 ) $wyjdz = true;
  23. }
  24. if( !$wyjdz ) {
  25. $mapa=rand($mapastart,$mapakoniec);
  26. $pole=rand(1,100);
  27. }
  28. }
  29.  
  30. $rows3=mysql_fetch_array($wynik);
  31. $koordx=$rows3['koordx'];
  32. $koordy=$rows3['koordy'];
  33. $koordxduzy=$rows3['koordxduzy'];
  34. $koordyduzy=$rows3['koordyduzy'];
  35.  
  36. //$wynik1=mysql_query("INSERT INTO miasta (koord, koordx, koordy, mapa, koordxduzy, koordyduzy) VALUES ( '$pole','$koordx','$koordy','$mapa', '$koordxduzy', '$koordyduzy')");
  37. //
  38. wylosowałem koordx= $koordx, i koordy=$koordy";
  39. ?>
jasin
A skrypt wychodzi w ogóle z pętli WHILE? Jest
  1. while($wyjdz)
i $wyjdz ciągle ma wartość TRUE więc pętla ciągle się wykonuje.
miccom
No ok. Ale jak to zrobić.
Czy jak nie zainicjuję wartości $wyjdz, to pętla się wykona?
wookieb
Cytat(miccom @ 5.10.2009, 14:35:44 ) *
Czy jak nie zainicjuję wartości $wyjdz, to pętla się wykona?

Nie.

  1. if( $cnt == 1 ) $wyjdz = false;

miccom
Cytat(wookieb @ 5.10.2009, 14:40:09 ) *
Nie.

  1. if( $cnt == 1 ) $wyjdz = false;


No ale to $wyjdz które wskazałeś dopiero ma zatrzymać wykonywanie pętli. Ale ona nawet nie zacznie działać.
phpion
Może zamiast pętli while użyj do-while. Różnica między nimi jest taka, że do-while wykona się conajmniej raz, podczas gdy while może się nie wykonać ani razu.
wookieb
Podstawy logiki i czytania manuala...
While wykonuje się dopoki ma w swoim "argumencie" wartość true. Wiec jak chcesz zatrzymac wykonywanie petli skoro CAŁY CZAS zmienna $wyjdz na wartosc true?
Dlatego przeciez napisalem, żebys w tamtej linijce ustawił wartość na FALSE i po klopocie.
Cytat
Ale ona nawet nie zacznie działać.

No jak nie? Przecież masz przed petal $wyjdz = true;
Czy ja mówilem zebys to zmienial? Przetestuj a dopiero pisz posty.
zegarek84
Cytat(miccom @ 5.10.2009, 13:48:50 ) *
No ale to $wyjdz które wskazałeś dopiero ma zatrzymać wykonywanie pętli. Ale ona nawet nie zacznie działać.

od razu za:
while($wyjdz) {
daj echo ++$i."\r\n<br />";

pętla się wykonuje - nie wiem jaki masz dokładnie zamiar ale na pewno masz złą logikę wewnątrz pętli winksmiley.jpg
wyświetlaj sobie przez echo krokami zmienne tam gdzie są ok i tam gdzie się psuj ą żebyś znalazł błąd - tam gdzie niepotrzebne echo daj komentarz...
miccom
ok. Dałem tak jak mówiliście:

  1. <?php
  2.  
  3. include('config.php');
  4.  
  5. $mapastart=1;
  6. $mapakoniec=30;=rand($mapastart,$mapakoniec);//zmienić drugie jrdrn na 90
  7. $pole=rand(1,100);
  8. $wyjdz = false;
  9. while($wyjdz) {
  10. echo ++$i."\r\n<br />";
  11. $zapytanie="SELECT * FROM miasta WHERE mapa='$mapa' AND koord='$pole' ";
  12. $wynik=mysql_query($zapytanie);
  13. $cnt = mysql_num_rows($wynik);
  14. if( $cnt == 0 ) {
  15. $zapytanie="SELECT * FROM zablokowane WHERE mapa='$mapa' AND koord='$pole' ";
  16. $wynik=mysql_query($zapytanie);
  17. $cnt = mysql_num_rows($wynik);
  18. }
  19.  
  20. if( $cnt == 0 ) {
  21. $zapytanie="SELECT * FROM koordy WHERE nr_mapy='$mapa' AND numer='$pole' AND rodzaj != 'morze' ";
  22. $wynik=mysql_query($zapytanie);
  23. $cnt = mysql_num_rows($wynik);
  24. if( $cnt == 1 ) $wyjdz = true ;
  25. }
  26. if( !$wyjdz ) {
  27. $mapa=rand($mapastart,$mapakoniec);//zmienić drugie jrdrn na 90
  28. $pole=rand(1,100);
  29. }
  30.  
  31.  
  32. }
  33.  
  34.  
  35. $rows3=mysql_fetch_array($wynik);
  36. $koordx=$rows3['koordx'];
  37. $koordy=$rows3['koordy'];
  38. $koordxduzy=$rows3['koordxduzy'];
  39. $koordyduzy=$rows3['koordyduzy'];
  40. $rodzaj=$rows3['rodzaj'];
  41. $obrazek_miasta="mapy/miasto_p.gif";
  42.  
  43. echo "wyjdz=$wyjdz<br />
  44. zapytanie1=$zapytanie<br />
  45. zapytanie2=$zapytanie1<br />
  46. zapytanie3=$zapytanie2<br />
  47. wylosowałem koordx= $koordx, i koordy=$koordy";
  48. ?>

I otrzymuję coś takiego:
Array ( )
Notice: Undefined variable: wynik in /losowanie.php on line 50

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /losowanie.php on line 50

Notice: Undefined variable: zapytanie in /losowanie.php on line 63

Notice: Undefined variable: zapytanie1 in /losowanie.php on line 64

Notice: Undefined variable: zapytanie2 in /losowanie.php on line 65
wyjdz=
zapytanie1=
zapytanie2=
zapytanie3=
wylosowałem koordx= , i koordy=

Linia 47 to linia $rows3=mysql_fetch_array($wynik);, więc mniemam ze się w ogóle pętla nie wykonuje. Chcę wyświetlić wyniki dla zapytań- to nie mogę bo ich nie ma. Tak myślę.
wookieb
To sprawdź/przeczytaj jeszcze raz jak ci mówiłem. Ale lepiej byłoby gdybyś powiedział co ty robisz tymi zapytaniami. Co chcesz uzyskać, jakie są struktury tabel bo coś czuje, że jest dużo prawdopodobieństwo załątwienia wszystkiego jednym zapytaniem. Dobrze by było gdybyś dał jeszcze mała ilość przykładowych danych ( w formie zapytań INSERT)
miccom
ok. Zmieniłem.
Ale ja i tak mówię: ten $wyjdz ma zatrzymać pętlę! Stąd zmieniam jej wartość na false, aby przestała się wykonywać, A na początku mam true, aby się zaczęła pętla iterować.

Teraz po twojej zmianie mam pętlę nie kończącą się smile.gif
  1. Array ( )
  2. Notice: Undefined variable: i in /losowanie.php on line 22
  3. 1
  4. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 2
  5. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 3
  6. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 4
  7. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 5
  8. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 6
  9. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 7
  10. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 8
  11. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 9
  12. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 10
  13. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 11
  14. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 12
  15. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 13
  16. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 14
  17. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 15
  18. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 16
  19. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 17
  20. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 18
  21. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 19
  22. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 20
  23. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 21
  24. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 22
  25. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 23
  26. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 24
  27. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 25
  28. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 26
  29. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 27
  30. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 28
  31. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 29
  32. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 30
  33. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 31
  34. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 32
  35. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 33
  36. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 34
  37. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 35
  38. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 36
  39. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 37
  40. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 38
  41. SELECT * FROM miasta WHERE mapa='9' AND koord='29' SELECT * FROM jednostki WHERE mapa='9' AND koord='29' SELECT * FROM koordy WHERE nr_mapy='9' AND numer='29' AND rodzaj != 'morze' 39


I takich rekordów mam 240000 bo skrypt po 30sek jest wyłączany.
Fatal error: Maximum execution time of 30 seconds exceeded in /home/bazawesel/domains/wichry-wojny.pl/public_html/strona/losowanie.php on line 39
zegarek84
dopiero pisałeś, że pętla newet nie startuje ;p - nie czytasz ze zrozumieniem - pisałem, że logikę z tymi ifami masz pomieszaną a nie znam struktury bazy i założenia aplikacji (przy okazji masz 100% pewności że będzie tylko 1 wynik wyszukiwania w bazie??)
miccom
  1. Struktura tabeli dla `miasta`
  2. --
  3.  
  4. CREATE TABLE IF NOT EXISTS `miasta` (
  5. `miasto` varchar(100) collate utf8_unicode_ci NOT NULL,
  6. `user` varchar(100) collate utf8_unicode_ci NOT NULL,
  7. `koord` int(11) NOT NULL,
  8. `koordx` int(11) NOT NULL,
  9. `koordy` int(11) NOT NULL,
  10. `mapa` int(11) NOT NULL,
  11. `nacja` varchar(100) collate utf8_unicode_ci NOT NULL,
  12. `obrazek_miasta` varchar(100) collate utf8_unicode_ci NOT NULL,
  13. `koordxduzy` int(11) NOT NULL,
  14. `koordyduzy` int(11) NOT NULL,
  15. `swiat` int(11) NOT NULL
  16. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  17.  
  18.  
  19.  
  20. Struktura tabeli dla `zablokowane`
  21. --
  22.  
  23. CREATE TABLE IF NOT EXISTS `zablokowane` (
  24. `miasto` varchar(100) collate utf8_unicode_ci NOT NULL,
  25. `user` varchar(100) collate utf8_unicode_ci NOT NULL,
  26. `koord` int(11) NOT NULL,
  27. `koordx` int(11) NOT NULL,
  28. `koordy` int(11) NOT NULL,
  29. `mapa` int(11) NOT NULL,
  30. `nacja` varchar(100) collate utf8_unicode_ci NOT NULL,
  31. `obrazek_miasta` varchar(100) collate utf8_unicode_ci NOT NULL,
  32. `koordxduzy` int(11) NOT NULL,
  33. `koordyduzy` int(11) NOT NULL,
  34. `swiat` int(11) NOT NULL
  35. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


Cytat(zegarek84 @ 5.10.2009, 15:33:26 ) *
dopiero pisałeś, że pętla newet nie startuje ;p - nie czytasz ze zrozumieniem - pisałem, że logikę z tymi ifami masz pomieszaną a nie znam struktury bazy i założenia aplikacji (przy okazji masz 100% pewności że będzie tylko 1 wynik wyszukiwania w bazie??)



losuję dwie liczby, pole i mapa.
Wrzucam je do pętli, i jeśli takiego zestawu nie ma w tabeli (miasta) i 2 tabeli (zablokowane)- to wrzucam do tabeli (miasta) wylosowane rekordy.
Ale jeśli będą już takie rekordy w 1 lub 2 tabeli- to losuję ponownie liczby pole i mapa( za pomoca rand())- i wykonuję ponownie tą pętlę sprawdzając powyższe warunki. Aż do skutku.
Ale jakoś mi nie idzie smile.gif

Witam.
Zmodyfikowałem pętelkę- i teraz jest ok.
  1.  
  2. $mapastart=1;
  3. $mapakoniec=30;
  4.  
  5. $mapa1=rand($mapastart,$mapakoniec);//
  6. $pole1=rand(1,100);
  7. $wyjdz = true;
  8. while($wyjdz) {
  9. $zapytanie="SELECT * FROM miasta WHERE mapa='$mapa1' AND koord='$pole1' ";
  10. $wynik=mysql_query($zapytanie);
  11. $cnt = mysql_num_rows($wynik);
  12. if( $cnt == 0 ) {
  13. $zapytanie1="SELECT * FROM zablokowane WHERE mapa='$mapa1' AND koord='$pole1' ";
  14. $wynik1=mysql_query($zapytanie1);
  15. $cnt = mysql_num_rows($wynik1);
  16. }
  17.  
  18. if( $cnt == 0 ) {
  19. $zapytanie2="SELECT * FROM koordy WHERE nr_mapy='$mapa1' AND numer='$pole1' AND rodzaj != 'morze' ";
  20. $wynik2=mysql_query($zapytanie2);
  21. $cnt = mysql_num_rows($wynik2);
  22. if( $cnt == 1 ) $wyjdz = false ;
  23. }
  24. if( $wyjdz ) {
  25. $mapa=rand($mapastart,$mapakoniec);
  26. $pole=rand(1,100);
  27. }
  28.  
  29.  
  30.  
  31. }
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.