Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> dynamiczne kolumny i wiersze (jednocześnie)
problemos
post
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 18.02.2007

Ostrzeżenie: (0%)
-----


Siedzę nad tym od kilku ładnych nocek, i po prostu załamka (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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ł(IMG:http://forum.php.pl/style_emoticons/default/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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
k1ller
post
Post #2





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 20.02.2007
Skąd: Wroclaw

Ostrzeżenie: (0%)
-----


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


Ten post edytował Cienki1980 21.02.2007, 08:32:32
Go to the top of the page
+Quote Post
problemos
post
Post #3





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 18.02.2007

Ostrzeżenie: (0%)
-----


K1ller dzięki za zainteresowanie tematem (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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ść (IMG:http://forum.php.pl/style_emoticons/default/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.
Go to the top of the page
+Quote Post
k1ller
post
Post #4





Grupa: Zarejestrowani
Postów: 17
Pomógł: 0
Dołączył: 20.02.2007
Skąd: Wroclaw

Ostrzeżenie: (0%)
-----


Cytat(problemos @ 27.02.2007, 19:27:55 ) *
K1ller dzięki za zainteresowanie tematem (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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ść (IMG:http://forum.php.pl/style_emoticons/default/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)
Go to the top of the page
+Quote Post
problemos
post
Post #5





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 18.02.2007

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/sad.gif)
Go to the top of the page
+Quote Post
miggie
post
Post #6





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 12.11.2006
Skąd: Rudziniec

Ostrzeżenie: (0%)
-----


  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.
Go to the top of the page
+Quote Post
problemos
post
Post #7





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 18.02.2007

Ostrzeżenie: (0%)
-----


Miggie dzięki za wskazówki (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/sad.gif) A przecież tablica z tymi potwierdzeniami zawiera dane... Czyli mój problem, to dobranie się do tych danych i ich wyświetlenie...
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 17:17