بروزرسانی در تاریخ ۲۱-۰۱-۱۳۹۷ : افزودن سورس کد آموزش
سیستم نظرسنجی آنلاین امروزه برای رای گیری بین یک موضوع خاص یا علایق یا هرچیزی در وب استفاده می شود .سرویس های زیادی این امکان را برای شما فراهم می کنند ولی اگر قصد دارید یک سیستم نظرسنجی توسط PHP را به صورت اختصاصی طراحی کنید ، این آموزش به شما کمک فراوانی خواهد کرد.
در این آموزش بررسی می کنیم که چگونه یک سیستم نظرسنجی توسط PHP و Mysql را بدون استفاده از جی کویری یا جاواسکریپت پیاده سازی کنیم . همچنین ، سیستم نظرسنجی که طراحی می کنیم رای های کاربران را ذخیره می کند . سوال و جواب ها و رای های کاربران در دیتابیس Mysql ذخیره می شوند.
قابلیت های اسکریپت نظرسنجی
رای ها و تنظیمات مربوطه در دیتابیس Mysql ذخیره می شوند . سوالات از طریق دیتابیس خوانده و به کاربر نمایش داده می شوند. یکبار که رای ثبت شد ، پاسخ مربوطه در دیتابیس ذخیره می شود . همچنین ، ما از کوکی های PHP برای جلوگیری از رای های چندین باره توسط کاربر استفاده می کنیم . نتایج نظرسنجی با تعداد کل رای ها و سوالات نمایش داده می شود . نتایج نظرسنجی را به صورت درصد در کنار هر جواب نمایش می دهیم
ساخت جدول
برای ساخت سیستم نظرسنجی در php از سه جدول polls,poll_option و poll_votes استفاده می کنیم.
جدول polls
سوالات ذخیره می کند.
1 2 3 4 5 6 7 8 |
CREATE TABLE `polls` ( `id` int(11) NOT NULL AUTO_INCREMENT, `subject` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, `status` enum('1','0') COLLATE utf8_unicode_ci NOT NULL DEFAULT '1', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; |
جدول poll_options
دارای جواب ها و آی دی است .
1 2 3 4 5 6 7 8 9 10 11 |
CREATE TABLE `poll_options` ( `id` int(11) NOT NULL AUTO_INCREMENT, `poll_id` int(11) NOT NULL, `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, `status` enum('1','0') COLLATE utf8_unicode_ci NOT NULL DEFAULT '1', PRIMARY KEY (`id`), KEY `poll_id` (`poll_id`), CONSTRAINT `poll_options_ibfk_1` FOREIGN KEY (`poll_id`) REFERENCES `polls` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; |
جدول poll_votes
نیز برای ذخیره سازی تعداد رای ها و جواب ها و آی دی استفاده می شود.
1 2 3 4 5 6 7 8 9 10 11 |
CREATE TABLE `poll_votes` ( `id` int(11) NOT NULL AUTO_INCREMENT, `poll_id` int(11) NOT NULL, `poll_option_id` int(11) NOT NULL, `vote_count` bigint(10) NOT NULL, PRIMARY KEY (`id`), KEY `poll_id` (`poll_id`), KEY `poll_option_id` (`poll_option_id`), CONSTRAINT `poll_votes_ibfk_1` FOREIGN KEY (`poll_id`) REFERENCES `polls` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION, CONSTRAINT `poll_votes_ibfk_2` FOREIGN KEY (`poll_option_id`) REFERENCES `poll_options` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; |
برای مثال ما چند مقدار پیش فرض را به جدول اضافه می کنیم
1 2 3 4 5 6 7 8 |
INSERT INTO `polls` (`id`, `subject`, `created`, `modified`, `status`) VALUES (1, 'Which is Your Favorite Website for PHP Programming?', '2016-11-07 04:13:13', '2016-11-07 04:13:13', '1'); INSERT INTO `poll_options` (`id`, `poll_id`, `name`, `created`, `modified`, `status`) VALUES (1, 1, 'CodexWorld', '2016-11-07 11:29:31', '2016-11-07 11:29:31', '1'), (2, 1, 'SitePoint', '2016-11-07 11:29:31', '2016-11-07 11:29:31', '1'), (3, 1, 'Envato Tuts+', '2016-11-07 11:29:31', '2016-11-07 11:29:31', '1'), (4, 1, 'Others', '2016-11-08 08:20:25', '2016-11-08 08:20:25', '1'); |
کلاس Poll
کلاس Poll در سیستم نظرسنجی توسط PHP برای مدیریت تمام درخواست های سیستم رای گیری استفاده می شود.
__construct()
– انتخاب و اتصال به دیتابیسgetQuery()
– اجرای دستور SQL و return کردن داده ها . یک تابع private است که فقط در این کلاس قابل استفاده است.getPolls()
– کشیدن اطلاعات رای گیری و رای هاvote()
– برای insert یا update تعداد رای ها در دیتابیسgetResult()
– نمایش نتیجه رای گیری همراه با جواب ها و تعداد رای ها
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
<?php /* * Poll Management Class * This class is used to manage the online poll & voting system * @author Netparadis.com * @url http://www.Netparadis.com */ class Poll{ private $dbHost = 'localhost'; private $dbUser = 'root'; private $dbPwd = ''; private $dbName = 'poll_system'; private $db = false; private $pollTbl = 'polls'; private $optTbl = 'poll_options'; private $voteTbl = 'poll_votes'; public function __construct(){ if(!$this->db){ // Connect to the database $conn = new mysqli($this->dbHost, $this->dbUser, $this->dbPwd, $this->dbName); if($conn->connect_error){ die("Failed to connect with MySQL: " . $conn->connect_error); }else{ $this->db = $conn; } } } /* * Runs query to the database * @param string SQL * @param string count, single, all */ private function getQuery($sql,$returnType = ''){ $data = ''; $result = $this->db->query($sql); if($result){ switch($returnType){ case 'count': $data = $result->num_rows; break; case 'single': $data = $result->fetch_assoc(); break; default: if($result->num_rows > 0){ while($row = $result->fetch_assoc()){ $data[] = $row; } } } } return !empty($data)?$data:false; } /* * Get polls data * Returns single or multiple poll data with respective options * @param string single, all */ public function getPolls($pollType = 'single'){ $pollData = array(); $sql = "SELECT * FROM ".$this->pollTbl." WHERE status = '1' ORDER BY created DESC"; $pollResult = $this->getQuery($sql, $pollType); if(!empty($pollResult)){ if($pollType == 'single'){ $pollData['poll'] = $pollResult; $sql2 = "SELECT * FROM ".$this->optTbl." WHERE poll_id = ".$pollResult['id']." AND status = '1'"; $optionResult = $this->getQuery($sql2); $pollData['options'] = $optionResult; }else{ $i = 0; foreach($pollResult as $prow){ $pollData[$i]['poll'] = $prow; $sql2 = "SELECT * FROM ".$this->optTbl." WHERE poll_id = ".$prow['id']." AND status = '1'"; $optionResult = $this->getQuery($sql2); $pollData[$i]['options'] = $optionResult; } } } return !empty($pollData)?$pollData:false; } /* * Submit vote * @param array of poll option data */ public function vote($data = array()){ if(!isset($data['poll_id']) || !isset($data['poll_option_id']) || isset($_COOKIE[$data['poll_id']])) { return false; }else{ $sql = "SELECT * FROM ".$this->voteTbl." WHERE poll_id = ".$data['poll_id']." AND poll_option_id = ".$data['poll_option_id']; $preVote = $this->getQuery($sql, 'count'); if($preVote > 0){ $query = "UPDATE ".$this->voteTbl." SET vote_count = vote_count+1 WHERE poll_id = ".$data['poll_id']." AND poll_option_id = ".$data['poll_option_id']; $update = $this->db->query($query); }else{ $query = "INSERT INTO ".$this->voteTbl." (poll_id,poll_option_id,vote_count) VALUES (".$data['poll_id'].",".$data['poll_option_id'].",1)"; $insert = $this->db->query($query); } return true; } } /* * Get poll result * @param poll ID */ public function getResult($pollID){ $resultData = array(); if(!empty($pollID)){ $sql = "SELECT p.subject, SUM(v.vote_count) as total_votes FROM ".$this->voteTbl." as v LEFT JOIN ".$this->pollTbl." as p ON p.id = v.poll_id WHERE poll_id = ".$pollID; $pollResult = $this->getQuery($sql,'single'); if(!empty($pollResult)){ $resultData['poll'] = $pollResult['subject']; $resultData['total_votes'] = $pollResult['total_votes']; $sql2 = "SELECT o.id, o.name, v.vote_count FROM ".$this->optTbl." as o LEFT JOIN ".$this->voteTbl." as v ON v.poll_option_id = o.id WHERE o.poll_id = ".$pollID; $optResult = $this->getQuery($sql2); if(!empty($optResult)){ foreach($optResult as $orow){ $resultData['options'][$orow['name']] = $orow['vote_count']; } } } } return !empty($resultData)?$resultData:false; } } |
برای کپی صحیح و کامل کدها ، دابل کلیک کرده تا وارد محیط سفید و کپی شوید در غیر اینصورت امکان دارد اجرای کدها با مشکل روبرو شود
نمایش فرم نظرسنجی (index.php)
برای انتخاب از یک radio button در کنار هر جواب قرار داده شده است . در پایین یک دکمه submit برای فرستادن رای و یک لینک برای نمایش نتیجه نظرسنجی قرار گرفته است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php //Get poll and options data $pollData = $poll->getPolls(); ?> <div class="pollContent"> <?php echo !empty($statusMsg)?'<p class="stmsg">'.$statusMsg.'</p>':''; ?> <form action="" method="post" name="pollFrm"> <h3><?php echo $pollData['poll']['subject']; ?></h3> <ul> <?php foreach($pollData['options'] as $opt){ echo '<li><input type="radio" name="voteOpt" value="'.$opt['id'].'" >'.$opt['name'].'</li>'; } ?> </ul> <input type="hidden" name="pollID" value="<?php echo $pollData['poll']['id']; ?>"> <input type="submit" name="voteSubmit" class="button" value="Vote"> <a href="results.php?pollID=<?php echo $pollData['poll']['id']; ?>">Results</a> </form> </div> |
بار اول که جواب مورد نظر کاربر ارسال شد ، رای توسط کلاس Poll
در دیتابیس ذخیره میشود . همچنین ، کوکی مورد نظر برای شناسایی کاربر ذخیره و وضعیت به کاربر نمایش داده می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php //Include and initialize Poll class include 'Poll.php'; $poll = new Poll; //Check whether vote is submitted if(isset($_POST['voteSubmit'])){ $voteData = array( 'poll_id' => $_POST['pollID'], 'poll_option_id' => $_POST['voteOpt'] ); //Submit vote by Poll class $voteSubmit = $poll->vote($voteData); if($voteSubmit){ //store in $_COOKIE to signify the user has voted setcookie($_POST['pollID'], 1, time()+60*60*24*365); $statusMsg = 'Your vote has been submitted successfully.'; }else{ $statusMsg = 'Your vote already had submitted.'; } } ?> |
نتیجه نظرسنجی (results.php)
در این فایل ، نتایج نظرسنجی از دیتابیس خوانده و با جزییات به کاربر نمایش داده میشود . همچنین تعداد رای ها برای هر جواب به صورت درصد در یک نوار درصد کنار هر جواب نمایان می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
<?php //Include and initialize Poll class include 'Poll.php'; $poll = new Poll; ?> <?php //Get poll result data $pollResult = $poll->getResult($_GET['pollID']); ?> <h3><?php echo $pollResult['poll']; ?></h3> <p><b>Total Votes:</b> <?php echo $pollResult['total_votes']; ?></p> <?php if(!empty($pollResult['options'])){ $i=0; //Option bar color class array $barColorArr = array('azure','emerald','violet','yellow','red'); //Generate option bars with votes count foreach($pollResult['options'] as $opt=>$vote){ //Calculate vote percent $votePercent = round(($vote/$pollResult['total_votes'])*100); $votePercent = !empty($votePercent)?$votePercent.'%':'0%'; //Define bar color class if(!array_key_exists($i, $barColorArr)){ $i=0; } $barColor = $barColorArr[$i]; ?> <div class="bar-main-container <?php echo $barColor; ?>"> <div class="txt"><?php echo $opt; ?></div> <div class="wrap"> <div class="bar-percentage"><?php echo $votePercent; ?></div> <div class="bar-container"> <div class="bar" style="width: <?php echo $votePercent; ?>;"></div> </div> </div> </div> <?php $i++; } } ?> <a href="index.php">Back To Poll</a> |
کد CSS
در فایل index.php ، css زیر برای استایل دهی به سوال و جواب ها استفاده شده است .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
.pollContent{ float: left; width: 500px; } .pollContent h3 { font-size: 18px; color: #333; text-align: left; float: left; border-bottom: 2px solid #333; width: 100%; margin: 0 auto; padding-bottom: 10px; } .pollContent ul{ list-style: none; float: left; width: 100%; padding: 10px; } .pollContent input[type="submit"], .pollContent a{ border: none; font-size: 16px; color: #fff; border-radius: 3px; padding: 10px 15px 10px 15px; background-color: #34a853; text-decoration: none; cursor: pointer; } |
و استایل های فایل results.php به اینصورت است :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
#container { text-align: center; margin: 20px; } h2 { color: #CCC; } a { text-decoration: none; color: #EC5C93; } .bar-main-container { margin: 10px auto; width: 300px; height: 55px; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; font-family: sans-serif; font-weight: normal; font-size: 0.8em; color: #FFF; } .wrap { padding: 8px; } .bar-percentage { float: left; background: rgba(0,0,0,0.13); -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; padding: 9px 0px; width: 18%; height: 16px; margin-top: -15px; } .bar-container { float: right; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px; height: 10px; background: rgba(0,0,0,0.13); width: 78%; margin: 0px 0px; overflow: hidden; } .bar-main-container .txt{ padding-top: 5px; font-size: 16px; font-weight: bold; } .bar { float: left; background: #FFF; height: 100%; -webkit-border-radius: 10px 0px 0px 10px; -moz-border-radius: 10px 0px 0px 10px; border-radius: 10px 0px 0px 10px; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter: alpha(opacity=100); -moz-opacity: 1; -khtml-opacity: 1; opacity: 1; } /* COLORS */ .azure { background: #38B1CC; } .emerald { background: #2CB299; } .violet { background: #8E5D9F; } .yellow { background: #EFC32F; } .red { background: #E44C41; } |
جمع بندی
در آموزش ” ساخت سیستم نظرسنجی توسط PHP و Mysql” سعی کردیم به شما مراحل ساخت یک سیستم نظرسنجی آنلاین و ساده را همراه با کد ها به شما نشان بدیم. .
در کل این آموزش به شما نحوه ساخت همچین فرم های نظرسنجی به طور کامل نشان میدهد . برای امنیت بیشتر فرم و جلوگیری از تقلب کاربران می توانید در کنار استفاده از کوکی ها ، از IP استفاده کنید .
امیدوارم این کد را توسعه بدید و در پروژه هایی که می نویسید ازش بهره ببرید .
برای دانلود سورس کد کامل این پروژه از باکس دانلود استفاده کنید.
موفق باشید
سلام وقتتون بخیر اسم جدول رو چی بزاریم . من هر اسمی در دیتابیس میزارم و با private $dbName ست میکنم به این ارور
Fatal error: Uncaught Error: Call to undefined function mysql_connect() in C:\xampp\htdocs\iran\poll\include\database.php:3 Stack trace: #0 C:\xampp\htdocs\iran\index.php(15): include() #1 {main} thrown in C:\xampp\htdocs\iran\poll\include\database.php on line3
برخورد میکنم
ممنون میشم راهنماییم کنید
با تشکر
سلام ممنون
خطا مربوط به نام دیتابیس نیست و تابع mysql_connect هست که این تابع در ورژن های ۷ php حذف شده لطفا آموزش زیر را ببینید و mysql رو به mysqli تبدیل کنید تا مشکل رفع بشه
استفاده از MySQLi به جای MySQL در PHP
سلام خسته نباشید ؛ ببخشید کد ها ارور دارن میشه توضیح بدید
Fatal error: Uncaught Error: [] operator not supported for strings in D:\xampp\htdocs\project\پروژه\nazar_sangy\Poll.php:49 Stack trace: #0 D:\xampp\htdocs\project\پروژه\nazar_sangy\Poll.php(70): Poll->getQuery(‘SELECT * FROM p…’) #1 D:\xampp\htdocs\project\پروژه\nazar_sangy\index.php(7): Poll->getPolls() #2 {main} thrown in D:\xampp\htdocs\project\پروژه\nazar_sangy\Poll.php on line 49
ارور از اینی اولی
while($row = $result->fetch_assoc()){
$data[] = $row;
ارور از اینی اولی ( $data[] = $row;) اینو حذف میکنم از کد ؛ ارور بعدی اینو به ما میگه
ارور بعدی اینه
Warning: foreach() argument must be of type array|object, bool given in D:\xampp\htdocs\project\پروژه\nazar_sangy\index.php on line 37
میشه محبت کنید اصلاحش کنید بدید ممنون میشم,
سلام ممنون.
کدها هیچ مشکلی ندارندو محیط اجراتون مشکل داره.
این خطا مروبوط به اینه که ورژن php شما پایینه. xampp با ورژن ۵٫۶ یا ۷ به بالا نصب کنید
سلام
خیلی آموزش خوبی بود و منم تو سایتم ازش استفاده کردم
ولی یه مشکل داره اونم اینه که تو هر صفحه جداگانه فقط یه نظر سنجی میشه گذاشت اگه دوتا نظرسنجی بسازی بازم فقط اولی اجرا میشه و دومی کلا انگار وجود نداره و با حلقه ها هم نمیشه بیشتر از یک بار نظر سنجی رو اجرا کرد
اگه ممکنه یکم راهنمایی کنید لطفا
ممنون
سلام. خوشحالیم که مفید واقع شده.
در صفحه index.php مقدار $pollData را var_dump کنید تا ببینید چندتا نظرسنجی از دیتابیس خوانده شده.
همچنین دقت کنید که نظرسنجی های که status=1 را دارند برگشت داده می شوند که در کلاس Poll این مورد را در متدgetPolls و getQuery می توانید ببینید و ویرایش کنید
موفق باشید.
سلام ببخشید دنلود باکس کجاست؟
سلام. زیر همین پست و بالای بخش نظرات
داداش دمت گرم!آموزش عالی بود!ولی بهتر نبود سورس این آموزشم میزاشتی!کمی سردرگم شدم!
سلام . خوشحالم که مفید واقع شده . سورس کد این آموزش هم قرار داده شد که از بخش دانلود باکس می تونید دریافت کنید.
موفق و پیروز باشید.
خیلی مچکرم از پیگیریتون!خسته نباشید،خداقوت!❤️💛