Maison  >  Article  >  développement back-end  >  Partage de conception et d'implémentation du système de vote PHP plus MySQL

Partage de conception et d'implémentation du système de vote PHP plus MySQL

不言
不言original
2018-04-09 16:35:063379parcourir

Cet article partage avec vous la conception et la mise en œuvre du système de vote PHP plus MySQL. Les amis dans le besoin peuvent se référer à la conception et à la mise en œuvre du système de vote

php. Les amis dans le besoin peuvent se référer au code. ci-dessous. Avec la conception des résultats de la base de données, Script House a finalement fourni le code source à télécharger

Le système n'est pas grand, j'ai donc divisé le processus de réalisation de ce système en trois étapes
•Conception de la base de données
•Conception du cadre du système
•Embellissement du front-end

Conception de la base de données
Concevoir trois tableaux : tableau de statistiques des résultats de vote (count_voting), tableau d'enregistrement des électeurs (ip_votes), tableau des utilisateurs (utilisateur)
Le tableau des statistiques des résultats du vote est utilisé pour compter les enregistrements de vote finaux. J'ai 4 champs pour cela : le nom de l'élément voté (SelectName), le nom de l'étiquette de l'élément voté (LabelName) (qui joue. un rôle dans le classement), et le nombre de votes (CountVotes) .

Le tableau d'enregistrement des électeurs est utilisé pour enregistrer l'adresse IP (IP), l'emplacement géographique (Location), l'heure du vote (VoteTime) et le nom de l'élément voté (SelectName). Ensuite, j'y ajoute également un identifiant.

La table des utilisateurs est principalement utilisée pour les administrateurs, y compris le nom d'utilisateur (name) et le mot de passe (passwd).

Le script sql pour générer la table est le suivant :

Copier le code Le code est le suivant :

-- 
-- 表的结构 `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;

Comme le montre le script, I Un déclencheur est créé qui ajoute 1 au champ CountVotes dans la table count_voting lorsque les données sont insérées dans la table ip_votes. La dernière phrase peut également être utilisée pour définir des mots apparentés externes.
Conception du framework
La classe OperatorDB est utilisée pour faire fonctionner la base de données et la classe OperatorVotingDB est utilisée pour l'ensemble d'opérations spécifiques au système.
Utiliser PDO pour faire fonctionner la base de données, je l'encapsule simplement :

Copiez le code Le code est le suivant :

/** 
* 操作数据库 
* 封装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) 
{ 
} 
}


Se connecter à la base de données Les informations sont encapsulées pour faciliter les opérations ultérieures.

Copier le code Le code est le suivant :

<?php 
require_once &#39;OperatorDB.php&#39;; 
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, &#39;$ip&#39;, &#39;$loc&#39;, NOW(), &#39;$name&#39;)"; 
$subsql = "SELECT MAX(to_days(VoteTime)) FROM ip_votes WHERE IP=&#39;$ip&#39;"; 
$stm = $this->odb->query($subsql); 
if (count($row=$stm->fetchAll())==1) 
{ 
$now = date("Y-m-d H:i:s"); 
$subsql = "SELECT to_days(&#39;$now&#39;);"; 
$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 (&#39;$name&#39;, &#39;$label&#39;, $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=&#39;javascript&#39; type=&#39;text/javascript&#39;>"; 
echo "window.location.href=&#39;$url&#39;"; 
echo "</script>"; 
} 
function jsFunc($fun, $arg=null) 
{ 
echo "<script language=&#39;javascript&#39; type=&#39;text/javascript&#39;>"; 
echo $fun."(&#39;$arg&#39;);"; 
echo "</script>"; 
} 
function jsFunc3($fun, $arg1=null,$arg2=null,$arg3=null) 
{ 
echo "<script language=&#39;javascript&#39; type=&#39;text/javascript&#39;>"; 
echo $fun."(&#39;$arg1&#39;,&#39;$arg2&#39;,&#39;$arg3&#39;);"; 
echo "</script>"; 
//echo $fun."(&#39;$arg1&#39;,&#39;$arg2&#39;,&#39;$arg3&#39;);"; 
} 
function isLoginNow() 
{ 
if ($_COOKIE["user"]==&#39;&#39;) 
{ 
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 = &#39;http://www.123cha.com/ip/?q=&#39;.$ip; 
$content = file_get_contents($url); 
$preg = &#39;/(?<=本站主数据:<\/li><li style=\"width:450px;\">)(.*)(?=<\/li>)/isU&#39;; 
preg_match_all($preg, $content, $mb); 
$str = strip_tags($mb[0][0]); 
//$str = str_replace(&#39; &#39;, &#39;&#39;, $str); 
$address = $str; 
if($address == &#39;&#39;) { 
$address = &#39;未明&#39;; 
} 
return $address; 
} 
//从百度获取ip所在地 
function getIpfromBaidu($ip) { 
$url = &#39;http://www.baidu.com/s?wd=&#39;.$ip; 
$content = file_get_contents($url); 
$preg = &#39;/(?<=<p class=\"op_ip_detail\">)(.*)(?=<\/p>)/isU&#39;; 
preg_match_all($preg, $content, $mb); 
$str = strip_tags($mb[0][1]); 
$str = str_replace(&#39; &#39;, &#39;&#39;, $str); 
$address = substr($str, 7); 
if($address == &#39;&#39;) { 
$address = &#39;未明&#39;; 
} 
return $address; 
} 
?>


Ensuite, il y a comment effectuer les opérations de l'administrateur en arrière-plan, principalement le fonction d'ajout d'éléments de vote, la base de données d'opération a été implémentée ci-dessus. Ce qui suit explique essentiellement comment configurer la page, qui est liée à js. La page d'ajout d'éléments de vote est dynamique, de la façon suivante :

Copier le code Le code est le suivant :

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 = &#39;\&#39;./add.php\&#39;,\&#39;cSelectName\&#39;,\&#39;cLabelName\&#39;&#39;; 
var str = &#39;<input type=button value="\u6dfb加" onclick="goToPage(&#39;+args+&#39;);"/>&#39;; 
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); 
}

Effet :

Partage de conception et dimplémentation du système de vote PHP plus MySQL

La suppression des éléments de vote est similaire, comme suit :

Partage de conception et dimplémentation du système de vote PHP plus MySQL

Pour ajouter des éléments de vote, vous transmettez des variables au module d'ajout .php via l'URL.

Copier le code Le code est le suivant :

<?php 
require_once &#39;../api/func.php&#39;; 

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

$name = $_GET["cSelectName"]; 
$label = $_GET["cLabelName"]; 
//echo $name."<br>".$label; 
require_once &#39;../api/OperatorVotingDB.php&#39;; 
$ovdb=new OperatorVotingDB(); 
$ovdb->addSelectName($name,$label); 
require &#39;./header.htm&#39;; 
goToPgae("./admin.php?page=add&auto="."$label"."&id=cLabelName&foc=cSelectName&msg=添加成功"); 
?>

Voici deux fonctions pour accéder à la page, js (le saut dans func. php ci-dessus, les fonctions de page sont également implémentées via js).

Copier le code Le code est le suivant :

//js 
function goToPage(url,arg1,arg2) 
{ 
var a = document.getElementById(arg1).value; 
var b = document.getElementById(arg2).value; 
url += &#39;?&#39;+arg1+&#39;=&#39;+a; 
url += &#39;&&#39;+arg2+&#39;=&#39;+b; 
window.location.href=url; 
} 

function goToPage1(url) 
{ 
window.location.href=url; 
}


La fonction de modification et de suppression n'est pas implémentée. Je ne pourrai probablement pas implémenter cela, c'est presque la même chose que d'ajouter des fonctionnalités dans js.

Il existe de nombreuses imitations sur Internet concernant le module de connexion. Soumettez simplement le formulaire, recherchez dans la base de données et renvoyez les résultats. En cas de succès, un cookie est défini et chaque page en arrière-plan est ajoutée avec la fonction de détection des cookies.

Embellissement du front-end
La page index.php exploite d'abord la base de données pour obtenir les éléments de vote et le nombre de votes, puis les affiche (utilisez css+p pour embellir l'interface du cadre ou quelque chose du genre), et enfin cliquez sur le bouton de vote pour soumettre le formulaire et accédez à la page vote.php.

Pour le CSS, je l'ai copié depuis Internet. L'effet que j'ai obtenu est le suivant :

Partage de conception et dimplémentation du système de vote PHP plus MySQL

Cette chose est considérée comme un très petit système de gestion d'informations. J'ai mis le code source de cette chose sur github (https. : //github.com/hanxi/voting) est téléchargé. Vous pouvez le télécharger et le modifier à volonté ou le télécharger depuis Script Home (cliquez pour télécharger). Les lecteurs sont invités à répondre et à communiquer. Cet aspect n'est pas mon point fort, j'ai de nombreux défauts et j'espère que vous pourrez me donner quelques conseils.

Auteur : Han Xi (Blog technologique de Han Xi - Blog Park)
Weibo : t.qq.com/hanxi1203
Source : hanxi.cnblogs.com

Connexe recommandé :

Configuration php Paramètres de démarrage php-fpm et détails de configuration

Résumé du débogage pour les programmeurs PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn