![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 10.09.2007 Ostrzeżenie: (0%) ![]() ![]() |
Witam, piszę z powodu mojej niewiedzy.
![]() Przyjmijmy, że sonda wygląda tak: ![]() Z czego tabela bazy danych tak: ![]() No i oczywiście skrypt: Kod $q = mysql_query("SELECT * FROM poll WHERE active='1' ORDER BY id desc limit 1"); while ($db = mysql_fetch_array($q)) { $title = $db['title']; $options = explode("\n", $db['options']); $votes = explode("\n", $db['votes']); echo '<b>'.$title.'</b><br />'; for ($i = 0; $i < count($votes); $i++) { echo $options[$i].': '.$votes[$i].'<br />'; } } echo '<br /><span>Ilość głosów: '.?.'</span>'; Problem tkwi w wyświetleniu sumy głosów tablic $options[0], $options[1] itd. Chodzi o sumowanie głosów wszystkich opcji w danej sondzie, np. dla przykładu pierwszego zrzutu, aby suma była liczbą 25. Da się to wykonać bez dodatkowego zapytania sql? |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 79 Pomógł: 12 Dołączył: 23.04.2008 Ostrzeżenie: (0%) ![]() ![]() |
Kod $sum = 0; while( .. ) { for( .. ) { $sum += $votes[$i]; } } echo $sum; Choć uważam że przedstawiona struktura bazy danych zupełnie nie nadaję się nie ankietę. -------------------- ![]() |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 10.09.2007 Ostrzeżenie: (0%) ![]() ![]() |
Choć uważam że przedstawiona struktura bazy danych zupełnie nie nadaję się nie ankietę. Dlaczego? Rozważałem rozdzielenie na dwie tabele, ale zawsze to dodatkowe zapytanie, którego można było się pozbyć. Kod $sum = 0; while( .. ) { for( .. ) { $sum += $votes[$i]; } } echo $sum; Działa, dzięki za pomoc ![]() |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 910 Pomógł: 44 Dołączył: 20.02.2008 Skąd: Łódź Ostrzeżenie: (20%) ![]() ![]() |
taki system da sie zrobi bardzo latwo na jednej tabeli ktora ma max. 3 pola np.
ID | opcja | ilosc i jezeli ktos zaglosuje to robisz zmiane w polu ilosc na ilosc terazniejsza + 1 |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
tabele:
ankieta - ID, pytanie, aktywna pytania - ID, aniketaID, pytanie glosy - ID, pytanieID, wartosc W dużym uproszczeniu - potem wybierasz sobie wszystkie potrzebne dane. |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 10.09.2007 Ostrzeżenie: (0%) ![]() ![]() |
Cytat taki system da sie zrobi bardzo latwo na jednej tabeli ktora ma max. 3 pola np. ID | opcja | ilosc i jezeli ktos zaglosuje to robisz zmiane w polu ilosc na ilosc terazniejsza + 1 Chodzi również o blokadę przed ponownym głosowaniem, wiem można użyć ciasteczek, ale to nie wystarczy, gdy ciastko wygaśnie osoba będzie mogła glosować ponownie, więc pozostaje IP. Myślę, że nie da się tego inaczej rozwiązać w jedej tabeli. Jeśli się mylę, to proszę o napiszcie. Cytat tabele: ankieta - ID, pytanie, aktywna pytania - ID, aniketaID, pytanie glosy - ID, pytanieID, wartosc W dużym uproszczeniu - potem wybierasz sobie wszystkie potrzebne dane. No właśnie, 3 tabele... Ten post edytował Endzio 26.04.2008, 09:31:35 |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 910 Pomógł: 44 Dołączył: 20.02.2008 Skąd: Łódź Ostrzeżenie: (20%) ![]() ![]() |
ja bym zrobil tak
tabela 1 ID | opcja | glosy tabela 2 IP i zapytanie do tabeli 2 gdzie ip = obecne ip zliczenie rekordow z tabeli warunek jezeli zliczona wartosc = 1 blokada jezeli zloczona wartosc = 0 glosowanie mozliwe wtedy uniknie sie powtornego glosowania. jak chcesz gotowy skrypt to za niewielka opłata ![]() |
|
|
![]()
Post
#8
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
Jedyny poprawny przedstawiony tu pomysł na strukturę tabel, to pomysł przedstawiony przez ~Crozina. @Mlodycompany: powiedzmy, że chcę uzyskać podsumowanie ankiet z ostatniego miesiąca. Albo chcę zablokować daną ankietę (zakończenie głosowania). Jak to zrobić w twoim przykładzie? A zabezpieczenie z IP to żadne zabezpieczenie
![]() |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 910 Pomógł: 44 Dołączył: 20.02.2008 Skąd: Łódź Ostrzeżenie: (20%) ![]() ![]() |
@phpion podalem skrypt w jezyku polskim. idee na ten skrypt dal endzio. skoro zabezpieczenie na ip jest zle to jakie jest dobre? mozna jeszcze zrobic na sesjach, ze aby zaglosowac trzeba byc zalogowanym i wtedy zamiast ip wstawia login
|
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 10.09.2007 Ostrzeżenie: (0%) ![]() ![]() |
Wciąż nie rozumiem dlaczego moje rozwiązanie jest złe.
Jedno zapytanie, jedna tabela, bez niepotrzebnych pól. Można również w ten sposób zrobić sondę wielokrotnego wyboru, dodając po prostu pole "multichoice". W grę wchodzi głosowanie przez gości, więc nie widzę lepszej blokady niż ciacho + ip. |
|
|
![]()
Post
#11
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
Jak pewnie wiesz MySQL jest relacyjną bazą danych. Słowo "relacyjną" jest tu kluczowe. W Twoim przykładzie nie ma żadnych relacji, żadnych powiązań. Wszystko wciepałeś do jednej tabeli i po sprawie. Wyobraź sobie teraz sytuację, że chcesz pobrać głosy użytkownika o danym ID, jakie oddał we wszystkich ankietach. I leżysz. Poza tym może ujmę to inaczej: baza danych powinna sama w sobie móc generować żądane raporty, natomiast w Twoim przypadku konieczne jest ich późniejsze obrobienie w PHP. Gdybyś nie miał możliwości skorzystania z PHP obudziłbyś się z ręką w nocniku
![]() |
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat Wciąż nie rozumiem dlaczego moje rozwiązanie jest złe. Przykład: gdy chcesz zapisać dane teleadresowe (miasto, kod pocztowy, ulica) użytkownika to co wg Ciebie będzie wygodniejsze:Kod +---------------+ Czy może?| ADRES | +---------------+ | ul. Sloneczna | | 33-476 Qwerty | +---------------+ Kod +---------------+---------------+---------------+ Na którym się wygodniej pracuje? Które jest wydajniejsze? (co prawda kody pocztowe/miast można by trzymać w osobnej tabeli, a w powyższej przechowywać tylko ich ID)
| ULICA | KOD | MIASTO | +---------------+---------------+---------------+ | Sloneczna | 33-476 | Qwerty | +---------------+---------------+---------------+ Ten post edytował Crozin 26.04.2008, 10:41:21 |
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 10.09.2007 Ostrzeżenie: (0%) ![]() ![]() |
Jak pewnie wiesz MySQL jest relacyjną bazą danych. Słowo "relacyjną" jest tu kluczowe. W Twoim przykładzie nie ma żadnych relacji, żadnych powiązań.Wszystko wciepałeś do jednej tabeli i po sprawie. Heh, kod nie jest relacyjny, nie wiem kto kieruje się myślą "Mój kod musi być relacyjny", ludzie raczej myślą, o szybkości działania i minimalnych objętościach skryptu. Przede wszystkim chodziło o zminimalizowanie rozmiaru bazy, w przykładzie Crozin'a sonda będzie rozbudowana na 3 tabele i minimum 9 pól, ten sam efekt można by osiągnąć w jednej tabeli i w (minimum) pięciu polach. Wyobraź sobie teraz sytuację, że chcesz pobrać głosy użytkownika o danym ID, jakie oddał we wszystkich ankietach. I leżysz. Poza tym może ujmę to inaczej: baza danych powinna sama w sobie móc generować żądane raporty, natomiast w Twoim przypadku konieczne jest ich późniejsze obrobienie w PHP. Gdybyś nie miał możliwości skorzystania z PHP obudziłbyś się z ręką w nocniku ![]() Tego nie brałem pod uwagę, raczej też z tego bym w przyszłości nie korzystał, ale jeśli już się uprzesz to można zrobić kolejne pole o nazwie "votersid", w którym by zapisywało ID głosujących, podobnie do adresów IP, w przypadku gościa ID równałoby się zero. Przykład: gdy chcesz zapisać dane teleadresowe (miasto, kod pocztowy, ulica) użytkownika to co wg Ciebie będzie wygodniejsze: Kod +---------------+ Czy może?| ADRES | +---------------+ | ul. Sloneczna | | 33-476 Qwerty | +---------------+ Kod +---------------+---------------+---------------+ Na którym się wygodniej pracuje? Które jest wydajniejsze? (co prawda kody pocztowe/miast można by trzymać w osobnej tabeli, a w powyższej przechowywać tylko ich ID)| ULICA | KOD | MIASTO | +---------------+---------------+---------------+ | Sloneczna | 33-476 | Qwerty | +---------------+---------------+---------------+ Masz rację, w przykładzie podanym powyżej Twój sposób jest lepszym rozwiązaniem, ale nierównoznacznym w przypadku tego o co mi chodziło, to coś jak "rowspan" w tabelkach (<td>). ![]() Ten post edytował Endzio 26.04.2008, 11:20:00 |
|
|
![]()
Post
#14
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Dobrze zaprojektowana relacyjna baza danych będzie w większości przypadków działać szybciej, wydajniej, efektowniej, a przede wszystkim wygodniej niż taki "Twój wynalazek"
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.08.2025 - 07:34 |