Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]Explode + Count + MySQL
Forum PHP.pl > Forum > PHP
Endzio
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?
MMPrime
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ę.
Endzio
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
Mlodycompany
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
Crozin
tabele:
ankieta - ID, pytanie, aktywna
pytania - ID, aniketaID, pytanie
glosy - ID, pytanieID, wartosc

W dużym uproszczeniu - potem wybierasz sobie wszystkie potrzebne dane.
Endzio
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...
Mlodycompany
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
phpion
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.
Mlodycompany
@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
Endzio
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.
phpion
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.
Crozin
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)
Endzio
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>).
Crozin
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"
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.