PHP+MySQL 投票システムの設計と実装の共有_PHP チュートリアル

WBOY
リリース: 2016-07-21 15:16:12
オリジナル
1209 人が閲覧しました

システムは大きくありませんが、このシステムを完成させるプロセスを 3 つのステップに分けました
•データベース設計
•システムフレームワーク設計
•フロントエンドの美化

データベース設計
投票結果統計テーブル (count_voting) の 3 つのテーブルを設計します。 、投票者レコード テーブル (ip_votes)、ユーザー テーブル (user)
投票結果統計テーブルは、最終的な投票レコードをカウントするために使用されます。投票された項目の名前 (SelectName)、投票された項目のラベル名です。投票済みアイテム (LabelName) ) (分類の役割を果たす)、投票数 (CountVotes)。

投票者記録テーブルは、投票者の 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 コメント '投票者の場所'、
`VoteTime` datetime NOT NULL、
`SelectName` varchar(40) NOT NULL、
主キー (`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 TRI GGER `挿入後の投票数_ tr` AFTER INSERT ON `ip_votes `
各行ごとに 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 コメント '管理者ユーザー名',
`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

スクリプトからわかるように、 , データが ip_votes テーブルに挿入されたときに、count_voting テーブルの CountVotes フィールドに 1 を追加するトリガーを作成しました。最後の文は外部関連語を設定するためにも使用できます。
フレームワーク設計
OperatorDB クラスはデータベースの操作に使用され、OperatorVotingDB クラスはシステム固有の一連の操作に使用されます。
PDO を使用してデータベースを操作します。簡単にカプセル化してみましょう:

コードをコピーします コードは次のとおりです:

/**
* 操作データベース
* PDO をカプセル化して独自の操作に便利にする
*/
class OperatorDB
{
//データベースに接続するための基本情報
private $dbms='mysql' // データベースの種類。開発者が別のデータベースを使用している場合は、変更するだけです。これ。
private $host='localhost'; //データベースホスト名
private $dbName='voting'; //データベース接続ユーザー名
private $passwd= 'voting '; //対応するパスワード
private $pdo=null;
public function __construct()
//dl("php_pdo_mysql.dll"); ;dsn="$this->dbms:host=$this->host;dbname=$this->dbName";
試してください
{
$this->conn=new PDO($this -> dsn,$this->user,$this->passwd);//PDO オブジェクトの初期化とは、データベース接続オブジェクトの作成を意味します $db
}
catch(PDOException $e)
{
die("
データベース接続に失敗しました (作成者 PDO エラー!): ".$e->getMessage()."
");
}
}
public function __destruct()
{
$this-> ;pdo = null;
}
public function exec($sql)
{
}
public function query($sql)
{
}
}


その後の操作を容易にするためにデータベース接続情報をカプセル化します。


コードをコピーします
コードは次のとおりです: require_once 'OperatorDB.php';
class OperatorVotingDB
{
public function __construct()
{
$ this-& gt; odb = new OperatorDB();
}
パブリック関数 __destruct()
{
$this->odb = null;
/**
* 投票データ内のすべてのテーブルをクリアします
*
* データベース操作クラスを呼び出して、データベースのクリア操作を実行します
*/
パブリック関数 clearTables() {
$sqls = array("TRUNCATE ip_votes;","TRUNCATE count_voting;");
$this->odb->e​​xec($sqls[0]); ($sqls[1 ]);
}
/**
* count_voting テーブルの CountValues フィールドを 0 にリセットします
*
*/
パブリック関数resetCountValues()
{
$sql = "UPDATE count_voting SET CountVotes = 0;"; ;exec($sql );
}
/**
* 投票
* ip_votes テーブルに情報を書き込みます
* @param type $ip
* @param type $loc
* @param type $time
* @param type $name
*/
public function vote($ip,$loc,$name)
{
$sql = "ip_votes 値に挿入 (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 の計算を使用します
// echo $time."
"
// echo $row[0][0]< 1)/ /テーブル内の最大時間を現在の時刻と比較します $time
{
echo "投票は失敗しました。同じ IP は別の日に投票する必要があります"
return;
}
// echo $sql; ;
echo "投票は成功しました! ";
$this->odb->e​​xec($sql);
/**
* SelectName フィールドの行を追加します
*
* @param string $name
* @param string $label
* @param int $count
*/
public function addSelectName($name, $label, $ count=0)
{
$sql = "count_voting VALUES ('$name', '$label', $count);"
$this->odb->e​​xec($sql);
/**
* 総投票数を取得し、結果を投票数で並べ替えます
*
* CountVotes フィールドで並べ替え、count_voting テーブルを返します
*
* @param int $n
*
*/
public function getVotesSortByCount($n=-1)
{
$sql = "SELECT * FROM count_voting ORDER BY CountVotes DESC LIMIT 0 , $n;"; $n)
{
$sql = "SELECT * FROM count_voting ORDER BY CountVotes;";
}
// 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; query($sql);
}
}
?>


以下にも必要な関数があります



コードは次のとおりです:

/**
* ページジャンプ機能
* jsで実装
* @param string $url
*/
function goToPgae($url)
{
echo "";
}
function jsFunc($fun, $arg=null)
{
echo "";
}
function jsFunc3($fun, $arg1=null,$arg2=null,$arg3=null)
{
echo "";
//echo $fun."('$arg1','$arg2','$arg3');";
}
関数 isLoginNow()
{
if ($_COOKIE["user"]=='')
{
return false;
}
true を返します。
}
関数 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"];
}
}
$ip を返します。
}
//从123查获取ip
function getIpfrom123cha($ip) {
$url = 'http://www.123cha.com/ip/?q='.$ip;
$content = file_get_contents($url);
$preg = '/(?<=本站主データ:
  • )(.*)(?=
  • )/isU ';
    preg_match_all($preg, $content, $mb);
    $str = ストリップタグ($mb[0][0]);
    //$str = str_replace(' ', '', $str);
    $アドレス = $str;
    if($address == '') {
    $address = '未明';
    }
    $address を返します。
    }
    //从百度获取ip所在地
    function getIpfromBaidu($ip) {
    $url = 'http://www.baidu.com/s?wd='.$ip;
    $content = file_get_contents($url);
    $preg = '/(?<=

    )(.*)(?=

    )/isU';
    preg_match_all($preg, $content, $mb);
    $str = ストリップタグ($mb[0][1]);
    $str = str_replace(' ', '', $str);
    $address = substr($str, 7);
    if($address == '') {
    $address = '未明';
    }
    $address を返します。
    }
    ?>その後、後台管理者の操作が検討され、主に投票機能の追加が行われ、データベースの操作が完了しました。以下の通り:


    复制代
    代码如下: function addVote()
    {
    right.innerHTML="

    追加投票项

    ";
    right.innerHTML+="


    清空投票项也差不多,下过如下:image

    投票ページの追加は、url 経由で add.php ページに転送されます。

    require_once '../api/func.php';

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

    $name = $ _GET["cSelectName"];
    $label = $_GET["cLabelName"];
    //echo $name."
    ".$label;
    require_once '../api/OperatorVotingDB'; $ovdb=new OperatorVotingDB();
    $ovdb->addSelectName($name,$label);
    goToPgae("./admin.php?page=add&auto=".") $label"."&id=cLabelName&foc=cSelectName&msg=正常に追加されました");
    ?>


    以下は、ページにジャンプする 2 つの関数、js です (上記の func.php のページジャンプ関数も js を通じて実装されています)の)。


    コードをコピーします コードは次のとおりです:
    //js
    function goToPage(url,arg1,arg2)
    {
    var a = document.getElementById(arg1).value;
    var b = document; .getElementById(arg2).value;
    url += '?'+arg1+'='+b;
    window.location.href=url;
    function goToPage1 (url)
    {
    window.location.href=url;
    }


    変更・削除機能はまだ実装されていません。おそらく実装はできないでしょう。jsに関数を追加するのとほぼ同じです。

    インターネット上にはログインモジュールの模倣品が多数存在します。フォームを送信し、データベースを検索して結果を返すだけです。成功するとCookieが設定され、バックグラウンドの各ページにCookieを検出する機能が追加されます。
    フロントエンドの美化
    index.phpページはまずデータベースを操作して投票項目と投票数を取得し、表示します(css+divでフレームインターフェースを美化します)最後に投票ボタンをクリックしてフォームを送信します。 vote.php ページにジャンプします。

    cssについては、インターネットからコピーします。得られた効果は以下の通りです



    これは非常に小さな情報管理システムと見なすことができます。このもののソースコードは github (https://github.com/hanxi/voting) にあります。ダウンロードして自由に変更できます。それをスクリプトに追加します (クリックしてダウンロードします)。読者の皆様は、ぜひ返信してコミュニケーションをとってください。私には欠点がたくさんあるので、アドバイスをいただければ幸いです。

    著者: Han Xi (Han Xi のテクノロジーブログ - ブログパーク)

    Weibo: t.qq.com/hanxi1203 image出典: hanxi.cnblogs.com




    http://www.bkjia.com/PHPjc/325961.html
    www.bkjia.com

    tru​​ehttp://www.bkjia.com/PHPjc/325961.html技術記事システムはそれほど大きくありません。このシステムを完成させるプロセスを、データベース設計、システム フレームワーク設計、フロントエンド美化、データベース設計、および 3 つのテーブル (投票結果統計テーブル (count_vo...)) に分けました。
    ソース:php.cn
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    最新の問題
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート