Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MYSQL]Explode + Count + MySQL
Endzio
post
Post #1





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 10.09.2007

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


Witam, piszę z powodu mojej niewiedzy. smile.gif

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?
Go to the top of the page
+Quote Post
MMPrime
post
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ę.


--------------------
Go to the top of the page
+Quote Post
Endzio
post
Post #3





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 10.09.2007

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


Cytat(MMPrime @ 26.04.2008, 08:13:51 ) *
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ć.

Cytat(MMPrime @ 26.04.2008, 08:13:51 ) *
Kod
$sum = 0;
while( .. )
{
  for( .. )
  {
    $sum += $votes[$i];
  }
}
echo $sum;

Działa, dzięki za pomoc biggrin.gif
Go to the top of the page
+Quote Post
Mlodycompany
post
Post #4





Grupa: Zarejestrowani
Postów: 910
Pomógł: 44
Dołączył: 20.02.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


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





Grupa: Zarejestrowani
Postów: 910
Pomógł: 44
Dołączył: 20.02.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


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 biggrin.gif
Go to the top of the page
+Quote Post
phpion
post
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 winksmiley.jpg 3 sekundy i mam nowe IP.
Go to the top of the page
+Quote Post
Mlodycompany
post
Post #9





Grupa: Zarejestrowani
Postów: 910
Pomógł: 44
Dołączył: 20.02.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


@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
Go to the top of the page
+Quote Post
Endzio
post
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.
Go to the top of the page
+Quote Post
phpion
post
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 winksmiley.jpg hehehe.
Go to the top of the page
+Quote Post
Crozin
post
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
+---------------+
|     ADRES     |
+---------------+
| ul. Sloneczna |
| 33-476 Qwerty |
+---------------+
Czy może?
Kod
+---------------+---------------+---------------+
|     ULICA     |      KOD      |    MIASTO     |
+---------------+---------------+---------------+
| Sloneczna     |  33-476       | Qwerty        |
+---------------+---------------+---------------+
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)

Ten post edytował Crozin 26.04.2008, 10:41:21
Go to the top of the page
+Quote Post
Endzio
post
Post #13





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 10.09.2007

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


Cytat(phpion @ 26.04.2008, 11:37:31 ) *
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.

Cytat(phpion @ 26.04.2008, 11:37:31 ) *
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 winksmiley.jpg hehehe.

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.

Cytat(Crozin @ 26.04.2008, 11:39:39 ) *
Przykład: gdy chcesz zapisać dane teleadresowe (miasto, kod pocztowy, ulica) użytkownika to co wg Ciebie będzie wygodniejsze:
Kod
+---------------+
|     ADRES     |
+---------------+
| ul. Sloneczna |
| 33-476 Qwerty |
+---------------+
Czy może?
Kod
+---------------+---------------+---------------+
|     ULICA     |      KOD      |    MIASTO     |
+---------------+---------------+---------------+
| Sloneczna     |  33-476       | Qwerty        |
+---------------+---------------+---------------+
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)

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
Go to the top of the page
+Quote Post
Crozin
post
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"
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 20.08.2025 - 07:34