Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: dynamiczne kolumny i wiersze (jednocześnie)
Forum PHP.pl > Forum > PHP
problemos
Siedzę nad tym od kilku ładnych nocek, i po prostu załamka sad.gif

Opis problemu:
Mam w sql-u trzy tablice: uzytkownicy, pisma i potwierdzenia. W tablicy potwierdzenia znajdują się dane czy dany uzytkownik zapoznal się z konkretnym pismem, czyli m.in. iduzytkownika, idpisma i potwierdzenie=T lub N (oczywiście w zależności czy uzytkownik potwierdził zapoznanie). Problem zaczyna się kiedy na stronie chcę wyświetlić w postaci tabeli zbiorczą informację w następujący sposób:

__________1 kolumna, 2 kolumna, 3 kolumna, ......, n kolumna
1 wiersz: ___________pismo 1, pismo 2, ..........., pismo n
2 wiersz: uzytkownik 1, T lub N, T lub N, .........., T lub N
3 wiersz: uzytkownik 2, T lub N, T lub N, .........., T lub N
...
k wiersz: uzytkownik k+1, T lub N,T lub N, ........, T lub N

oto mój fragment kodu i niestety nie jest dobrze sad.gif Pierwszy wiersz, kiedy wypisuje nr pisma - ok, pierwsza kolumna, kiedy wypisuje login uzytkownika - ok. Ale wszystko się psuje przy wypisywaniu wartości T/N dla konkretnego uzytkownika i konkretnego pisma...
Może ktoś ma jakiś pomysłquestionmark.gif?

  1. <?php
  2. //najpierw oczywiście mam łączenie z serwerem i bazą...
  3.  
  4. $result = mysql_query("SELECT * FROM tbUzytkownik WHERE Zgloszony = '1' ORDER BY 4",$db);
  5. ?>
  6. <TABLE class=tablesurround cellSpacing=1 cellPadding=1 width="98%"
  7. align=center><TBODY>
  8. <TR>
  9. <TD class=catandforum colSpan=2>Potwierdzenia zapoznania się z pismami>
  10. <TABLE class=tableborders cellSpacing=1 cellPadding=3 width="100%">
  11. <TBODY><TR><TD class=tdheader noWrap align=middle>Nr</td>
  12. <?php
  13. $result1 = mysql_query("SELECT * FROM tbPisma where Aktual = 't' ORDER BY 3 ASC",$db);
  14. $ilosc1 = mysql_num_rows($result1);
  15.  
  16. while ($myrow1 = mysql_fetch_array($result1))
  17. {
  18. echo "<td class=tdheader1 noWrap align=middle>
  19. <a href=http://127.0.0.1/~Ania/http/dane/Pisma/".$myrow1["Link"].">".$myrow1['Nr']."</a></td> n";
  20. }
  21. //$result2 = mysql_query("SELECT * FROM tbPotwPisma WHERE NrUzyt='".$myrow['NrUzyt']."' ",$db);
  22. echo "</tr>";
  23.  
  24. while ($myrow = mysql_fetch_array($result))
  25. {
  26. echo "<tr><TD class=newlighttable vAlign=top align=middle>".$myrow['Login']."</td>";
  27.  
  28. for ($i=0; $i<$ilosc1; $i++)
  29. {
  30. $result2 = mysql_query("SELECT * FROM tbPotwPisma WHERE NrUzyt='".$myrow['NrUzyt']."' order by idPisma",$db);
  31.  //and idPisma='".$myrow1['idPisma']."'
  32. $myrow2 = mysql_fetch_array($result2);
  33. echo "<td class=newlighttable vAlign=top align=middle>".$myrow2['Potwierdzenie']."</td> n";
  34. }
  35. echo "</tr>";
  36.  
  37.  
  38. if($myrow = mysql_fetch_array($result))
  39. echo "<TR><TD class=newdarktable vAlign=top noWrap align=middle>".$myrow['Login']."</TD>";
  40. for ($i=0; $i<$ilosc1; $i++)
  41. {
  42. $result2 = mysql_query("SELECT * FROM tbPotwPisma WHERE NrUzyt='".$myrow['NrUzyt']."' order by idPisma",$db);
  43.  //and idPisma='".$myrow1['idPisma']."'
  44. $myrow2 = mysql_fetch_array($result2);
  45. echo "<td class=newdarktable vAlign=top align=middle>".$myrow2['Potwierdzenie']."</td> n";
  46. }  
  47. echo "</tr>";
  48. }
  49. ?>
  50. </tr></TBODY></TABLE></TD></TR></TBODY></TABLE><BR>
  51. </TABLE>


Baaardzo proszę o pomoc!!!!!!!!

-------------------
do kodu php używaj BBCode php
~Cienki1980
k1ller
Ja bym zrobił tak:
  1. <?php
  2. $result = mysql_query("SELECT * FROM tbPisma where Aktual = 't'",$db);
  3. $ilosc_pism = mysql_num_rows($result);
  4. $tab_pisma=array();
  5.  
  6. //tworzymy tablice gdzie kluczami sa ID pism a wartosciami link
  7.  
  8. while ($pismo = mysql_fetch_array($result))
  9. {
  10. $tab_pisma[ $pismo['Nr'] ]=$pismo['Link'];
  11. }
  12.  
  13. $result = mysql_query("SELECT * FROM tbUzytkownik WHERE Zgloszony = '1'",$db);
  14. $ilosc_uzytkownikow = mysql_num_rows($result);
  15. $tab_uzytkownik=array();
  16.  
  17. //tworzymy tablice gdzie kluczami sa ID uzytkownikow a wartosciami loginy
  18.  
  19. while ($uzytkownik = mysql_fetch_array($result))
  20. {
  21. $tab_uzytkownik[ $uzytkownik['NrUzyt'] ]=$uzytkownik['Login'];
  22. }
  23.  
  24. $result = mysql_query("SELECT * FROM tbPotwPisma",$db);
  25. $uprawnienie=array();
  26.  
  27. //tworzymy tablice dwuwymiarowa, gdzie wiersze to pisma a kolumny to uzytkownicy, 
  28. //jak chcesz sprawdzic potwierdzenie pisma 2 dla uzytkownika 5 to sprawdzasz warto
    sc $tab_potwierdzenia[2][5]
  29.  
  30. while ($potwierdzenie = mysql_fetch_array($result))
  31. {
  32. $tab_potwierdzenia[ $potwierdzenie['idPisma'] ] [ $potwierdzenie['NrUzyt'] ]=$potwierdzenie['Potwierdzenie'];
  33. }
  34.  
  35. //musimy brac uzytkownikow, bo tabele musimy tworzyc wierszami a nie kolumnami
  36.  
  37. //tabela i pierwsza kolumna zarezerwowana na login
  38. echo "<table><tr><td>Login</td>";
  39. //najpierw pisma
  40. foreach ($tab_pisma as $nr_pisma => $link)
  41. {
  42.  echo "<td><a href=http://127.0.0.1/~Ania/http/dane/Pisma/$link>$nr_pisma</a></td>";
  43. }
  44. echo "</tr>";
  45.  
  46. //potem uzytkownicy
  47. foreach ($tab_uzytkownik as $nr_uzytkownika => $login)
  48. {
  49. echo "<tr><td>$login</td>";
  50. foreach ($tab_pisma as $nr_pisma => $link)
  51. {
  52.  //tutaj drukujemy uprawnienia
  53.  echo "<td>".$tab_potwierdzenia[$nr_pisma][$nr_uzytkownika]."</td>";
  54. }
  55. echo "</tr>";
  56. }
  57. echo "</table>";
  58. ?>

Dzięki temu masz 3 tabele, w czym jedna $tab_potwierdzenia, która załatwia Ci sprawę potwierdzeń.
Musisz tylko dodać klasy i inne upiększenia, oczywiście w zapytaniach brakuje tez ORDER BY.

Mam nadzieje ze pomoże.


---------------------
tak jak u poprzednika.
do php korzystamy z BBCode php a nie html
no i chyba alt się zepsuł bo żadnych ogonków nie było.
~Cienki1980
problemos
K1ller dzięki za zainteresowanie tematem smile.gif
Ale niestety dalej mam problem...
Coś jest nie tak z wyświetlaniem tych nieszczęsnych potwierdzeń, czyli:

.$tab_potwierdzenia[$nr_pisma][$nr_uzytkownika].

Próbowałam na wszelkie sposoby i NIC sad.gif
W tej chwili dalej wyświetla mi dynamicznie użytkowników i dynamicznie nazwę dokumentów, ale na przecięciu użytkownika i dokumentu, niestety nic się nie pojawia sad.gif Pusto...

Od tygodnia kombinuję (nie chciałam tak od razu walić na forum, że dalej mi nie działa ta tablica dwuwymiarowa), ale już powoli tracę cierpliwość sad.gif Więc jak ktoś ma jakiś pomysł, to bardzo proszę o pomoc!!!

PS. Czy moje problemy mogą być związane z wersją PHP? Póki co jestem zmuszona pracować na PHP4.
k1ller
Cytat(problemos @ 27.02.2007, 19:27:55 ) *
K1ller dzięki za zainteresowanie tematem smile.gif
Ale niestety dalej mam problem...
Coś jest nie tak z wyświetlaniem tych nieszczęsnych potwierdzeń, czyli:

.$tab_potwierdzenia[$nr_pisma][$nr_uzytkownika].

Próbowałam na wszelkie sposoby i NIC sad.gif
W tej chwili dalej wyświetla mi dynamicznie użytkowników i dynamicznie nazwę dokumentów, ale na przecięciu użytkownika i dokumentu, niestety nic się nie pojawia sad.gif Pusto...

Od tygodnia kombinuję (nie chciałam tak od razu walić na forum, że dalej mi nie działa ta tablica dwuwymiarowa), ale już powoli tracę cierpliwość sad.gif Więc jak ktoś ma jakiś pomysł, to bardzo proszę o pomoc!!!

PS. Czy moje problemy mogą być związane z wersją PHP? Póki co jestem zmuszona pracować na PHP4.




Wersja PHP tutaj nie ma znaczenia, bo nie korzystamy z zadnych nowych udogodnien.

na poczatek sprawdz co jest w tej tablicy uzywajac:



  1. <?php
  2. var_dump($tab_potwierdzenia);
  3. ?>
to bedzie wiadomo czy wogole ta tablica sie wypelnia czy nie, po za tym jakbys mogla wyslac strukture dokladna bazy danych (moze nazyw pol sa inne)
problemos
Cytat(k1ller @ 28.02.2007, 08:30:43 ) *
na poczatek sprawdz co jest w tej tablicy uzywajac:

  1. <?php
  2. var_dump($tab_potwierdzenia);
  3. ?>
to bedzie wiadomo czy wogole ta tablica sie wypelnia czy nie


Po wykonaniu powyższej instrukcji wywala mi ładnie wartości:
  1. <?php
  2. array(5) { [30]=> array(9) { [6]=> string(1) "N" [7]=> string(1) "t" [4]=> string(1) "T" [8]=> string(1) "N" [9]=> string(1) "t" [3]=> string(1) "t" [10]=> string(1) "N" [2]=> string(1) "t" [5]=> string(1) "t" } [33]=> array(9) { [2]=> string(1) "N" [6]=> string(1) "N" [4]=> string(1) "T" [7]=> string(1) "t" [3]=> string(1) "t" [8]=> string(1) "N" [9]=> string(1) "t" [10]=> string(1) "N" [5]=> string(1) "t" } [6]=> array(9) { [9]=> string(1) "t" [4]=> string(1) "N" [10]=> string(1) "N" [5]=> string(1) "t" [6]=> string(1) "N" [7]=> string(1) "t" [2]=> string(1) "T" [8]=> string(1) "N" [3]=> string(1) "t" } [10]=> array(9) { [8]=> string(1) "N" [9]=> string(1) "t" [3]=> string(1) "t" [10]=> string(1) "N" [4]=> string(1) "N" [5]=> string(1) "t" [6]=> string(1) "N" [2]=> string(1) "T" [7]=> string(1) "t" } [3]=> array(9) { [2]=> string(1) "T" [3]=> string(1) "T" [4]=> string(1) "T" [8]=> string(1) "N" [5]=> string(1) "N" [9]=> string(1) "N" [6]=> string(1) "N" [10]=> string(1) "t" [7]=> string(1) "N" } }
  3. ?>


czyli tablica jako taka ładnie się wypełnia wartościami smile.gif
Ale niestety pętla:

  1. <?php
  2. foreach ($tab_pisma as $nr_pisma => $link)
  3. {
  4. //tutaj drukujemy uprawnienia
  5. echo "<td class=newlighttable vAlign=top align=middle>".$tab_potwierdzenia[$nr_pisma][$nr_uzytkownika]."</td>";
  6.  
  7. }
  8. ?>

nie wyświetla mi tych wartości sad.gif
miggie
  1. TRANSFORM Sum(potwierdzenia.potw) AS SumaOfpotw
  2. SELECT uzytkownicy.uzytkownik
  3. FROM uzytkownicy RIGHT JOIN (pisma RIGHT JOIN potwierdzenia ON pisma.ID_pismo = potwierdzenia.ID_pismo)
  4. ON uzytkownicy.ID = potwierdzenia.ID_uz
  5. GROUP BY uzytkownicy.uzytkownik
  6. PIVOT pisma.pismo;


To jest zapytanie SQL (krzyżowe), które realizuje Twój problem.
Nagłówki kolumn to nazwy pism, które były potwierdzone przez przynajmniej jednego użytkownika.
Podobnie z użytkownikami.

Zapytanie wygenerowałem w MS Access. Nie wiem, czy MySQL to łyknie.

  1. ...
  2. FROM uzytkownicy RIGHT JOIN (pisma RIGHT JOIN potwierdzenia ON pisma.ID_pismo = potwierdzenia.ID_pismo) ON uzytkownicy.ID = potwierdzenia.ID_uz

Powyższy fragment jest odpowiedzialny za zbudowanie relacji 'wiele do wielu' (wielu użytkowników może potwierdzać wiele pism).
TRANSFORM i PIVOT - odpowiedzialne za utworzenie zapytania krzyżowego (na jednej osi użytkownicy, na drugiej - pisma)

To co chcesz uzyskać, to typowy przykład zapytania krzyżowego realizowany przez bazy danych dużo wydajniej niż najlepszy kod w PHP.
W odpowiedzi dostajesz po prostu zwykłą tabelę z danymi.
Pierwszy wiersz (bo on nie jest zwracany powyższą instrukcją) uzyskasz poprzez zwykłego SELECT'a wybierającego pisma, w których było jakiekolwiek potwierdzenie:
  1. SELECT DISTINCT pisma.pismo
  2. FROM pisma RIGHT JOIN potwierdzenia ON pisma.ID_pismo = potwierdzenia.ID_pismo
  3. WHERE (((potwierdzenia.potw)="1"));


Przyjąłem tutaj taki schemat nazw:
użytkownicy (uzytkownik, ID) - klucz główny: ID
pisma (pismo, ID_pismo) - klucz główny: ID_pismo
potwierdzenia (potw, ID_pismo, ID_uz) - klucz obcy: para pól ID_pismo, ID_uz

Mam nadzieję, że pomogłem. Możesz więcej poczytać o zapytaniach krzyżowych.
Generalnie uważam, że jeżeli jakieś rozwiązanie jest udostępniane przez SQL, to należy z niego korzystać, bo jest najwydajniejsze.
Każda proteza napisana w PHP powoduje, że przesyłanie danych jest dużo wolniejsze i skrypty (zwłaszcza te operujące na dużej ilości rekordów) działają znacznie wolniej.

Pozdrawiam i życzę powodzenia.
problemos
Miggie dzięki za wskazówki smile.gif
Ale w tej chwili, to nie mam problemu z wyciągnięciem danych z bazy (bo tablica jako taka wypełnia mi się właściwymi danymi). Mój problem, to wyświetlenie na stronie otrzymanych wyników. No i tutaj niestety nie działają mi te pętle foreach sad.gif A dokładniej: wyświetlanie pism i użytkowników działa bez zarzutu, ale wyświetlanie tych nieszczęsnych potwierdzeń na przecięciu danego pisma i użytkownika nie idzie w żaden sposób sad.gif A przecież tablica z tymi potwierdzeniami zawiera dane... Czyli mój problem, to dobranie się do tych danych i ich wyświetlenie...
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.