[ spezia @ 08.10.2007. 17:05 ] @

Imam logicki problem pa ako moze jedan savet.Hteo bih da napravim anketu sa mysql gde bi bila i arhiva anketa..
Sto se tice ankete:
Pravim dve tabele u bazi
1)
Anketa
id,name(pitanje ankete),value1,value2,...value10( 10 opcija za glasanje)..
2)
Result
id,counter1,counter2,...,counter10(cuva vrednost-brojac za svaku opciju glasanja)
Poenta je sledeca:
Kada izaberem opiju DA (value2,recimo),treba da iz baze pomocu id u counter2 doda +1,u ostala polja +0;
Imam silne probleme,pa me zanima da li se ovo resenje isplati ,da li vredi da cimam na ovaj nacin.
Da li ima neko bolji predlog za resenje ovog problema?
[ m_k @ 08.10.2007. 22:41 ] @
Dvije tabele
- pitanja (id | pitanje)
- odgovori (id | pitanjeId | odgovor | votes)

U tabelu pitanja dodas pitanje, zapamtis id, u tabelu odgovori dodajes ponuđene odgovore i onaj id upisujes u kolonu pitanjeId (nisi ogranicen na broj ponuđenih odgovora). Sql za povecanje broja bi bio "UPDATE odgovori SET votes=votes+1 WHERE id=$idOdgovora LIMIT 1".

Tako bi ja uradio, e sad jel to najbolji nacin ne znam.
[ vilyu @ 09.10.2007. 08:04 ] @
Ako je potreba i Arhiva anketa, ja bih dodao i tabelu anketa, potencijalno sa datumima vazenja (od, do).

Predlozenu tabelu pitanja bih prosirio ID-jem ankete na koje se pitanje odnosi.
[ Miroslav Ćurčić @ 09.10.2007. 08:20 ] @
Imaš u top temi "Treba mi skripta" linkove ka kolekcijama takvih već urađenih skripti,
pregledaj, isprobaj pa vidi kako su to oni uradili.

Negde sam pročitao: dobri programeri pišu kvalitetan kod, najbolji ne pišu, koriste skripte ovih prvih.
Znači pokupi njihova rešenja.
[ spezia @ 09.10.2007. 18:50 ] @
A da pokusamo sa mojom idejom malo ..
Znaci imam dve tabele ..
Jedna ima pitanje i value1,value2,value10(vrednost za svaku opciju ankete).Druga tabela ima id,counter1,counter2,..counter10(koji pamti vrednost za svaku VALUE-brojac koliko je neko glasao za opciju).Kada hocu da glasam ja prosledjujem vrednost $choise(u formi sa radio buton to je 1,2,3,4..)
Code:


<?php

if(isset($_POST))
{
  $choise=$_POST['value'];
  if (empty($choise))
  {
    echo "Niste glasali !";
    exit;
  }
    $anketa_id=$_POST['id'];
}
$base="test";
  $table_count="resultat";
  $link=mysql_connect('localhost','root','a');
  if(!(mysql_select_db($base)))
     {
     echo "Baza nije selektovana.<BR>";
     }
     $var="SELECT * FROM $table_count ";
     if(!($result2=mysql_query($var)))
     {
     echo"Nije selektovana tabela $table_count";
     }
     while($counts=mysql_fetch_row($result2))
    {
     if($counts[0]==$anketa_id) //$counts[0] je ID druge tabele koji izjednacava ID sa prvom tabelom
     {
      $counter1=$counts[1];//ucitava vrednost iz tabele za polje value1 kako bi kasnije povecala za 1 ako je glasano za prvu opciju
      $counter2=$counts[2];
      $counter3=$counts[3];
      $counter4=$counts[4];
      $counter5=$counts[5];
      $counter6=$counts[6];
      $counter7=$counts[7];
      $counter8=$counts[8];
      $counter9=$counts[9];
      $counter10=$counts[10];
      }
     }
     echo "Broj iz baze $counter1,$counter2,$counter3..";//PROBNI KOD KOJI RADI POKAZUJE VREDNOST IZ TABELE
  switch($choise)
  {
    case "1":
    $counter1++;
    break;
      case "2":
      $counter2++;
      break;
        case "3":
        $counter3++;
        break;
          case "4":
          $counter4++;
          break;
            case "5":
            $counter5++;
            break;
              case "6":
              $counter6++;
              break;
                case "7":
                $counter7++;
                break;
                  case "8":
                  $counter8++;
                  break;
                    case "9":
                    $counter9++;
                    break;
                      case"10":
                      $counter10++;
                      break;
    }
    echo "Ovo su vrednosti u polja 1-2-3-4:->>1:$counter1 <br>2:$counter2<BR>3:$counter3<BR>4:$counter4<BR>";//PROBNI KOD ->RADI                  
    // UPIS PODATAKA U BAZU     
    $link=mysql_connect('localhost','root','a');
  if(!(mysql_select_db($base)))
     {
     echo "Baza nije selektovana.<BR>";
     };
  $query="INSERT INTO $table_count (counter1,counter2,counter3,counter4,counter5,counter6,counter7,counter8,counter9,counter10) VALUES ('$counter1','$counter2','$counter3','$counter4','$counter5','$counter6','$counter7','$counter8','$counter9','$counter10')WHERE id='$anketa_id' ";
  $result=mysql_query($query);
 if(!($result))
  {
   echo "Nije unet zapis u bazu,greska u kodu";
   }
   
?>


GRESKA NE UPISUJE PODATKE U BAZU( Javlja: "Nije unet zapis u bazu,greska u kodu")->To je za sada jedini problem,jer ako ne upise podatak u bazu i brojaci+1 nece raditi..
Kada obrisem uslov WHERE iz zadnjeg upita gde treba da upisuje samo u RED GDE JE ISTA VREDNOST ID,on upisuje u bazu,ali svaki unos,poseban id..
Ali sam primetio da rade brojaci->dobijem 1 u value1,sledeci broj u value4(ostala polja 0,zavisno koju opciju glasam)..
Meni treba da vrednosti glasanja pamti u isti red id-a koji ce biti isti sa id-om sa pitanjem ankete.

Edit by DakiPro: Nemoj dopustiti da ispadnes nekulturan zato sto pises velikim slovima.



[Ovu poruku je menjao dakipro dana 09.10.2007. u 22:07 GMT+1]
[ dr ZiDoo @ 09.10.2007. 22:25 ] @
Code:

..) WHERE

odmakni jedna space
[ vilyu @ 10.10.2007. 07:18 ] @
A sta ces da uradis sutra kada ti bude trebalo da u jednoj anketi imas 11 odgovora? Prosirices tabelu jos jednom kolonom i malo prepraviti kod? A onda ti preksutra bas zatreba i dvanaesti odgovor. Ako vec pravis svoj kod, moj ti je dobronamerni predlog da prihvatis organizaciju tabela kako smo je m_k i ja prikazali.
[ spezia @ 10.10.2007. 07:29 ] @
NECE !!!
Po ovim PROBNIM kodovima,lepo se vidi
da se prosledjuje ID (recimo 1),i $CHOISE (RECIMO 1,2,3,..zavisno koja je opcija glasana),Isto sa SELECT pokazuje uspesno polja iz baze,
i counter kada glasamo dodaje +1..Jedino NE UPISUJE U BAZU.Stvarno ne vidim zasto??
@vilyu
MA ok..ali posto sam se vec mucio,cisto da vidim i ovu ideju..Posle cu raditi i vasu.



[Ovu poruku je menjao spezia dana 10.10.2007. u 09:03 GMT+1]
[ Miroslav Ćurčić @ 11.10.2007. 08:01 ] @
Mogao bi uz poruku o grešci dopisati i
Code:
echo mysql_errors();

Takođe bi bilo korisno i da ehuješ sam $query da vidiš kako je prosleđen.

BTW, nešto se ne sećam da je u okviru INSERT instrukcije uopšte dozvoljeno koristiti WHERE, čak i besmisleno.
[ Phikret @ 09.11.2010. 14:13 ] @
Zdravo. Pravim skriptu za glasanje pomoću php-a i mysql-a. Na slici možete da vidite model baze odnosno tabela koje su potrebne za ovo.

U tabeli answer cuvam odgovore koji se vezuju za konkretnu anketu
U tabeli vote čuvam glasove posetilaca koji se vezuju za konkretni answer
U tabeli poll čuvam ankete


Videćete da sam na slici na tabeli vote crvenim slovima ispisao koji su odgovori u pitanju da bi bilo preglednije. Dakle zanima me sledeće:

Zašto mi mysql vraća rezultat 1 za odgovor 'nastava' iako ga nema među glasovima, odnosno niko nije glasao za taj odgovor?

Pogledajte malo kako izgleda upit, meni je delovalo ovako najprirodnije. Uradio sam outer join kako bi mi vratio vrednosti iz tabele answer iako nije bilo glasova, ali dobijam 1 u tom slučaju iako očekujem da dobijem 0. Ovo je upit:

Code:
select distinct text, 
count(*) as broj from vote right outer join answer on 

(answer.id = vote.id_answer) where answer.id_poll = '1' group by text order 

by answer.id



[ peca89bg @ 09.11.2010. 21:37 ] @
pogledaj ovo resenje... ovo sam ja pravio na seminarkom... prilicno je jednostavno... evo ti link: http://hotfile.com/dl/81531481/6c2e3a1/anketa.rar.html
[ Phikret @ 09.11.2010. 21:55 ] @
Peco pogledaću tvoje rešenje. Ja sam već završio nekih 90% posla, samo mi je ovo pravilo problem, a mislim da sam našao u čemu je kvaka. To ću da probam kasnije. Izgleda da umesto što brojim count(*) treba da brojim count(id)...
[ peca89bg @ 09.11.2010. 22:16 ] @
pa vidi ova anketa ti radi tako sto imas opcije, Odličan je! Nije loš. Može i bolje. Ne svidja mi se. i ista ta polja su u bazi... kad se klikne na nesto od ponudjenog u bazi se to uveca za 1 a kad se klikne na fajl rez.php ispise ti rezultate u %. Bas jednostavna anketa koja vrsi posao.. Sad tu moze jos recimo da se uradi da zabranis korisniku da glasa u odredjenim vemenskim intervalima, recimo samo jednom na 12h tako sto ces da proveras po IP-u ali ima malo vise posla... ako ti ne treba nista preterano i nabudzeno ovo ti je sasvim ok resenje barem po meni... nisam bas gledao detaljno tvoj kod ali onako sam ga preleteo i mislim da si suvise zakomplikovao stvari (bez uvrede) :)
[ notnowjohn @ 10.11.2010. 07:32 ] @
Nije mi jasno zasto sessionid u bazi? Ako tako ogranicavas koliko puta moze da glasa tj. da li je glasao, nista neces postici sto nebi sa jednostvnim setovanjem kolacica jer se sessionid na client side cuva bas u kolacicu koji kada se obrise php dodeljuje novi.
Ako nemas registrovanje korisnika jedino preko kolacica mozes ograniciti glasanje ali u to se ne mozes uzdati mnogo.
[ Phikret @ 10.11.2010. 09:16 ] @
@notnowjohn

E baš sam ovo i hteo da pitam kasnije. Znači taj sessionId u bazi se ni tretira u opšte. To mi je bila prethodna zamisao, međutim, korisnik (radi se o neregistrovanim korisnicima), može da pokrene novu sesiju i da glasa ponovo. Trenutno ograničenje se izvodi na osnovu IP adrese, odnosno ne dozvoljava se korisniku čija se ip adresa već nalazi u bazi da glasa na istoj anketi u narednih 7 dana! Sada, ima manjkavosti i ovaj pristup. Prvo, korisnik može preko nekih proxy-ja da dolazi i da glasa, zatim, može da se desi da ta IP adresa (vrlo mala verovatnoća, ali postoji), u narednih nedelju dana bude dodeljena nekom drugom korisniku koji zaista nije glasao, a ja mu ne dozvolim glasanje. Opet, ta IP adresa može da pripada grupi korisnika u mreži (meni, mom prvom cimeru i mom drugom cimeru i možda komšijama sa srpata niže koji mi mažnjavaju Wireless :)). Znači, ako je bilo ko od nas glasao, ostali su uskraćeni.

Pitanje 1: Kako se ovo rešava u drugim sistemima (joomla, wordpress) i da li postoji neki standard koji treba da se prati ili se pokazao kao najbolji.

Pitanje 2: Vezano za kukije, korisnik vrlo lako može da izbriše kuki, što znači da će moći opet da glasa?
[ notnowjohn @ 11.11.2010. 07:58 ] @
U sutini i sam si odgovorio u neku ruku. :)
IP adresa nije sigurna iz razloga koje si naveo. Kolacici se lako mogu obrisati ili izmeniti. ID sesije isto se nalazi u kolacicu. Ostaje ti da uvedes registrovanje i logovanje kako bi podatak o glasanju sigurno bio vezan za tu osobu (osim ako nema vise naloga, ali to je nesto drugo) i bio upisan u bazi. To je najbolje i najpouzdanije resenje.
Postoji i varijanta sa flash objektom, ali sa tim nisam nesto petljao, poznato mi je samo teorijski, tako da ce ti to verovatno neko drugi da pojasni. Mogu reci samo da se zasniva na tome sto php i flash nedele istu sesiju, pa se kroz neki baner na stranici moze sacuvati podatak koji nece biti obrisan brisanjem js kolacica. Tako nekako valjda.. :)

[Ovu poruku je menjao notnowjohn dana 11.11.2010. u 12:56 GMT+1]
[ Milos911 @ 11.11.2010. 10:18 ] @
Citat:
notnowjohn: To je najbolje i najpouzdanije resenje.
Najpouzdanije jeste, ali da li je najbolje? Iz korisnickog ugla gledano, nema sanse da se registrujem negde samo zbog ankete. Ako je sajt vec sa registracijom onda ok, a ako nije onda je bolje raditi sa kolacicima. Pa neka glasaju koliko im volja, ako ih ne mrzi da svaki cas brisu kolacice...
[ peca89bg @ 11.11.2010. 10:55 ] @
pa ako sam sajt zahteva registraciju korisnika zasto bi onda radili poreko ip-a ili kukija? zasto ne recimo preko korisnickog imena ili emaila koji je jedinstven u bazi? prethodno namestimo da samo ulogovani korisnici mogu da glasaju.. moja ideja je da kad korisnik glasa da se u bazu upise vreme i posle ako hoce ponovo da glasa oduzmes sadasnje vreme od onoga kad je glasao i proveris ako je > (npr. 12 sati, 7 dana, itd...) onda moze a else ne moze....
[ notnowjohn @ 11.11.2010. 10:57 ] @
@Milos911

Mislim da smo govorili iz ugla developera. Dakle sa aspekta ogranicenja glasanja, a ne komfora korisnika pri glasanju i jednostavnosti istog. Da bi se nesto dobilo, mora nesto da se zrtvuje (ma sta to bilo) ili da se zadovoljis sa trenutnim stanjem. :)

E da, imas i varijantu sa open id, koja je jako jednostavna.

@peca89bg
To bi bilo kao da imas tenk a napadas sa perorezom. :)
[ Phikret @ 11.11.2010. 11:46 ] @
Moje rešenje se svodi na to da u bazi čuvam ip adresu onoga ko je glasao. Ako je opet došao da glasa sa iste ip adrese onda u mysql-u oduzimam vreme poslednjeg glasa sa te adrese i sadašnjeg vremena i ako je prošlo 7 dana od tada, onda mu dozvolim opet da glasa, u suprotnom ne.

Nema registracije korisnika na sajtu i anketa nije nikakva posebna studija :), već jednostavno pitanje vezano za nešto što me interesuje kao feedback od korisnika. Nıje mnogo ni strašno ako neko bude uskraćen da glasa ili neko glasa više puta.

Jedino me još interesovali da li neko već zna kako je to rešeno u joomli, wordpressu, bb-ovima...

I, da onaj problem sa upitom koji sam izneo sam rešio tako što umesto count(*) brojim count(id) glasova zabeleženih u bazi.
Code:
select distinct text, 
count([b]id[/b]) as broj from vote right outer join answer on 

(answer.id = vote.id_answer) where answer.id_poll = '1' group by text order 

by answer.id

[ Kerim O @ 03.11.2011. 22:48 ] @
Pozdrav. Imam jedno pitanje koje ne mogu da riješim.
Napravio sam anketu koja radi sasvim ok. Sada pokušavam da napravim stranicu na kojoj će mi se ispisati rezultati zadnje ankete.

Struktura tabela su slijedeće.

Tabela anketa

id,pitanje,opcija1,opcija2,opcija3,opcija4,opcija5

Tabela glasovi

id,p_id,odgovor,glas

Ovo u principu funkcioniše uredu. U prvu tabelu smještam podatke za ankete dok u drugoj čuvam podatke koliko je ljudi glasalo i za koju opciju.
Medjutim malo mi je problem oko rezultata.


Code:


mysql_connect($host,$user,$lozinka) or die ("Nemoguce izabrati");
mysql_select_db($baza) or die ("Nemoguce izabrati bazu");

$zadnji=mysql_query("SELECT id FROM anketa ORDER BY id DESC LIMIT 0,1");

while($vidi=mysql_fetch_assoc($zadnji))
{
    $id=$vidi['id'];

}


$upit=mysql_query("SELECT * FROM glasovi WHERE p_id='$id'");
while($red=mysql_fetch_assoc($upit)){
 
 echo $red['odgovor'];
  echo $red['glas'];
  echo '</br>';
 

    
    
    

}



Medjutim,nikako mi se ne svidja rješenje. Jer npr ako za neku opciju nije nikako glasano ne prikazuje mi je u rezultatima..
Može li mi neko pomoći oko boljeg rješenja?
Hvala i pozdrav

[ Zlatni_bg @ 03.11.2011. 22:54 ] @
Cekaj, jel tebi treba da ispise bas svaki glas ili pravi rezultat ankete, tj. neki procenat ili tako?
[ Kerim O @ 03.11.2011. 23:10 ] @
Treba da mi se ispišu rezultati zadnje ankete.Nešto kao procenat medjutim to sam uradio umjesto procenata,stavio sam samo broj glasova. U biti to mi je svejedno,samo mi je problem jer u slučaju da se u nekoj anketi ne glasa za odredjenu opciju,neću je imati u bazi i onda mi ta opcija u rezultatima neće biti izlistana uopšte. A volio bih da stavim i tu opciju da ima 0 glasova a ne da je ne prikazuje nikako..
Može i na procenat,svejedno..
hvala :)
[ Zlatni_bg @ 03.11.2011. 23:14 ] @
Aha, aha, kapiram... mislio sam da ti se u tu tabelu upisuje svaki glas zasebno, a u sustini se samo povecava broj glasova tj. edituje vrednost... :) odgovor je u sustini opcija iz prve tabele, jel da?

Ono sto bi mogao da odradis je da ti se pri kreiranju neke ankete, kreiraju i unosi u tabeli "glasovi", i da se popune pocetne vrednosti "glas" sa nulom.
[ Kerim O @ 03.11.2011. 23:17 ] @
Da,upravo...

Nekako mi je ta ideja pala na pamet ali mi se učinila malo "zastarjelo",odnosno nekako ne praktična :D
Uglavnom,odradiću tako,ukoliko neko ne napiše neki konstruktivniji i ljepši prijedlog :)

Hvala svakako.
[ Zlatni_bg @ 03.11.2011. 23:20 ] @
Pa i nije neprakticna, bar sa tom organizacijom koja je sad :)

Ono sto ja mislim da bi bilo bolje je da imas samo jednu tabelu, koja bi bila malo poveca, ali koja bi sadrzala i informacije o nazivu opcija i kolicini glasova. Tako bi resio problem svega toga i sve bi bilo prakticnije :)
[ Kerim O @ 03.11.2011. 23:38 ] @
U par narednih dana ću se igrati sa novom opcijom kako bi mi to malo ljepše izgledalo :D

Pa ću postaviti kod ovdje,pa onda možeš baciti komentar i to...Ovo su sve neke ideje u glavi i vjerovatno na pogrešan naćin napisane ali sam gledao da sam logički odradim dio posla pa to sve izgleda na vrat na nos :D
[ Zlatni_bg @ 03.11.2011. 23:59 ] @
Super :)
Evo ti neka moja ideja, pa ti vidi da li ti se svidja, ili je prilagodi...

Tabela izgleda ovako, skraticu je na 3 izbora da skratim malo kucanje:

id | tekst_ankete | izbor_1 | izbor_2 | izbor_3 | glasova_1 | glasova_2 | glasova_3

Stranice koje ucestvuju, iliti delovi koda:

index - linkovi do svega, ponudjene ankete itd, nalickaj ga kako hoces :)
stranica za kreiranje ankete - stranica koja radi mysql query i pravi novi unos u tabeli, kreira npr : 1 | Da li volite PHP? | da | ne | ne znam sta je PHP | 0 | 0 | 0
stranica za glasanje - otvara anketu koju uzmes preko id-a ankete (mysql select), prikazuje info o njoj, razlika izmedju tvog i ovog nacina je sto se koristi samo 1 mysql query za prikaz glasova. Kada korisnik odabere preko radio buttona (verovatno ti je to izbor), radi se mysql update query samo tog polja koje je korisnik izabrao.
stranica za prikaz anketa - obican select query jedne ili vise anketa, potom mozes da iscitas vrednosti svih glasova, matematicki odredis procente i posao zavrsen :)
[ Milos911 @ 04.11.2011. 08:46 ] @
Napisah kilometarski odgovor, i taman da posaljem kad nestade struje. Samo na minut. Mislim da se to desava samo u ovoj usranoj drzavi :/.

Enivej, evo kako bih ja to uradio:

tabele:
Code:

anketa:
aid - anketa id
ime - ime ankete
opis - opis ankete

Code:

pitanja:
pid - pitanje id
aid - anketa id
pitanje - tekst pitanje
odgovora - procenat ili broj ili kako hoces odgovora

Code:

odgovori:
oid - odgovor id, ako ti ne treba ne moras ga pisati
aid - anketa id, ako neces cesto uzimati ime ankete, ovo ti ne treba. Za te retke slucajeve mozes uzimati preko pid-a (znaci ide pid pa dalje preko pitanja ides do aid-a)
pid - pitanje id
user (identifikacija korisnika, ako imas registraciju ovde mozes staviti uid, a podatke za korisnika drzati u drugoj tabeli)
odgovor - izabrani odgovor

-----------------------------------------
Znaci prilikom dodavanja ankete prvo upisujes detalje u tabelu anketa. Posle u pitanja upisujes samo pid ankete, i na taj nacin povezujes pitanje sa anketom (imas dobru funkciju mysql_insert_id(), koja ti vraca id zadnje unete vrednosti (id iz auto_increment reda)), cisto da znas ako ces sve da radis na jednoj strani.
Odgovore upisujes u odgovori, logicno. Kad uneses odgovor, radis mysql_query("UPDATE pitanja SET odgovora=odgovora+1(ovo pises bas ovako, ne moras prvo da vadis vrednost odgovora da bi dodao +1) WHERE pid='$pid'").
-----------------------------------------
Prednost ovog pristupa je to sto mozes da imas koliko god hoces pitanja u anketi, i ne moras da svaki put povlacis sve odgovore, jer vrednosti vec imas izracunate u tabeli pitanja.
Inace imena tabela/redova pisi na engleskom, i sori ako sam malo pametovao(racunam bolje sve da napisem, mozda nesto od toga ne znas, znam koliko bi meni koristilo da nisam morao sve sam da provaljujem :) ).