Проста анкета

18 отговора 482 прегледа
#1

Проста анкета

Здравейте,
"стопанисвам" сайт, важна част от който е гласуването чрез анкети - една с радио-бутон (т.е. избор на един отговор измежду всичките), и една - multiple choice - checkboxes (т.е. всеки може да избере колкото отговора иска). Досега използвах Sparklit, но там съм ограничен във възможността да засичам IP адресите, и по този начин да разкривам по-лесно манипулациите при гласуване. Затова си намерих една проста анкета, под PHP, която за съжаление обаче ми дава възможност за създаване само на анкети с радио-бутони. Аз успях да променя кода така, че при зареждането на анкетата да излизат checkboxes и при опит за гласуване да не следват грешки, но така или иначе резултатите не могат да се съхранят в "базата данни", поради необясними за мен причини... затова искам да ви помоля, ако сте наясно, да ми обясните какво трябва да се промени в кода, за да работи тази анкета и под формата на multiple choice? Ето и оригиналното съдържание на "ключовия файл" poll.php, като съм отбелязал в bold частта, където според мен нещо да се промени, за да приема повече от един посочен отговор. А ако можете да отделите повече време, това е aдресът, където ще откриете цялата програма: [линк]
<?php
include("settings.inc.php");
if (isset($mode)) {
switch ($mode) {
// If user voted, process their vote:
case "vote":
if (isset($vote)) {
$vote_allow = 1;
$file_contents = file($current_poll);
if (((isset($vote_logging))) && (($vote_logging == 1) || ($vote_logging == 3))) {
foreach ($file_contents as $line) {
if (eregi($REMOTE_ADDR, $line)) {
echo $already_voted;
display_form();
$set_already_voted = 1;
$vote_allow = 0;
break;
}
}
}
if (((isset($vote_logging))) && (($vote_logging == 2) || ($vote_logging == 3))) {
if ((isset($voted)) && ($voted == "on")) {
if (!$set_already_voted) {
echo $already_voted;
display_form();
}
$vote_allow = 0;
break;
}
}
if ($vote_allow) {
$poll_string = $vote . "|" . $REMOTE_ADDR . "\n";
$fp = fopen($current_poll, "a");
$string_size = strlen($poll_string);
if (fputs($fp, $poll_string, $string_size)) {

if (((isset($vote_logging))) && (($vote_logging == 2) || ($vote_logging == 3))) {
setcookie ("voted", "on", time()+$time_toban);
}
echo $vote_cast . "
";
display_form();
}
fclose($fp);
}
}
break;
// If user asked to show results, display results:
case "results":
$poll_contents = file($current_poll);
// How many total votes we have;
$total_votes = sizeof($poll_contents);
$answers = file($config);
if ($total_votes == 0) {
echo $no_votes_yet;
display_form();
}
else {
echo "Ratings:
";
$size_answers = sizeof($answers) - 1;
$votes[$size_answers] = 0;
for ($current_number = 1; $current_number <= $size_answers; $current_number++) {
foreach ($poll_contents as $line) {
$line_parts = explode("|", $line);
if ($line_parts[0] == $current_number) {
$votes[$current_number]++;
}
}
$percentage = $votes[$current_number]/$total_votes*100;
$graph_width = 2 * $votes[$current_number];
echo "<img src=tick.gif height=10 width=" . $graph_width . ">&nbsp;&nbsp;&nbsp;" . round($percentage, 2) . " %&nbsp;&nbsp;&nbsp;" . $answers[$current_number] . ": " . $votes[$current_number]/1 . " votes.
";
}
echo "Total votes: " . $total_votes;
}
break;

case "previous":
$file_contents = file($archive_poll);
if (sizeof($file_contents) == 0) {
echo $no_previous;
display_form();
}
else {
for ($i=0;$i<sizeof($file_contents);$i++) {
$each_poll = explode("|", $file_contents[$i]);
echo $each_poll[0] . "
" . $each_poll[1] . "<hr>";
}
}
break;

// If no proper mode selected, display voting form;
default: display_form(); break;

}
}
// If no mode selected, display voting form;
if (!isset($mode)) {
display_form();
}

function display_form() {
global $config;
global $no_voting;
global $PHP_SELF;
echo "<form name=poll action=" . $PHP_SELF . " method=post>";
$answers = file($config);
if (sizeof($answers) == 0) {
echo $no_voting;
}
else {
$current_number = 1;
$size_answers = sizeof($answers) - 1;
// Display question;
echo $answers[0] . "
";
// Display answers;
for ($current_number = 1; $current_number <= $size_answers; $current_number++) {
echo "<input type=radio name=vote value=" . $current_number . ">" . $answers[$current_number] . "
";
}
echo "<input type=hidden name=mode value=vote>";
echo "
<input type=submit value=vote>";
echo "</form>";
echo "<a href=" . $PHP_SELF . "?mode=results>Results</a>";
echo "&nbsp;&nbsp;";
echo "<a href=" . $PHP_SELF . "?mode=previous>Previous polls</a>";
}
}
?>
Предварително ви благодаря за помощта, и дано само не се окаже, че това, което ми се иска не може да се осъществява с РНР, а само Perl примерно (хмм все пак не ми се вярва).

Отговор
в отговор на CaXo #2

Re: Проста анкета

Не съм гледал кода, но отговорът не е в него, а в структурата на базата данни.

Това че си направил radio бутоните на checkbox е все едно да си нарисуваш врата на стената и да се опитваш да минеш през нея.

Отговор
в отговор на CaXo #3

Re: Проста анкета

1. "Bazata danni" ti e textov fail current_poll.txt
2. Problema ti e v tova 4e tazi anketa koiato si pusnal se priema samo 1 answer i se zapisva samo toi. Ne se generira masiv ot vazmoznosi a se vzima SAMO 1.
predpolagam 4e si smenil tova:
echo "<input type=radio name=vote value=" . $current_number . ">" . $answers[$current_number] . "
";

s tova
echo "<input type=checkbox name=vote value=" . $current_number . ">" . $answers[$current_number] . "
";

Ot cialata rabota polu4ava6 mnogo checkboxo-ve s ednakvi imena ....
i efekta e edna kragla 0
ili gi napravi sas unikalno ime i zapisvai tezi koito sa 4eknati ili gi napravi v masiv i posle zapisvai setnatite mu elementi.
no pri tova polozenie triabva da smeni6 i logikata na zapisvaneto i logikata na ADMIN view-to koeto e tolkova 4e sedni i si napravi anketata sam :-)

E tuk ni6to niama :[линк]
Отговор
в отговор на ro6avia #4

Re: Проста анкета

За съжаление не мога да направя нито едно от нещата, които ме посъветва... почти нищо не разбирам от програмиране, досега само един phpBB съм инсталирал . Точно за това се скъсах да търся multiple choice анкета, но много странно - такова нещо не намерих... ако имате идеи и споделите къде бих могъл да пожъна успех в моето начинание, ще съм ви много благодарен.

Отговор
в отговор на CaXo #5

Re: Проста анкета

SaXo -> tova 4e ne si programist e lo6o.... az mooga da ti nahvurliam ideia kak da napravi6 ne6tata no ne mi se zanimava da gledam source-a sorry :((

zna4i... checkboxovete ga kra6tava6 sus ime[index] kudeto index se promenia... a stoinostta ia pravi6 kato stepen na 2 -> 1,2,4,8,16,32,64...

posle vuv skripta dobavia6 ne6to ot roda na:
$sum = 0;
foreach ($ime as $a) $sum += intval($a);

taka ako niakoi e otgovoril na 1-vi i 4-ti otgovor kato rezultat vuv sum polu4ava6 1+8=9 ako e izbral i 6-ti togava 1+8+32=41

az taka si pravia ne6tata no istinata e 4e si pi6a sam skriptovete i znam koe kude mi se namira... ti ako 4ak tolkova ne 4atka6 ot PHP i programirane pro4eti niakolko knigi... pone malko znania 6te natrupa6 za v bude6te :))

Dano sum ti pommognal

Отговор
в отговор на Dakota #6

Re: Проста анкета

Bravo be Dakota!!!
Ti si nai-velikiat developer na sveta!!!

Отговор
в отговор на [ASM] #7

Re: Проста анкета

Ei go pak toa lamer po4na da dava syveti hahahaha!

Отговор
в отговор на MA3EH #8

Re: Проста анкета

Знам.

Отговор
в отговор на Dakota #9

Re: Проста анкета

i si umen kato na agneto tatko mu :-)

E tuk ni6to niama :[линк]
Отговор
в отговор на [ASM] #10

Re: Проста анкета

mnogo po lesno e da zapi6e otgovorite s niakakav razdelitel

E tuk ni6to niama :[линк]
Отговор
в отговор на ro6avia #11

Re: Проста анкета

Това ми звучи доста лесно и на мен :)). При положение, че въпросът и отговорите са просто един тесктов файл, който изглежда така

Въпрос
Отговор
Друг отговор
Трети, и т.н., как според теб трябва да го модифицирам? Или може би не е толкова лесно...? :)

Отговор
в отговор на CaXo #12

Re: Проста анкета

ia mi prati tova koeto si ka4il na servera na maila
6te ti go poprepravia i 6te ti go varna

E tuk ni6to niama :[линк]
Отговор
в отговор на CaXo #13

Re: Проста анкета

edin prost vupros... kak suhraniava6 otgovorite na niakoi... kato stringove->(1. "muj", 2. "jenii"....) ili kato 4isla (1. 3, 2. 1...)????

ako gi surhaniava6 kato string samo edno ne6to 6te ti kaja.. mno gre6ki mogat da se polu4at poviarvai mi ot li4en opit go znam

ako gi suhraniava6 kato 4isla e malko po-trudno na pruv pogled, no tova dava vuzmojnostti za mnogo drugi ne6ta

Отговор
в отговор на CaXo #14

Re: Проста анкета

ima6 po6ta :-)))
imai predvid tova koeto sam ti napisal v neja

E tuk ni6to niama :[линк]
Отговор
в отговор на [ASM] #15

Re: Проста анкета

"kato stringove->(1. "muj", 2. "jenii"....) ili kato"

Такова нещо за пръв път чувам, ти представяш ли си само каво ще стане, когато гласуват сто души. докато го прочетеш тоя филе, потребителя ще му свършат цигарите. То ясно че е кофти, с АСЦИИ файлове, но ако ДБ-то е голям проблем, не си ли се замислиял, че ти триабват не всички отговори, а само броят на всички различни такива.

I wanna read interesting postingz
Отговор
в отговор на [ASM] #16

Re: Проста анкета

sahraniavat se vav format :
$answer_number|$voter_ip
az go pipnah i sega mu gi sahraniava :
$answer_number1,$answer_number2,$answer_number3|$voter_ip
samo 4isla razdeleni sas zapetaja :-)

E tuk ni6to niama :[линк]
Отговор
в отговор на expeler #17

Re: Проста анкета

V slu4aia se pazi i $REMOTE_ADDR koeto se proveriava za da ne se vote-va pove4e ot 1 pat ot edno IP. koeto ozna4ava 4e triabva da search-va6 db-to dali tozi user ne e glasuval ... koeto pak ne e barza operacia.
spored men pri do 100-ina vote file-to 6te raboti po-barzo
da ne govorim 4e ako niama6 DB server ..... :-))))

E tuk ni6to niama :[линк]
Отговор
в отговор на CaXo #18

molba do ro6aviq i do CaXo

PLs nqkoi da mi pratq dovurshenata forma poneje ne mi se zanmiava da si pravq a i na men mi trqbva takvoz 4udo na priteklite se 10x predvaritelno
[email protected]
[email protected]


[линк]
e te tui e to

Отговор
в отговор на gron #19

Re: molba do ro6aviq i do CaXo

[линк]

eto ti edin skript... no iska mySQL

Отговор