Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dlaczego ta pętla (for) nie działa?
Forum PHP.pl > Forum > PHP
Ripper
Witam,

Tworzę skrypt i mam takie pytanko, otóż mam taką pętlę for:
  1. <?php
  2. $wolne_id = 1;
  3. for ($sprawdzane_id = 1; $wolne_id = 0; ++$sprawdzane_id) {
  4. $sprawdz_w_bazie = dbquery("SELECT 1 FROM ".$db_prefix."users WHERE id='".$sprawdzane_id."'");
  5. $wolne_id = dbrows($sprawdz_w_bazie);
  6. }
  7. ?>


Kod ma sprawdzać ile jest wyników w bazie danych (tabeli ...users) o danym id i zapisywać je do zmiennej $wolne_id, jeżeli nie będzie żadnego wyniku to $wolne_id = 0 i skrypt powinien się zatrzymać, a ja powinienem otrzymać i zmienną $wolne_id (która mi się nie przyda) i zmienną $sprawdzane_id kiedy $wolne_id wynosi 0 (będzie to id nowego usera rejestrującego się na stronie). Mógłbym równie dobrze zrobić, żeby liczyło userów i dodawalo usera o id wyższym niż jest, ale wtedy dublowaly by się id po usunięciu kogoś. funkcja dbquery i dbrows jest dobra gdyż używałem jej wiele razy wcześniej i działała (ma na celu to co w nazwie ;P), baza danych też jest odpowiednio przedstawiona... Co może być źle, aby znajdywało mi id, którego nie ma jeszcze w tabeli coś_users?
nithajasz
Chłopie konstrukcja pętli for się kłania.

  1. <?php
  2. for ( incjacja licznika; warunek dla licznika; operacje na liczniku){
  3. //kod
  4. }
  5. ?>


Tak swoją drogą co Ty kombinujesz? Bo nie bardzo rozumiem..
nevt
  1. <?php
  2. //zamiast
  3. $wolne_id = 0
  4. //daj
  5. $wolne_id == 0
  6. ?>
przecież to ma być porównanie a nie podstawienie...
Ripper
@nithajasz - wiem z czego składa się pętla for, ale i tak dzięki za przypomnienie...
@nevt - wiem, zauważyłem to po napisaniu posta ale coś mi po tym komp zawiesił, reset i zapomnialem poprawić (oprócz tego, że mam "==" poróbowałem też != 1 (bo oprócz 0 może być tylko 1) i nic ...

pętla ma jak już mówiłem wybierać najmniejsze nieużyte id, czyli:
- Pobierać ilośc wyników z id równym X
- Liczyć ilość wyników
- Jeżeli ilość wyników nie równa się 0, zwiększyć X o jeden i powtórzyć pętlę (już ze zwiększonym X - czyli ID).

pętla ma po prostu zdobywać najmniejszy wolny id, który nie został użyty w bazi danych, dla nowego usera, który będzie się rejestrował. Poprawiłem w/w błędy i dalej nie może nic znaleźć, mógłby mi ktoś napisać od nowa taką pętlę? Jeśli chodzi o bazy danych to pole z id mam tak:
Baza: baza_test
tabela: bt_users
pole: id

najlepiej gdybyście zamiast całych regułek podstawili do kodu od razu z funkcjami dbquery i dbrows (użycie:
$zapytanie = dbquery("_ZAPYTANIE_"); np. $zapytanie = dbquery("SELECT nazwisko FROM personaila WHERE imie='Jan');
$licz = dbrows($zmienna_z_zapytania); np. $licz = dbrows($zapytanie);
coś takiego)

Z góry dziękuję i mam nadzieję, że pomożecie biggrin.gif

PS. Dobrze by było, gdyby zmienną odpowiadającą za id w pętli przy którym zwraca wynik $wolne_id zero, było zapisane do jakieś zmiennej tak, abym mógł go potem użyć w dalszej części pliku/lub po zaincludowaniu
pyro
  1. <?php
  2. for ($sprawdzane_id = 1; $wolne_id = 0; ++$sprawdzane_id) 
  3. ?>


Spójrz na to... Po pierwsze dałeś znak przypisania a nie porównania, powinno być ==...

Pętla for działa tak, że dopóki ine natknie się na wartość false to się wykonuje (czyli jak jest wartośc true), u ciebie to wygląda tak, że od razu masz wartość false bo $wolne id == 1, a ty dajesz warunek że musi mieć wartość 0, dlatewgo ma wartość false i nic nie robi, kumasz czacze?
Mlodycompany
petla powinna wygladac tak
  1. <?php
  2. for($i = 0; $i < 100; $i++;){
  3. //instrukcje
  4. }
  5. ?>

Nie rozumiem twojej petli i jej zmiennych
Ripper
@pyro o == i = już wyjaśnione - w skrypcie mam == a nawet miałęm != więc też powinno działać (no i <= też miałem raz)
Czego nie wiedziałem, to że działa, aż nie napotka wartości false, a myślałem, że true :/ Spróbuje i odp.

@Mlodycomapny dzięki za ogólny zarys pętli for winksmiley.jpg haha.gif
tomeksobczak
do Twojego zastosowania to chyba bardziej pasuje while a nie for
nevt
a nie powinno jeszcze być:
  1. <?php
  2. // zamiast
  3. $wolne_id = dbrows($sprawdz_w_bazie);
  4. // coś w stylu
  5. $wolne_id = count(dbrows($sprawdz_w_bazie));
  6. //albo
  7. $wolne_id = dbrows($sprawdz_w_bazie)[0][0];
  8. ?>

questionmark.gif
Ripper
Nie ;P Jak już pisałem te funkcje dbrows i dbquery (jak i inne) robią po prostu wszystko za mnie tongue.gif podają gotową liczbę winksmiley.jpg Kod już mi działa i znajduje (dodałem echo i widać co i jak) - teraz podam przykład:
Zarejestrowani są 2 userzy o id 1 i 2, po echo widać:
Id: 1 - Tak
Id: 2 - Tak
Id 3 - Nie

(Nie/Tak przez if zrobiłem tongue.gif biggrin.gif) i teraz powinno być $sprawdzane_id jako 3 a zapisuje się tak jakby po następnym dopiero locie for i dodaje o jedno biggrin.gif haha.gif poradziłem sobie odejmując zaraz za pętlą te id o 1 i wszystko śmiga. Temat do zamknięcia - bardzo dziękuję za pomoc - szczególnie @pyro - Leci "Pomógł" ;D Innym, którzy pomogli także ;D
nithajasz
Cytat
pętla ma po prostu zdobywać najmniejszy wolny id, który nie został użyty w bazi danych, dla nowego usera, który będzie się rejestrował.


Moim zdaniem to jest złe rozwiązanie. Chyba, że w bazie przetrzymujesz jedynie userów i nic z nimi nie wiążesz, np jakiś komentarzy czy postów (lub przez nick co też mi się nigdy nie podobało). Ale to tylko taka moja mała uwaga.
Ripper
Po prostu robie sobie dla testów "Jak uda mi sie" własnego prostego cms'a - na razie zaczynam od rejestracji i logowania gdyż to będzie potrzebne mi potem - logowanie mam a przy rejestracji pętla ma wykrywać najmniejsze wolne ID - wolne czyli przypisane do żadnego usera. Dlaczego tak zrobiłem, a nie policzyć ile mam userów i dodać 1 do nich? Bo gdybym miał 20 userów, usunął tego z id powiedzmy 10, ktoś by się zarejestrował to były by 2 osoby z id 20 smile.gif rozumiesz? snitch.gif

Pozdro, temat można zamknąć
Shili
A nie lepiej zrobić AUTO_INCREMENT? I nic nie musisz sam liczyć.
tomeksobczak
a słyszałeś o auto_increment albo jeżeli już musisz to robić ręcznie to max() ?
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.