PHP+MySQL 투표 시스템 의 설계 와 공유 실현

14115 단어 투표 시스템
시스템 이 크 지 않 습 니 다.이 시스템 을 완성 하 는 과정 에서 저 는 세 가지 절 차 를 나 누 었 습 니 다.데이터 베이스 디자인•시스템 프레임 워 크 디자인•전단 미화 데이터 베이스 디자인 세 장의 표:투표 결과 통계 표(countvoting),투표 자 기록 표(ipvotes),사용자 표(user)투표 결과 통계 표 는 마지막 투표 기록 을 통계 하 는 데 사 용 됩 니 다.저 는 투표 항목 의 이름(SelectName),투표 항목 의 서명(LabelName),표(CountVotes)등 4 개의 필드 를 만 들 었 습 니 다.투표 자 기록 표 는 투표 자의 IP(IP),지리 적 위치(Location),투표 시간(VoteTime),피 투표 항목 이름(SelectName)을 등록 하 는 데 사용 된다.그리고 ID 도 붙 여 드릴 게 요.사용자 표 는 주로 관리자 에 게 사용 되 며 사용자 이름(name)과 비밀번호(passwd)를 포함 합 니 다.표를 만 드 는 sql 스 크 립 트 는 다음 과 같 습 니 다.
 
--
-- `count_voting`
--
DROP TABLE IF EXISTS `count_voting`;
CREATE TABLE IF NOT EXISTS `count_voting` (
`SelectName` varchar(40) NOT NULL,
`LabelName` varchar(40) NOT NULL,
`CountVotes` bigint(20) unsigned NOT NULL,
UNIQUE KEY `SelectName` (`SelectName`),
KEY `CountVotes` (`CountVotes`),
KEY `CountVotes_2` (`CountVotes`),
KEY `CountVotes_3` (`CountVotes`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=' ';
-- --------------------------------------------------------
--
-- `ip_votes`
--
DROP TABLE IF EXISTS `ip_votes`;
CREATE TABLE IF NOT EXISTS `ip_votes` (
`ID` bigint(20) unsigned NOT NULL auto_increment COMMENT ' : ',
`IP` varchar(15) NOT NULL COMMENT ' IP',
`Location` varchar(40) NOT NULL COMMENT ' ',
`VoteTime` datetime NOT NULL,
`SelectName` varchar(40) NOT NULL,
PRIMARY KEY (`ID`),
KEY `ID` (`ID`),
KEY `SelectName` (`SelectName`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
--
-- `ip_votes`
--
DROP TRIGGER IF EXISTS `vote_count_after_insert_tr`;
DELIMITER //
CREATE TRIGGER `vote_count_after_insert_tr` AFTER INSERT ON `ip_votes`
FOR EACH ROW UPDATE count_voting SET CountVotes = CountVotes + 1 WHERE SelectName = NEW.SelectName
//
DELIMITER ;
-- --------------------------------------------------------
--
-- `user`
--
DROP TABLE IF EXISTS `user`;
CREATE TABLE IF NOT EXISTS `user` (
`name` varchar(10) NOT NULL COMMENT ' ',
`passwd` char(32) NOT NULL COMMENT ' MD5 '
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=' ';
--
-- `user`
--
INSERT INTO `user` (`name`, `passwd`) VALUES
('ttxi', '700469ca1555900b18c641bf7b0a1fa1'),
('jitttanwa', 'adac5659956d68bcbc6f40aa5cd00d5c');
--
--
--
--
-- `ip_votes`
--
ALTER TABLE `ip_votes`
ADD CONSTRAINT `ip_votes_ibfk_1` FOREIGN KEY (`SelectName`) REFERENCES `count_voting` (`SelectName`) ON DELETE CASCADE ON UPDATE CASCADE;
스 크 립 트 에서 알 수 있 듯 이 저 는 트리거 를 만 들 었 습 니 다.ipvotes 표 에 데 이 터 를 삽입 할 때 countvoting 표 의 CountVotes 필드 에 1 을 추가 합 니 다.그리고 마지막 문장 은 외부 관련 자 를 설정 하 는 것 입 니 다.프레임 워 크 디자인 Operator DB 류 는 데이터 베 이 스 를 조작 하 는 데 사용 되 고 Operator VotingDB 류 는 이 시스템 의 특정한 조작 집합 에 사용 된다.PDO 를 사용 하여 데이터 베 이 스 를 조작 합 니 다.저 는 간단하게 포장 합 니 다.
 
/**
*
* PDO,
*/
class OperatorDB
{
//
private $dbms='mysql'; // , , , .
private $host='localhost'; //
private $dbName='voting'; //
private $user='voting'; //
private $passwd='voting'; //
private $pdo=null;
public function __construct()
{
//dl("php_pdo.dll");
//dl("php_pdo_mysql.dll");
$this->dsn="$this->dbms:host=$this->host;dbname=$this->dbName";
try
{
$this->conn=new PDO($this->dsn,$this->user,$this->passwd);// PDO , $db
}
catch(PDOException $e)
{
die("<br/> (creater PDO Error!): ".$e->getMessage()."<br/>");
}
}
public function __destruct()
{
$this->pdo = null;
}
public function exec($sql)
{
}
public function query($sql)
{
}
}
데이터 베 이 스 를 연결 하 는 정 보 를 밀봉 하여 후속 작업 을 편리 하 게 합 니 다.
 
<?php
require_once 'OperatorDB.php';
class OperatorVotingDB
{
private $odb;
public function __construct()
{
$this->odb = new OperatorDB();
}
public function __destruct()
{
$this->odb = null;
}
/**
* Voting
*
* , clear
*/
public function clearTables()
{
$sqls = array("TRUNCATE ip_votes;","TRUNCATE count_voting;");
$this->odb->exec($sqls[0]);
$this->odb->exec($sqls[1]);
}
/**
* count_voting CountValues 0
*
*/
public function resetCountValues()
{
$sql = "UPDATE count_voting SET CountVotes = 0;";
$this->odb->exec($sql);
}
/**
*
* ip_votes
* @param type $ip
* @param type $loc
* @param type $time
* @param type $name
*/
public function vote($ip,$loc,$name)
{
$sql = "INSERT INTO ip_votes VALUES (NULL, '$ip', '$loc', NOW(), '$name')";
$subsql = "SELECT MAX(to_days(VoteTime)) FROM ip_votes WHERE IP='$ip'";
$stm = $this->odb->query($subsql);
if (count($row=$stm->fetchAll())==1)
{
$now = date("Y-m-d H:i:s");
$subsql = "SELECT to_days('$now');";
$stm = $this->odb->query($subsql)->fetch();
$time = $stm[0];// mysql today
// echo $time."<br>";
// echo $row[0][0];
if ($time-$row[0][0]<1)// $time
{
echo " , ip ";
return;
}
}
// echo $sql;
echo " !";
$this->odb->exec($sql);
}
/**
* SelectName
*
* @param string $name
* @param string $label
* @param int $count
*/
public function addSelectName($name, $label, $count=0)
{
$sql = "INSERT INTO count_voting VALUES ('$name', '$label', $count);";
$this->odb->exec($sql);
}
/**
* ,
*
* CountVotes , count_voting
*
* @param int $n
*
*/
public function getVotesSortByCount($n=-1)
{
$sql = "SELECT * FROM count_voting ORDER BY CountVotes DESC LIMIT 0 , $n;";
if (-1 == $n)
{
$sql = "SELECT * FROM count_voting ORDER BY CountVotes DESC;";
}
// echo $sql;
return $this->odb->query($sql);
}
/**
* ,
*
* CountVotes LabelName , count_voting
*/
public function getVotesGroupByLabel()
{
$sql = "SELECT * FROM count_voting ORDER BY LabelName DESC;";
// echo $sql;
return $this->odb->query($sql);
}
}
?>
아래 에 필요 한 함수
 
<?php
/**
*
* js
* @param string $url
*/
function goToPgae($url)
{
echo "<script language='javascript' type='text/javascript'>";
echo "window.location.href='$url'";
echo "</script>";
}
function jsFunc($fun, $arg=null)
{
echo "<script language='javascript' type='text/javascript'>";
echo $fun."('$arg');";
echo "</script>";
}
function jsFunc3($fun, $arg1=null,$arg2=null,$arg3=null)
{
echo "<script language='javascript' type='text/javascript'>";
echo $fun."('$arg1','$arg2','$arg3');";
echo "</script>";
//echo $fun."('$arg1','$arg2','$arg3');";
}
function isLoginNow()
{
if ($_COOKIE["user"]=='')
{
return false;
}
return true;
}
function getClientIP()
{
if ($_SERVER["HTTP_X_FORWARDED_FOR"])
{
if ($_SERVER["HTTP_CLIENT_IP"])
{
$proxy = $_SERVER["HTTP_CLIENT_IP"];
}
else
{
$proxy = $_SERVER["REMOTE_ADDR"];
}
$ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
}
else
{
if ($_SERVER["HTTP_CLIENT_IP"])
{
$ip = $_SERVER["HTTP_CLIENT_IP"];
}
else
{
$ip = $_SERVER["REMOTE_ADDR"];
}
}
return $ip;
}
// 123 ip
function getIpfrom123cha($ip) {
$url = 'http://www.123cha.com/ip/?q='.$ip;
$content = file_get_contents($url);
$preg = '/(?<= :<\/li><li style=\"width:450px;\">)(.*)(?=<\/li>)/isU';
preg_match_all($preg, $content, $mb);
$str = strip_tags($mb[0][0]);
//$str = str_replace(' ', '', $str);
$address = $str;
if($address == '') {
$address = ' ';
}
return $address;
}
// ip
function getIpfromBaidu($ip) {
$url = 'http://www.baidu.com/s?wd='.$ip;
$content = file_get_contents($url);
$preg = '/(?<=<p class=\"op_ip_detail\">)(.*)(?=<\/p>)/isU';
preg_match_all($preg, $content, $mb);
$str = strip_tags($mb[0][1]);
$str = str_replace(' ', '', $str);
$address = substr($str, 7);
if($address == '') {
$address = ' ';
}
return $address;
}
?>
가 있 습 니 다.그 다음 에 백 스테이지 관리자 의 조작 이 어떻게 되 었 습 니까?주로 투표 항목 의 기능 을 추가 하고 데이터 베 이 스 를 조작 하 는 데 이미 실현 되 었 습 니 다.뒤의 기본 적 인 것 은 페이지 를 어떻게 설정 하 는 지,js 와 관계 가 있다.투표 항목 을 추가 하 는 페이지 는 동적 입 니 다.다음 과 같 습 니 다.
 
function addVote()
{
right.innerHTML="<h2> </h2>";
right.innerHTML+="<label> <label>";
addInput("right","cLabelName"," ");
right.innerHTML+="<br><label> <label>";
addInput("right","cSelectName"," ");
right.innerHTML+="<br>";
var args = '\'./add.php\',\'cSelectName\',\'cLabelName\'';
var str = '<input type=button value="\u6dfb " onclick="goToPage('+args+');"/>';
right.innerHTML+=str;
}
//
function addInput(parent,id,pla)
{
// input
var input = document.createElement("input");
input.type = "text";
input.id = id;
input.placeholder = pla;
document.getElementById(parent).appendChild(input);
}
효과:
image
투표 항목 을 비 우 는 것 도 많 지 않 습 니 다.다음 과 같 습 니 다.
image투표 항목 을 추가 하 는 것 은 url 을 통 해 변 수 를 add.phop 페이지 로 전달 하 는 것 입 니 다.
 
<?php
require_once '../api/func.php';

if (!isLoginNow())
{
goToPgae("./index.php");
}

$name = $_GET["cSelectName"];
$label = $_GET["cLabelName"];
//echo $name."<br>".$label;
require_once '../api/OperatorVotingDB.php';
$ovdb=new OperatorVotingDB();
$ovdb->addSelectName($name,$label);
require './header.htm';
goToPgae("./admin.php?page=add&auto="."$label"."&id=cLabelName&foc=cSelectName&msg= ");
?>
다음은 두 개의 페이지 를 뛰 어 넘 는 함수 입 니 다.js 의(위 func.phop 의 페이지 뛰 기 함수 도 js 를 통 해 이 루어 집 니 다).
 
//js
function goToPage(url,arg1,arg2)
{
var a = document.getElementById(arg1).value;
var b = document.getElementById(arg2).value;
url += '?'+arg1+'='+a;
url += '&'+arg2+'='+b;
window.location.href=url;
}

function goToPage1(url)
{
window.location.href=url;
}
수정 삭제 기능 도 실현 되 지 않 았 다.설마 내 가 그 걸 이 루 는 건 아니 겠 지?모듈 에 로그 인하 면 인터넷 에 많아 요.모방 한 거 예요.폼 을 제출 하고 데이터 베 이 스 를 찾 아 결 과 를 되 돌려 주 는 것 입 니 다.성공 하면 쿠키 를 설정 하고 배경 에 있 는 모든 페이지 에 쿠키 를 검사 하 는 기능 을 추가 합 니 다.전단 미화 index.php 페이지 는 먼저 데이터 베 이 스 를 조작 하여 투표 항목 과 표를 얻 은 다음 에 표시 합 니 다(css+div 를 통 해 프레임 워 크 인터페이스 등 을 미화 합 니 다).마지막 으로 투표 단 추 를 누 르 면 폼 을 제출 하고 vote.phop 페이지 로 이동 합 니 다.css 면 다 인터넷 베 낀 거 야.내 가 한 효 과 는 다음 과 같다.
image이 물건 은 아주 작은 정보 관리 시스템 이 라 고 할 수 있 습 니 다.저 는 이 물건 의 소스 코드 를 githubhttps://github.com/hanxi/voting에 올 렸 습 니 다.마음대로 다운로드 하고 수정 할 수도 있 고 우리 가 다운로드 할 수도 있 습 니 다다운로드 클릭.독자 의 회답 교 류 를 환영 합 니 다.이 방면 은 제 강점 이 아니 므 로 부족 한 점 이 많 으 니 가르침 을 바 랍 니 다.저자:함 희(함 희 의 기술 블 로그-블 로그 원)웨 이 보:t.qq.com/hanxi 1203 출처:hanxi.cnblogs.com

좋은 웹페이지 즐겨찾기