Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]pętla wyciągająca zamienniki z bazy
Forum PHP.pl > Forum > Przedszkole
jaco1410
Hej,

mam tabele "czesci" w bazie, która ma wartości mniej więcej takie (oczywiście tabela zawiera więcej nazw ze sobą nijak nie powiązanych):

  1. nazwa_czesci nr_materialowy zamiennik
  2. zarowka12Va 1111 2222
  3. zarowka12Vb 2222 3333
  4. zarowka12Vc 3333 1111
  5. kierownica 4444 5555


i teraz po otrzymaniu nazwy wybieram konkretny nr materiałowy ale chce wyświetlić oprócz tego wszystkie nr zamienników bez powtórzeń, czyli wynik powinien wyglądać tak:

nr materiału:
1111
zamienniki:
2222
3333

  1. // Podlaczenie do bazy
  2.  
  3. //zakladajac ze postem otrzymuje konkretną wartosc - "zarowka12Va"
  4.  
  5. $sql02 = "SELECT nazwa_czesci,nr_materialowy,zamiennik FROM czesci WHERE nr_materialowy='$_POST["nazwa"]';";
  6. $result02 = mysql_query($sql02) or die(mysql_error());
  7. $row02 = mysql_fetch_array($result02);
  8.  
  9. $nr = $row02[nr_materialowy]; //pobieram nr czesci
  10.  
  11. // Pobieram zamiennik
  12. $a = $row02[zamiennik]; // zmienna ta przyjmuje 1 wartość 2222
  13.  
  14. echo ''.$nr.'<br>'; // wyświetlam główny materiał
  15.  
  16. // i teraz chcę wyświetlić wszystkie nr materiałowe zamienników bez powtórzeń
  17.  
  18. $main1 = $row02[nr_materialowy];
  19. $b = 1;
  20. while ($a !=0) {
  21. if ($main.$b = $a) {
  22. echo "już taki wyświetliłem<br>";
  23. break;
  24. }
  25. else {
  26. $sql03 = "SELECT nr_materialowy,zamiennik FROM czesci WHERE nr_materialowy='$a'";
  27. $result03 = mysql_query($sql03) or die(mysql_error());
  28. $row03 = mysql_fetch_array($result03);
  29.  
  30. echo 'zamiennik:'.$a.'<br>';
  31.  
  32. $a = $row03[zamiennik];
  33. $main.$b = $row03[zamiennik];
  34. }
  35. $b++;
  36. }

jezeli wyrzuce zmienne $main i $b i zostawie to co jest w else, zapętla mi się pętla a chcę aby się skończyła jeżeli już taki materiał wyświetliłem

powyższe wyświetla mi tylko 1 zamiennik i niestety nie mogę znaleźć gdzie robię błąd?

poproszę o sugestię
dzięki
pozdrawiam
jarek0203
Poczytaj o GROUP BY
com
  1. if ($main.$b = $a) {

coś takiego nie zrobi Ci z tego $main1
Przykład:
http://ideone.com/ZxqOJP

poza tym w warunku to chyba == a nie = a $row02[zamiennik] powinno być $row02['zamiennik'] wink.gif

i inne analogicznie wink.gif
jaco1410
Hej,
podstawiłem tak jak pisałeś w zmiennych:

  1. $a == $row03['zamiennik'];


oraz zastosowałem var_dump:
  1. var_dump($main.$b)


niestety nic to nie dało, dalej mam tak samo, wyświetla tylko 1 zamiennik, myślę że coś z pętlą jest nie tak!, tylko nie mogę dojść co smile.gif

co do GROUP BY, nie mam pojęcia którą z jego funkcji i jak mógłbym wykorzystać, może ktoś podrzuci jakiś przykład?

dzięki
pozdrawiam.
jarek0203
Podaj przykład co i jak się ma wyświetlać bo z 1 posta nic nie rozumiem ;/. Np. pokaż co masz w tabeli i co z niej chcesz wyświetlić.
jaco1410
Hej,

faktycznie nie zrozumiale napisałem jak ma wyglądać wynik, zedytowałem pierwszy post.

dzieki za uwagę
jarek0203
Możesz to zrobić tak: pewnie da się zrobić w 1 zapytaniu ale nie wiem jak:

wyświetlasz info o nr_materialowym
  1. SELECT nazwa_czesci,nr_materialowy FROM czesci WHERE nr_materialowy='$_POST["nazwa"]'


a później wyświetlasz wszystkie zamienniki różne od '$_POST["nazwa"]':
  1. SELECT zamiennik FROM czesci WHERE zamiennik<>'$_POST["nazwa"]'

jaco1410
Hej,

niestety to by tylko działało jezeli w tabeli miałbym tylko te 3 materiały, a jest ich niestety więcej i z różnymi nazwami i oczywiśnie nie są wszystkie ze sobą połączone zamiennikami:), więc tak nie da rady.

może jeszcze ktoś pochyli się nad prośbą

dzięki
jarek0203
To dalej nie rozumiem... rozumiem że podajesz $_POST["nazwa"] czyli nr_materialu

i teraz chcesz wyświetlić wszystkie zamienniki oprócz nazwy $_POST["nazwa"] i do tego zamienniki nie mogą się powtarzać?
jaco1410
tak,

wynik musi być taki:

nr materiału:
1111
zamienniki:
2222
3333

przy Twoim zapytaniu otrzymam wszystkie kilkaset pozycji oprocz $_POST["nazwa"], co mnie nie interesuje

pozdrawiam
jarek0203
SELECT zamiennik FROM czesci WHERE zamiennik<>'$_POST["nazwa"]' GROUP BY zamiennik

to jest bez powtorzeń
jaco1410
Hej,

no nie działa tak, tak jak pisalem to moze by i zadzialalo jakbym mial tylko 3 pozycje.

ujmę to tak:
pomyśl że w tabeli mam jeszcze pozycje:

  1. kierownica 4444 5555


i ma jej nie być przy wyświetlaniu, przy Twoim zapytaniu ta pozycja także będzie widnieć, więc tak to nie będzie działać.

ma ktoś jakiś pomysł?

pozdrawiam
jarek0203
Aha teraz rozumiem o co chodzi. Myślałem że są same 'żarówki'. Na twoim miejscu albo podzielił bym to na dwie tabele albo dodał kolumnę typ.
Ale jak chcesz się bawić w pętle to pokaż ten poprawiony kod.
jaco1410
nie każda żarówka pasuje do drugiej:), to jest tylko wymyślony przykład,
poprawiony kod nie działa więc nie ma co go publikować.



edit: 26.02.2014

wkońcu udało mi sie stworzyć odpowiednią działającą pętlę z wykorzystaniem tablic smile.gif, niestety nie jest zbyt wydajna przy dużej ilości danych ale może się komuś przyda
może jest ktoś kto jest w stanie ją zoptymalizować do paru "k" danych?

  1. //wyświetlam nr materiałowy
  2.  
  3. $sql02 = "SELECT nr_materialowy,zamiennik FROM czesci WHERE nr_materialowy='$_POST["nazwa"]';";
  4. $result02 = mysql_query($sql02) or die(mysql_error());
  5. $row02 = mysql_fetch_array($result02);
  6.  
  7. $a = $row02[zamiennik]; // zmienna ta przyjmuje 1 wartość 2222
  8. $main = $row02[nr_materialowy];
  9.  
  10. $tablica = Array(); //tworzymy tablice
  11. $tablica[] = $main; //zapisujemy glowna wartosc do tablicy
  12.  
  13. while ($a !=0) {
  14. if (in_array($a, $tablica)) {
  15. //echo "Jest juz taki zamiennik, wyświetlam wszystkie zamienniki!";
  16. $ile = count($tablica); //zmienna okreslajaca ilosc elementow w tablicy
  17. $r=1;
  18. while ($r <= $ile-1) {
  19. echo '
  20. <TABLE><tr><td>zamiennik2:'.$tablica[$r].'</td></tr></TABLE>
  21. ';
  22. $r++;
  23. }
  24. break;
  25. }
  26. else {
  27. //echo "Nie ma takiego zamiennika...";
  28. $tablica[] = $a; //zapisujemy zamiennik do tablicy
  29. //sprawdzam czy jest nastepny zamiennik
  30. $sql03 = "SELECT nr_materialowy,zamiennik FROM czesci WHERE nr_materialowy='$a'";
  31. $result03 = mysql_query($sql03) or die(mysql_error());
  32. $row03 = mysql_fetch_array($result03);
  33. $a = $row03[zamiennik]; //ustawiam nową wartos dla zmiennej zamienników
  34. //echo ''.$a.'<br>';
  35. }
  36. }
  37.  
com
To co ja dałem Ci to przecież był przykład ze tak masz nie robić bo nie działa tak, wyraźnie napisałem, że z tego nie uzyskasz tego co chciałeś, bo konkatenacja stringa dodaje do niego a nie dopisuje nr do nazwy zmiennej..

A co do kwestii kolejnych to masz źle zbudowana bazę danych, w jednaj tabeli trzymasz wszystkie klucze, a w drugiej do danego klucza przypisujesz zamiennik, wtedy w zapytaniu wyciągasz co jest potrzebne i o nic się nie musisz martwić bo nic Ci się wtedy nie powtarza..
jaco1410
Hej,

dlatego wymyśliłem zupełnie inną pętlę smile.gif

baza jest tak rozbudowana, że nie ma szans operować na kluczach o których piszesz, jak bym miał kilkaset pozycji to może tak ale nie przy zróżnicowaniu żędu kilku kilo w różne strony wink.gif

pozdrawiam.
com
Cytat
jak bym miał kilkaset pozycji to może tak ale nie przy zróżnicowaniu żędu kilku kilo w różne strony


Jak rozumiem mówimy o relacyjnych bazach danych, wiec sam chyba nie wiesz o czym mówisz.. Głowna idea tych baz jest właśnie tworzenie relacji a nie jak w bazach nosqlowych, poczytaj sobie trochę o tym a wtedy wszystkie twoje problemy i wątpliwości zostaną rozwiane, bo tym bardziej dla kilku kilo danych brak normalizacji to masochizm wink.gif
jaco1410
masz rację, wprowadzę to w życie, a właściwie wykorzystam już istniejące elementy, wcześnie nie pomyślałem o tym ....
i mniej wyciągne danych tym szybciej mi powinno to działać.

co do relacyjnych bazach danych to wciąż się uczę smile.gif

dzięki

pozdrawiam
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.