• 28 odgovora
  • 11.742 pregleda
Anketa u php-u sa MySQL 08.10.2007. u 17:05 · pre 231 meseci #1

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?
Re: Anketa u php-u sa MySQL 08.10.2007. u 22:41 · pre 231 meseci #2
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.
Potpis
May the force be with you...
Re: Anketa u php-u sa MySQL 09.10.2007. u 08:04 · pre 231 meseci #3
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.
Potpis
Pera električar 0637129710, BG, preporučujem.
Re: Anketa u php-u sa MySQL 09.10.2007. u 08:20 · pre 231 meseci #4
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.
Potpis
"The quieter you become, the more you are able to hear."
Blog | PowerCMS
Re: Anketa u php-u sa MySQL 09.10.2007. u 18:50 · pre 231 meseci #5
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]
Re: Anketa u php-u sa MySQL 10.10.2007. u 07:18 · pre 231 meseci #7
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.
Potpis
Pera električar 0637129710, BG, preporučujem.
Re: Anketa u php-u sa MySQL 10.10.2007. u 07:29 · pre 231 meseci #8
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]
Re: Anketa u php-u sa MySQL 11.10.2007. u 08:01 · pre 231 meseci #9
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.
Potpis
"The quieter you become, the more you are able to hear."
Blog | PowerCMS
Re: Anketa u php-u sa MySQL 09.11.2010. u 14:13 · pre 194 meseci #10
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



Potpis
http://www.mojestudije.info
Svako ima pravo da se kreće i da bude kreten


Re: Anketa u php-u sa MySQL 09.11.2010. u 21:55 · pre 194 meseci #12
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)...
Potpis
http://www.mojestudije.info
Svako ima pravo da se kreće i da bude kreten


Re: Anketa u php-u sa MySQL 09.11.2010. u 22:16 · pre 194 meseci #13
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) :)
Re: Anketa u php-u sa MySQL 10.11.2010. u 07:32 · pre 194 meseci #14
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.
Re: Anketa u php-u sa MySQL 10.11.2010. u 09:16 · pre 194 meseci #15
@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?
Potpis
http://www.mojestudije.info
Svako ima pravo da se kreće i da bude kreten


Re: Anketa u php-u sa MySQL 11.11.2010. u 07:58 · pre 194 meseci #16
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]
Re: Anketa u php-u sa MySQL 11.11.2010. u 10:18 · pre 194 meseci #17
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...
Re: Anketa u php-u sa MySQL 11.11.2010. u 10:55 · pre 194 meseci #18
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....
Re: Anketa u php-u sa MySQL 11.11.2010. u 10:57 · pre 194 meseci #19
@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. :)
Re: Anketa u php-u sa MySQL 11.11.2010. u 11:46 · pre 194 meseci #20
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

Potpis
http://www.mojestudije.info
Svako ima pravo da se kreće i da bude kreten


Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme