Анкета и таблици

7 отговора 199 прегледа
#1

Анкета и таблици

Здравейте.
Имам инсталирана php анкета, резултатите и настройките наблюдавам чрез phpMyAdmin. Има нещо обаче, което не ми позволява да използвам данните ползотворно. Имам желание да разбера от кои IP адреси кои отговори са давани, с цел да знам дали някой не се опитва да гласува няколко пъти за едно и също от различните IP-та от range-a на някой доставчик (с това cookies и IP blocking не могат да се справят).
В phpMyAdmin обаче наблюдавам една таблица с конкретните забранени IP-та и датата и часа, в които е гласувано, а в друга - конкретната бройка на гласове за различните възможности. Можете ли да ми помогнете, по какъв начин мога да комбиниран тези данни, има ли начин да разбера от кой IP адрес какъв избор е направен?
Предварително ви благодаря за помощта!

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

Re: Анкета и таблици

dai malko poveche info.
kak se zapisvat rezultatite
s update ili s insert
ako e s update si napravi nova tablica v koqto da zapisvash IP-to i mnenieto
ako e s insert prosto dobavi pole za ip-adresa i po sushtiq nachin.
malko shte se naloji da prerabotish gotoviq script

Break The UnBreakable
Отговор
в отговор на Popper #3

Re: Анкета и таблици

Здравейте пак, и благодаря за вниманието.
Успях да си вкарам в таблицата за IP locks да ми показва и option_id, т.е. коя от всичките възможности е избрана.
Проблемът обаче е, че моята анкета е multiple choice, а пък в option_id ми показва само една (последната) избрана възможност от наличните.
В анкетата ми има въпрос, и 4 възможни отговори, като всеки може да избира между един и четири от тях. Ако е избран един, ок, разбирам кой е, но ако са 2 и повече, в таблицата ми излиза само една от всичките избрани опции... моля ви, посъветвайте ме дали това може да се промени, и какво трябва да се промени в полето option_id, за да записвам повече от един отговор...
Благодарности :).

Отговор
в отговор на Popper #4

Re: Анкета и таблици

приемаме че checkbox-овете са name=answer[] - квадратни скоби за да кажеш че е масив

<input type=checkbox name=answer[] value="1">
<input type=checkbox name=answer[] value="2">
<input type=checkbox name=answer[] value="3">
<input type=checkbox name=answer[] value="4">

при натискане на събмит:

$NewAnswers = array();
$NewAnswers = $_POST[answers];

$UserChoise = implode("," $NewAnswers);

по този начин получаваш един низ:
$UserChoise = "1, 3, 4";

след това при обработката на данните за визуализиране на резултата ще си поиграеш малко с implode, explode

Редактирано от $burov на

Отговор
в отговор на $burov #5

Re: Анкета и таблици

Здравей, и благодаря за отговора.
Нека първо ти кажа, че анкетата си работи перфектно, но аз просто искам да й добавя тази функция за запис на избраните опции освен IP-то в таблицата tapps_iplocks. (tapps - името на скрипта).
Първоначално, там имаше следните полета: poll_id (това е номера на действаща анкета), IP, timestamp. Редът, който обновяваше информацията там изглеждаше така:
db_query("INSERT INTO tapps_iplocks (poll_id,ip) VALUES($poll_id,'$ip'");
Аз добавих още едно поле в таблицата, option_id, и промених кода:
db_query("INSERT INTO tapps_iplocks (poll_id,ip,option_id) VALUES($poll_id,'$ip',$option_id");.
И така, в новото поле почна да се появява и една от всичките избрани възможности. Но тъй като анкетата ми е multiple choice, това не ме устройва. Очевидно трябва да променя този ред така, че да се записвет всичките избрани options. Видях в твоя отговор една важна подробност: "," , и очевидно ако това присъства ще се запаметяват повече от една опции... но как да го вмъкна?
Съжалявам, ако не се изразявам компетентно, но всичките PHP скриптове, които съм използвал досега са били готови , и е трябвало само да се донастройват. За първи пък се ровя в кода по-задълбочено.
Адски ще съм ви благодарен, ако ми отделите малко внимение и ми помогнете, защото си търся и се разправям с такива анкети от няколко месеца, и никога не съм бил толкова близо до успеха и това, което винаги съм търсел за сайта си! ...

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

обяснения

копирам горния код и ще го обясня:

приемаме че checkbox-овете са name=answer[] - квадратни скоби за да кажеш че е масив

<input type=checkbox name=answer[] value="1">
<input type=checkbox name=answer[] value="2">
<input type=checkbox name=answer[] value="3">
<input type=checkbox name=answer[] value="4">

при натискане на събмит:

//създаваме празен масив
$NewAnswers = array();

//всички отговори ги вмъкваме в този празен масив, или други думи - масива NewAnswers ще съдържа отговорите от анкетата
$NewAnswers = $_POST[answer];

//функцията implode вмъква някакъв знак между елементите на даден масив и //от масива прави низ. Крайния резултат е низа $UserChoise
$UserChoise = implode("," $NewAnswers);

//по този начин получаваш един низ, който вече трябва да го запишеш
$UserChoise = "1, 3, 4";
db_query("INSERT INTO tapps_iplocks (poll_id,ip,option_id) VALUES($poll_id,'$ip',$UserChoise");

като ред от таблицата това ще изглежда така:

pool_id ip option_id
2 251.65.45.85 1,3,4


********************************

има и друг вариант при който отделните отговори ще ги записваш на отделни редове и таблицата ще изглежда така:
pool_id ip option_id
2 251.65.45.85 1
2 251.65.45.85 3
2 251.65.45.85 4

ако се върнем на горния код, той ще изглежда така:
$NewAnswers = array();
$NewAnswers = $_POST[answer];

for($i = 0; $i <= (count($NewAnswers) - 1); $i++)
{
db_query("INSERT INTO tapps_iplocks (poll_id,ip,option_id) VALUES($poll_id,'$ip',$NewAnswers[$i]);
}

Отговор
в отговор на $burov #7

Re: обяснения

Здравей пак,
честно да ти кажа, не разбирам защо да създавам нов масив, след като резултатите се съхраняват правилно в друга таблица... аз просто искам да комбинирам, съчетая данните от двете таблици.
Ето всъщност как се записва информацията в другата таблица, която съдържа бройката на отговори за всяка от опциите:

// counts the vote (make changes in db)
function count_vote($poll_id, $options)
{
global $HTTP_SERVER_VARS;
global $tapps_ip_locking;

// store data
foreach ($options as $option_id)
{
db_query("UPDATE tapps_votes SET counter=counter+1 WHERE poll_id=$poll_id AND option_id=$option_id");
}

// lock ip

if (isset($tapps_ip_locking) && $tapps_ip_locking==TRUE)
{
$ip = $HTTP_SERVER_VARS['REMOTE_ADDR'];
db_query("INSERT INTO tapps_iplocks (poll_id,ip) VALUES($poll_id,'$ip'");
}

честно да ти кажа не знам това, което ми препоръча къде да го вмъкна в кода... чудя се също така дали phpMyAdmin не ми позволява по някакъв начин да комбинирам информацията от двете таблици, информацията от някоя от колоните да се съхранява на две места... или да се направи някакъв паралелен анализ... проблемът е просто в това комбинирам информацията, която получавам, на едно място.

Редактирано от Popper на

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

Май си нямате друга работа

CREATE TABLE vote_results (
vote_id int(10) unsigned NOT NULL default '0',
vote_ip varchar(15) NOT NULL default '',
vote tinyint unsigned NOT NULL default '0',
PRIMARY KEY (vote_id, vote_ip)
) TYPE=MyISAM;


при тази структура имате ли нещо против да се ползва следното:
INSERT IGNORE INTO vote_results (vote_id, vote_ip, vote) VALUES ($vote_id, '$vote_ip', $vote);


ще е идеално за single choice, za multiply choice - 2 таблици, в едната са резултатите, в другата id на poll i IP, така и не ми стана ясно какво се чудите толкова

-----------------------
гърбавия ковчег ще го изправи

Редактирано от Дpeмeщ на

Отговор