Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][SQL] Pętla wykonująca się tyle razy, ile jest rekordów w tabeli
Forum PHP.pl > Forum > Przedszkole
hipekhop
Przepraszam, nie przywitałem się nawet jak należy! Do tej pory wyłącznie czytałem, unikając pytań, kiedy to tylko było możliwe- i udawało się od 2008 roku, aż do dzisiaj! Tedy jeśli odpowiedź gdzieś jest, a nie znalazłem jej- serdecznie przepraszam, ale statystykę i tak mam dobrą!
W związku z powyższym- Hilary, kłaniam się smile.gif

Mam problem, otóż nie wiem, jak skonstruować zapytanie, w którym będzie pętla wykonująca się tyle razy, ile jest rekordów w danej encji.
Rozpisując to prościej, acz brutalnie opisowo.

a = SELECT COUNT(*) FROM `tabela`;
b = 1;

while a > b loop


/*cuś tutaj mojego,z tym dam sobie radę, jak sądzę wink.gif */

b++;

end loop

Nie ująłem powyszego w tagi kodu, bowiem byłaby to zbrodnia przeciw twórcom tego cudu (w moim odczuciu wink.gif ).

Mam nadzieję, że przykład mimo wszystko jest czytelny, z góry dziękuję za pomoc.
tolomei
  1. $result = mysql_query('SELECT COUNT(*) as ilosc FROM `tabela`');
  2. $a = mysql_fetch_assoc($result);
  3. for($b = 0; $b < $a['ilosc']; $b++) {
  4. //twój kod
  5. }


Zachęcam do używania PDO przy wyciąganiu danych z bazy.
hipekhop
Dziękuję pięknie za odpowiedź, ale... rzecz w tym, że chcę to wszystko zrobić czystem SQL, z użyciem w tym wszystkim php dałbym sobie radę, bo już tak kiedyś zrobiłem.
Dziś jednak dojrzałem do tej decyzji- musi to być w czystem sql niestety:/
Rid
Ja bym proponował użycie pętli foreach jest bardziej bezpieczniejsza.
tolomei
@Rid uzasadnij swoją wypowiedź proszę - jestem bardzo ciekawy. smile.gif
Po której tablicy byś się poruszał ?

@hipekhop jak chcesz wykonać "jakiś tam własny kod" ilość razy odpowiadającą ilości rekordów w bazie nie używając PHP ?
hipekhop
http://www.drzewo-wiedzy.pl/?page=artykul&...%99tle_w_PL/SQL

To by wskazywało na to, iż się da smile.gif
tolomei
Zrozumiałem, że kod wewnątrz pętli ma być kodem PHP.
Jeśli wewnątrz pętli chcesz wykonywać kolejne zapytania w języku SQL to oczywiście - da się.

Jeśli chodzi o Twój kod to z całą pewnością b powinno być inicjowane wartością zero.
Więcej nie jestem w stanie powiedzieć bo nie mam doświadczenia z tego rodzaju tworami smile.gif

Pozdrawiam
hipekhop
Szkoda... nic to, dziękuję pięknie i czekam dalej- może trafi się ktoś, kto jednym słowem mnie naprowadzi biggrin.gif
tolomei
Może to powinno pomóc ?
http://bit.ly/q63pZI
Rid
Cytat
Rid uzasadnij swoją wypowiedź proszę - jestem bardzo ciekawy. smile.gif
Po której tablicy byś się poruszał ?

Powiem ,krótko w pętli for można popełnić wiele błędów w ineksowniu(np.wykrocznie poza zakres tablicy).
Tutaj ma Pan przykłady jakie błędy może Pan popełnić w pętli for.Kurcze długo szukałem tych przykładów.
W pętli foreach,nie ma możliwości zrobienia takich błędów.

Odnośnie problemu,albo utworzy Pan procedurę składową ,albo pozostaje pętla której pan nie chce(tylko nie wiem czemu),
w samym zapytaniu Pan tego nie zrobi.
hipekhop
Ciężko mi to ogarnąć, ale postaram się, bo chyba faktycznie pomoże. Dzięki biggrin.gif
tolomei
@Rid nie wiem czy zauważyłeś, ale post który podałeś w linku jest o VBA, a nie o PHP.

To prawda, że łatwo można popełnić błąd i wykroczyć poza rozmiar tablicy, tak jak w poniższym przykładzie:
  1. $tab = array('a','b','c','d');
  2. for($i = 0; $i < 5; $i++) {
  3. echo $tab[$i].'<br />';
  4. }


Jednakże nie jest to dowód na to pętla for jest niebezpieczna.
Za pomocą każdej pętli możemy wykroczyć poza rozmiar tablicy, gdy kod jest źle skonstruowany. W takim przypadku mówmy o jakości programisty, a nie o jakości pętli.

Dla przypadku z mojego pierwszego posta - nie widzę sensownego zastosowania pętli foreach.

Pozdrawiam
hipekhop
Ok, to mam pytanie...

  1. CREATE PROCEDURE ITERATOR()
  2. LANGUAGE SQL
  3. BEGIN
  4. DECLARE v_deptno CHAR(3); DECLARE v_deptname VARCHAR(29);
  5. DECLARE at_end INTEGER DEFAULT 0;
  6. DECLARE not_found CONDITION FOR SQLSTATE '02000';
  7.  
  8. DECLARE c1 CURSOR FOR SELECT deptno, deptname
  9. FROM department ORDER BY deptno;
  10. DECLARE CONTINUE HANDLER FOR not_found SET at_end = 1;
  11. OPEN c1;
  12.  
  13. ins_loop: LOOP
  14.  
  15. FETCH c1 INTO v_deptno, v_deptname;
  16.  
  17. IF at_end = 1 THEN
  18. LEAVE ins_loop;
  19. ELSEIF v_dept = 'D11' THEN
  20. ITERATE ins_loop;
  21. END IF;
  22.  
  23. INSERT INTO department (deptno, deptname)
  24. VALUES ('NEW', v_deptname);
  25.  
  26. END LOOP;
  27.  
  28. CLOSE c1;
  29. END

Tę procedurę podano tutaj: http://publib.boulder.ibm.com/infocenter/d...oc/c0024352.htm
A mimo to otrzymuję błąd: #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 4

Nie rozumiem o co chodzi, jeśli chodzi o mojego locala, to na wamp postawiłem i mam takie o:
Wersja klienta MySQL: mysqlnd 5.0.7-dev - 091210 - $Revision: 304625 $

I co tutaj się dzieje nie rozumiem i jestem po prostu głupi... czy ktoś umiałby mi pomóc? :/
tolomei
Pod okienkiem, gdzie wpisujesz SQL jest coś takiego:

Separator: [ ; ]

Zmień to na znak ^ .


PS. Nie jesteś głupi smile.gif
hipekhop
Już dawno nie miałem takiej ucieszonej miny!
No, może kiedy zdesperowany zacząłem szukać ciekawych filmów na youtube i znalazłem to: http://www.youtube.com/watch?v=tqv-ZzXpeAs

Dzięki ogromne, wszystko działa, gra i bucy! biggrin.gif

A co do PS, to cóż... jak nie głupi, to ślepy wink.gif
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.