설문조사 아이디 체크하여 중복투표 원천봉쇄!!
질문과 검색, 검색과 질문을 연이어 고민을 첨가한 결과....
드뎌;;; 설문조사를 아이디로 체크하여 중복투표를 원천봉쇄하는 소스를 구현했습니다...ㅜㅜ
소스를 공개하기 전, 도움주신, 혜심님, torry님, innox님, 까만도둑님 께 감사드립니다.
모두 직·간접적으로 도움을 주셨습니다.
조잡하기 그지없지만, 이 소스로 저처럼 PHP와 친하지 않으신 분들의 고민을 하나라도 덜기를 바랍니다.. ^^
// G4/bbs/poll_update.php 파일 전체 소스입니다. 긁어서 붙여넣으세요
단, 이 소스는 아이피 체크는 하지 않습니다. 어차피 아이디로 체크하면 한 개의 아이디로는
단 한 번만 투표참여가 가능하니깐요...
새로 생성된 테이블에는 투표한 사람의 아이디와 그 사람이 투표한 항목이 무엇인지가 기록됩니다.
물론, 아이피는 검색을 하지 않을 뿐, 기록은 됩니다.
<?
include_once("./_common.php");
$po = sql_fetch(" select po_id, po_subject, po_point, po_ips from $g4[poll_table] where po_id = '$_POST[po_id]' ");
if (!$po[po_id])
alert_close("po_id 값이 제대로 넘어오지 않았습니다.");
if ($member[mb_level] < $po[po_level])
alert_close("권한 $po[po_level] 이상 회원만 투표에 참여하실 수 있습니다.");
$poll_check = "g4_poll_check";
// 투표여부 테이블 생성
$sql_1 = " CREATE TABLE `$poll_check` (
`vo_id` INT(11) NOT NULL ,
`mb_id` VARCHAR( 20 ) NOT NULL ,
`po_value` VARCHAR( 20 ) NOT NULL ,
PRIMARY KEY ( `vo_id`, `mb_id` ) ) ";
@mysql_query($sql_1);
$poll_check = "g4_poll_check";
// 이미 투표한 것인지 확인하기?
$sql_2 = " select count(*) as cnt from $poll_check
where vo_id = '$po_id'
and mb_id = '$member[mb_id]' ";
$row = sql_fetch($sql_2);
if (!$row[cnt]) { // 투표 안했으면 투표하고 // 포인트도 주기
//아이피 기록에 관한 변수정의 및 아이피 정보 기록
$po_ips = $po[po_ips] . $_SERVER[REMOTE_ADDR] . "\n";
sql_query(" update $g4[poll_table] set po_cnt{$gb_poll} = po_cnt{$gb_poll} + 1, po_ips = '$po_ips' where po_id = '$po_id' ");
// 회원이라면 포인트 부여
if ($member[mb_id])
insert_point($member[mb_id], $po[po_point], $po[po_id] . ". " . cut_str($po[po_subject],20) . " 투표 참여 ");
// 투표했으면 기록하기
$sql_3 = " insert $poll_check
set vo_id = '$po_id',
mb_id = '$member[mb_id]',
po_value = '$gb_poll' ";
sql_query($sql_3);
}
else alert_close("이미 투표하셨습니다.");
goto_url("./poll_result.php?po_id=$po_id");
?>
드뎌;;; 설문조사를 아이디로 체크하여 중복투표를 원천봉쇄하는 소스를 구현했습니다...ㅜㅜ
소스를 공개하기 전, 도움주신, 혜심님, torry님, innox님, 까만도둑님 께 감사드립니다.
모두 직·간접적으로 도움을 주셨습니다.
조잡하기 그지없지만, 이 소스로 저처럼 PHP와 친하지 않으신 분들의 고민을 하나라도 덜기를 바랍니다.. ^^
// G4/bbs/poll_update.php 파일 전체 소스입니다. 긁어서 붙여넣으세요
단, 이 소스는 아이피 체크는 하지 않습니다. 어차피 아이디로 체크하면 한 개의 아이디로는
단 한 번만 투표참여가 가능하니깐요...
새로 생성된 테이블에는 투표한 사람의 아이디와 그 사람이 투표한 항목이 무엇인지가 기록됩니다.
물론, 아이피는 검색을 하지 않을 뿐, 기록은 됩니다.
<?
include_once("./_common.php");
$po = sql_fetch(" select po_id, po_subject, po_point, po_ips from $g4[poll_table] where po_id = '$_POST[po_id]' ");
if (!$po[po_id])
alert_close("po_id 값이 제대로 넘어오지 않았습니다.");
if ($member[mb_level] < $po[po_level])
alert_close("권한 $po[po_level] 이상 회원만 투표에 참여하실 수 있습니다.");
$poll_check = "g4_poll_check";
// 투표여부 테이블 생성
$sql_1 = " CREATE TABLE `$poll_check` (
`vo_id` INT(11) NOT NULL ,
`mb_id` VARCHAR( 20 ) NOT NULL ,
`po_value` VARCHAR( 20 ) NOT NULL ,
PRIMARY KEY ( `vo_id`, `mb_id` ) ) ";
@mysql_query($sql_1);
$poll_check = "g4_poll_check";
// 이미 투표한 것인지 확인하기?
$sql_2 = " select count(*) as cnt from $poll_check
where vo_id = '$po_id'
and mb_id = '$member[mb_id]' ";
$row = sql_fetch($sql_2);
if (!$row[cnt]) { // 투표 안했으면 투표하고 // 포인트도 주기
//아이피 기록에 관한 변수정의 및 아이피 정보 기록
$po_ips = $po[po_ips] . $_SERVER[REMOTE_ADDR] . "\n";
sql_query(" update $g4[poll_table] set po_cnt{$gb_poll} = po_cnt{$gb_poll} + 1, po_ips = '$po_ips' where po_id = '$po_id' ");
// 회원이라면 포인트 부여
if ($member[mb_id])
insert_point($member[mb_id], $po[po_point], $po[po_id] . ". " . cut_str($po[po_subject],20) . " 투표 참여 ");
// 투표했으면 기록하기
$sql_3 = " insert $poll_check
set vo_id = '$po_id',
mb_id = '$member[mb_id]',
po_value = '$gb_poll' ";
sql_query($sql_3);
}
else alert_close("이미 투표하셨습니다.");
goto_url("./poll_result.php?po_id=$po_id");
?>
|
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기
댓글 12개
감사합니다.
네트워크 내의 IP를 체크하니 투표를 하질 못했습니다...
ID 체크로 중복방지 기능 ~~~해결 했습니다
개미님의 수고로 문제를 해결해 정말 감사 드림니다.
근데 한가지 문제는
지난 투표를 하지 않은 사람이 지난 투표의 결과를 확인하지 못한다는 점이있습니다.
즉...지난.설문결과를 보려면 투표하지 않은분은 못본다는데 어떻게 해야할까요?