[CSS][PHP][JS] Dopasowanie szerokości komórek tabeli (chat)

Mam następujący problem z ustaleniem szerokości komórek tabeli:

Tabela posiada 3 kolumny. Pierwsza to kolumna z nazwami użytkowników, druga pokazuje przesłane przez nich wiadomości, a trzecia wyświetla datę wysłania wiadomości (taki chat). Co zrobić, aby pierwsza i ostatnia kolumna przybierały taką szerokość (minimalną) aby zawartość poszczególnych komórek mieściła się w jednej linijce, a środkowa kolumna wypełniała resztę dostępnej szerokości?

Jak coś nie jasno wytłumaczyłem to proszę napisać, postaram sie o jakiś przykład.

Z góry dziękuję za pomoc.

Przede wszystkim musisz ustalić właściwe formatowanie CSS dla kolumny pierwszej i trzeciej poprzez

white-space: nowrap;

żeby wiersze z tekstem się nie zawijały, tylko tworzyły jedną linijkę.

Co do formatowania szerokości kolumn, to nie sprawdzałem, ale spróbuj tak: tej pierwszej i trzeciej kolumnie ustaw szerokość na minimalną wartość (a treść i tak ją rozszerzy), a pozostałej kolumnie (środkowej) nie nadawaj szerokości - za to ustaw szerokość dla całek tabeli (TABLE).

A no tak, o to wlasnie chodziło, dzięki. Na Chrome wyświetla elegancko, myślę, że z resztą przeglądarek to juz dam rade w razie czego.

Jeszcze takie pytanko przy okazji, tym razem związane z php. Chciałbym w tym chacie wyświetlać 10 najnowszych wiadomości, ale tak, aby te najnowsze były na dole. Aktualnie kod opiera się mniej-wiecej na takim działaniu:

$polecenie = “SELECT * FROM chat ORDER BY data LIMIT 0,10”;

$ilość = mysql_num_rows($polecenie);

$zapytanie = mysql_query($polecenie);

for ($i=1;$i<=$ilość;$i++) {

//wyswietlanie wierszy tabeli

}

Można by to zrobić wyciągając ilość wszystkich rekordów z tabeli i za pomocą pętli zmienić kolejność, ale coś czuję że jest to mało profesjonalne rozwiązanie - wolałbym ograniczyć limitem (wydaje mi sie że wplywa to na ilosc pobranych danych, a przy chatcie ma to akurat duże znaczenie)

Zamiast sprawdzać ilość użyj foreach. Dodaj count do zapytania, pierwszy argument limitu daj przez get (nie zapomnij o realescapestring). Listowanie for($a=0,i

Mógłbyś podać jakiś przykład z zastosowaniem tego co napisałeś? Średnio ogarniam tablice, dlatego ciężko mi zrozumieć petle foreach. Do tej pory omijałem wszelkie pętle używając jedynie for i metodą przedstawioną powyżej wyciągałem rekordy z bazy. Potrzebuje przykładu, który przedstawi metode działania foreach na danych pobranych z mysql (tablica chat ma 5 kolumn). Dodam, że nie potrzebuje wyswietlania wybranych “stron”, chce tylko 10 najnowszych.

@sorki, że pisze w tym temacie, ale szkoda mi było zakładać nowy. Nie sądziłem, że będzie to dla mnie aż tak skomplikowane :stuck_out_tongue:

Sam sens działania chatu to listowanie między tymi zakładkami co 10 :stuck_out_tongue:

Jeśli chcesz odwrócić datę, daj po data DESC (nie zrozumiałem wcześniej twojego postu)

for each -> przez każdy. W tym wypadku przyda ci się bardziej while:

$polecenie = "SELECT * FROM chat ORDER BY data DESC LIMIT 10";//nie trzeba 0 jak nie zmieniasz zakresów, a desc odwróci kolejność wyników$odpowiedz = mysql_query($polecenie);$wpis = mysql_fetch_assoc($odpowiedz))//wpis to jedna linia (wszystkie dane z jednego wpisu){  echo $wpis['xxx']; //wyświetlasz to co w wpisie ma name xxx} [/code]

Ponadto * używać nie powinieneś (wypisz po przecinku nazwy pól jakie chcesz pobrać, jest to szybsze niż gwiazdka)

Wylistować potrafię (podałem w jaki sposób to zrobiłem). Chodzi o to, żeby wyświetlało 10 najnowszych wiadomości, ale w ten sposób, aby najnowsza wiadomość była najniżej (zaraz nad polem w którym wpisuje się wiadomość). A stosując powyższe petle wyciąga mi 10 najnowszych wiadomości, ale układa od najnowszej do starszej (tak, ze starsza jest najniżej), a ja chcę dokładnie odwrotnie. Foreach chyba właśnie do tego się nada, ale nie wiem jak tego użyć.

Może podeślę screena jeśli coś niejasne?

Zmień DESC na ASC a jak żadna forma nie działa do daj tego ss’a.

Tu chodzi o to, że przy zapytaniu z DESC na samym początku jest najnowsza data, jak na tym przykładzie:

dziś

wczoraj

przedwczoraj

starsze


najstarsze

i autor chce te pierwsze 10 wpisów wyświetlić, ale w kolejności odwrotnej, tj.:

starsze

przedwczoraj

wczoraj

dziś

a to się da zrobić poprzez:

  • przepisanie danych z zapytania do tablicy i wypisanie od końca;

  • właściwe tworzenie tekstu, który wypiszemy dopiero na końcu (dodawanie kolejnego wpisu/linijki przed istniejącym kodem/tekstem do wypisania).

ASC pokazywałoby 10 najstarszych wiadomości w kolejności od najstarszej do nowsze (tak, że ta nowsza byłaby na dole). Reszta (czyli jeszcze nowsze wiadomości) nie byłyby w ogóle wyświetlane.

Mi chodzi natomiast o to, aby wyświetlało 10 najnowszych wiadomości w kolejności od tej starszej do nowszej (screen).

https://skydrive.live.com/redir?resid=EE33FCB98642F945!257&authkey=!ANj5_k-55qZY2no

Jako że pewnie se tego sam nie napiszesz (albo przepiszesz tablicę w php), rozwiązanie Pablo_Wawa w zapytaniu mysql:

SELECT * FROM (SELECT * FROM chat ORDER By data LIMIT 10) AS d ORDER BY data ASC

Nadal nalegam by zmienić gwiazdki na pola :stuck_out_tongue:

:o Tak się da, takie coś w ogóle istnieje? Tak czy siak będę musiał w końcu ogarnąć tablice i foreach, bo ciągnie się to za mną w nieskończoność.

Wszytko śmiga, dzięki.

@p.s. zamienilem gwiazki na nazwy odpowiednich kolumn :stuck_out_tongue:

@@ za co odpowiada “AS d”?

Jak byś wpisał bez niego mysql ładnie by ci powiedział “każda uzyskana tabela musi mieć własny alias”. W sumie po co nie wiem :))

Kontynuując moje wcześniejsze pytanie, dlaczego czat ma wyświetlać tylko 10 ostatnich wiadomości ? Tracisz tym samym np 11 itd, a przy dyskusji wszystko się zgubi (patrz choćby sb na dp)

To zapewne wstęp (nie najtrafniejszy) do stronicowania (przewijania) wpisów… :slight_smile:

Numeracje potrafię sam wprowadzić, wiec po co komplikować przykład. Ale w samym skrypcie chatu nie planuje wprowadzenia podziału na strony - będzie to taki chat “na żywo” dla wszystkich graczy w grze przeglądarkowej.

Właśnie taki czat na żywo powinien mieć stronicowanie (np 10 stron :P), tym bardziej że jest dla wszystkich graczy :))

Napotkałem się na kolejny problem związany z chatem (strasznie kłopotliwy on jest)… Mianowicie mam diva o id “chat” do którego ładuje zawartość pliku z chatem dopiero po naciśnięciu pewnego przycisku. W pliku z chatem znajduje się linijka kodu js, która uruchamia autoodswiezanie okna z wiadomościami. Gdy załaduje do okna chatu inny plik (konkretnie wykaże wcześniej załadowaną zawartość, czyli pliku chatu) to przeglądarka dalej tak jakby pamięta kod js, który wcześniej był załadowany (ale teoretycznie juz go tam nie ma) i nadal autoodswieza okno z wiadomościami…

Pewnie i tak nie zrozumiecie o co mi chodzi wiec zapytam: co zrobić, aby wyłączyć autoodswiezanie ustawione wcześniej za pomocą funkcji setInterval()?

Ta funkcja zwraca wskaźnik, który potem dajesz jako argument clearInterval. Jako że pewnie tego nie rozumiesz:

var h = setInterval(jakas_funkcja, 20);

clearInterval(h);

PS nie zostawia się pustego diva na starcie (ktoś z wyłączonym js nic nie zobaczy). to taka mała dygresja :))

Akurat zrozumiałem, dzięki :smiley:

Bez js ta gra w ogóle nie ruszy. Wszystko jest tak zrobione, żeby działała bez przeładowań strony, więc osoby z wyłączonym js nie będą miały prawdopodobnie dostępu. Pewnie z tego powodu gra okaże się być nieco dziurawą, ale myślę, że da rade wszystko “załatać” (wczoraj w ramach testu odpaliłem grę na telefonie (IE) i okazało się, że niektóre elementy nie działają. Tak jakby załadował pewne pliki do pamięci i potem pokazywał to co już zapamiętał… Dzisiaj będę nad tym glowkowac) W końcu po to ją pisze, żeby się czegoś nauczyć.

Jeszcze raz dzięki za wskazówki.

JS to tylko dodatek, zrób wszystko na php a dopiero potem dopisz js i będzie działać wszędzie.