السلام عليكم
ارى ان الكثير يسئل عن عمل نظام تصويت
فقمت ببرمجة نظام تصويت
لكتابت هذا الدرس لعله يفيدكم.
سوف اقوم بتبسيط الطريقة حتى يسهل فهمها وطبعا بعدها نضيف اى شىء
وسوف يتم شرح عمل نظام تصويت متكامل php +mysql
نبدأ بأسم الله
اولا
فلننشأ جدول في قاعدة البيانات لتخزين التصويت
كود PHP:
CREATE TABLE `pool` (
`poolid` int(10) unsigned NOT NULL auto_increment,
`by_user` varchar(100) NOT NULL default '',
`question` varchar(100) NOT NULL default '',
`answers` text NOT NULL,
`vote_number` text NOT NULL,
`start_date` int(14) NOT NULL default '0',
PRIMARY KEY (`poolid`)
);
العامود الاول poolid لتخزين ايد التصويت لسهولة جلبه والتعامل مع التصويت الخ..
وجلعنا نوعه int لتخزين الاعداد الصحيحه و atuo_increment لنجعل قيمته تكراريه.
العامود by_user لتخزين اسم الذى اضاف التصويت.
العامود question لتخزين سؤال التصويت.
العامود answers وقد جلعنا نوعه text لاننا سوف نخزن جميع اجوبة السؤال للتصويت وسوف نفصلها بأي علامه.
العامودvote_number وقد جلعنا نوعه text لاننا سوف نخزن عدد الاصوات لكل جواب وسوف نفصلها بأي علامه.
العامود start_date لتخزين تاريخ ووقت اضافة التصويت
وجلعنا نوعه int لتخزين التاريخ والوقت عن طريق دالة الـphp الدالة time();
واخيرا PRIMARY KEY (`poolid` المفتاح الاساسي العامود poolid
والان فلننشأ ملف جديد
ونسميه pool.php
وطبعا اولا سوف نحتاج للاتصال بقاعدة البيانات
ولا اظن انه يخفي على احدكم هذا
كود PHP:
mysql_connect("localhost","user","1234");
mysql_select_db("test");
طبعا مع وضع التعديلات بما يناسبك
والان سوف نعمل فورم للمستخدم
لادخال عدد الاجوبه التى يريدها للتصويت
وطبعا نستطيع عمل هذه في نفس الفورم الذى به السؤال
لاكن لتوضيح الطريقه وحتى يسهل فهمها
كود PHP:
if ($_GET['poolgo']=="showtools") {
echo '<form action="poll.php?poolgo=last" method="POST">';
echo '<br><td><br>عدد الأجوبة <input type="text" name="numvote" size="2" maxlength="2" tabindex="1" value="4"></td>';
echo '<br><input type="submit" value="ارسال">
<input type=reset name=reset value="إعادة تعيين"> </form>';
}
فائدة
if ($_GET['poolgo']=="showtools")
بهذا سوف نختصر على نفسنا الكثير
بدل عمل كل خطوه في ملف
سوف نعمل كل الخطوات بملف واحد
وطريقة عمله
التأكد من العنوان
مثلا اذا كان
poll.php?poolgo=showtools
ينفذ الخطوه هذه
اما
poll.php?poolgo=ttt
ينفذ الخطوه ttt
وهكذا
بالنسبه
echo '<form action="poll.php?poolgo=last" method="POST">';
poll.php?poolgo=last
هنا حدد الخطوه التى سيذهب لها بعد هذه
method="POST"
هنا حددنا الطريقة وهي POST
وكما يمكننا استخدام ال GET
لاخذ المتغيرات ولاخذها من العنوان الى الخطوه التى تليها
echo '<br><td><br>عدد الأجوبة <input type="text" name="numvote" size="2" maxlength="2" tabindex="1" value="4"></td>';
هنا عملنا مربع ليستطيع تحديد عدد الاجوبه التي يرديها للتصويت
value="4"
وحددنا القيمة التى ستظهر في المربع تلقائيا وهي 4
واسم هذا المربع
numvote
echo '<br><input type="submit" value="ارسال">
<input type=reset name=reset value="إعادة تعيين"> </form>';
وهذا طبعا لعمل ارسال للمتغيرات والانتقال للخطوة التى تليها
ووضع نهاية للفورم
---
والان الخطوه الثانيه
كود PHP:
if ($_GET['poolgo']=="last") {
echo '<form action="poll.php?poolgo=add" method="POST">';
echo '<tr><td>اسمك : <input type="text" name="name" size="35"></td></tr>';
echo '<tr><td>السؤال : <input type="text" name="question" size="35"></td></tr>';
for($i=1; $i<=$_POST['numvote']; $i++) {
echo '<br><tr>
<td><b>الجوابالـ'.$i.'
:</b></td>
<td><input type="text" name="answers[]" size="40" maxlength="85" tabindex="1"></td>
</tr>
<input type="hidden" value="0" name="number_vote[]">
<br>';
}
echo '<br><input type="submit" value="ارسال">
<input type=reset name=reset value="إعادة تعيين"> </form>';
}
if ($_GET['poolgo']=="last")
شرحت عمله سابقا
echo '<form action="poll.php?poolgo=add" method="POST">';
شرحت عمله سابقا
echo '<tr><td>اسمك : <input type="text" name="name" size="35"></td></tr>';
نضع مربع لاسم من وضع التصويت
واسمه
name
echo '<tr><td>السؤال : <input type="text" name="question" size="35"></td></tr>';
نضع مربع للسؤال
واسمه
question
والان عن طريق الدالة for();
نعمل تكرار
للاجوبة
for($i=1; $i<=$_POST['numvote']; $i++) {
نحدد قيمة المتغير
$i=1
بانه يساوي واحد
$i<=$_POST['numvote'];
وبأن
المتغير $i اصغر من او يساوي عدد الاجوبة التى حددها المستخدم $_POST['numvote']
ولو نلاحظ ان numvote هو اسم المربع الذى وضعناه لتحديد عدد الاجوبة
وقد جلبناه بال $_POST
واخيرا
$i++
عمل تكرار للمتغير $i
وفي الدالة for
نضع الاجواب حتى يتكرر
echo '<br><tr>
<td><b>الجوابالـ'.$i.'
:</b></td>
<td><input type="text" name="answers[]" size="40" maxlength="85" tabindex="1"></td>
</tr>
<input type="hidden" value="0" name="number_vote[]">
<br>';
<input type="text" name="answers[]" size="40" maxlength="85" tabindex="1">
لنلاحظ ان وضعنا اسم هذا المربع
answers[]
والان مافائدة
[]
لكي يتعرف الphp عليه على انه مصفوفه
لانه يحتوي على اكثر من جواب .
<input type="hidden" value="0" name="number_vote[]">
type="hidden"
وهنا وضعنا معلومه خفيه
لانه المستخدم لايستطيع ان يراها او يعدل عليها
ونلاحظ ايظا ان اسمه
number_vote[]
حتى يتعرف عليه كمصفوفه
ووضعناه في الدالة for();
مع الجواب
حتى يتكرر عدد التصويتات لكل جواب
فيكون
مساوي للعدد الاجوبة
ولاحظنا ان حددنا قيمته
value="0"
تساوي صفر
حتى يكون عدد التصويتات لكل جواب
يساوي صفر
echo '<br><input type="submit" value="ارسال">
<input type=reset name=reset value="إعادة تعيين"> </form>';
وهذا طبعا لعمل ارسال للمتغيرات والانتقال للخطوة التى تليها
ووضع نهاية للفورم
-----
والان الخطوه الثالثه
كود PHP:
if ($_GET['poolgo']=="add") {
$answers=implode("|||", $_POST['answers']);
$number_vote=implode("|||", $_POST['number_vote']);
mysql_query("insert into pool
(poolid,by_user,question,answers,vote_number,start_date)
VALUES (null,'$_POST[name]','$_POST[question]','$answers','$number_vote',". time().")");
}
if ($_GET['poolgo']=="add")
تم شرحه مسبقا
$answers=implode("|||", $_POST['answers']);
عن طريق الدالة implode();
نفصل الاجوبة(عناصر المصفوفة) عن بعض بعلامة |||
للمزيد حول الدالة
implode();
http://php.net/implode
$number_vote=implode("|||", $_POST['number_vote']);
وايظا بنفس الطريقة نفصل عدد التصويتات لكل جواب
mysql_query("insert into pool
(poolid,by_user,question,answers,vote_number,start_date)
VALUES (null,'$_POST[name]','$_POST[question]','$answers','$number_vote',". time().")");
والان نضيف المعلومات الى قاعدة البيانات
عن طريق الدالة mysql_query
نلاحظ انا جلعنا القيمة التى تخزن بالعامود poolid
هي null
لاكن سوف ايد للتصويت
يعني اخر ايد لتصويت
زائد واحد
حسب الخصائص التى منحناه اياها عند اضافة الجدول
وايظا جلعنا القيمة التى تخزن بالعامود start_date
هي الدالة
". time()."
وعلمها
اضافة عدد الثواني منذ بداية عصر اليونيكس
اى منذ 1/1/1970 والساعه الثانية عشر
للمزيد حول هذه الدالة
http://php.net/time
ومابقى اظنه واضح.
-------
الخطوه الرابعه
عرض التصويت
كود PHP:
if ($_GET['poolgo']=="pool") {
$ballot=mysql_query("select * from pool
order by poolid DESC limit 1");
$vbulletinarab = mysql_fetch_array($ballot);
echo '<form action="poll.php?poolgo=addvote" method="POST">';
echo '<input type="hidden" value="'.$vbulletinarab[poolid].'" name="poolid">';
$answers = explode("|||", $vbulletinarab['answers']);
$number_vote = explode("|||", $vbulletinarab['vote_number']);
echo $vbulletinarab['question']."<br>";
foreach ($answers as $showanswers => $answersvalue) {
@$vote_percent=$number_vote[$showanswers]/array_sum($number_vote);
$percent=sprintf("%.2f%%", ($vote_percent * 100));
echo '<input type="radio" value="'.$showanswers.'" name="showanswers"><tr><td class="tdgold2" width="70%">'.$answersvalue .' '.$percent.'</td>
<td class="tdgold2" width="30%"> عدد الاصوات :'. $number_vote[$showanswers].'</td>';
}
echo $vbulletinarab['quizzing']."<br>";
echo '<br><input type="submit" value="ارسال">
<input type=reset name=reset value="إعادة تعيين"> </form>';
}
اغلب مافي هذه الخطوه تم شرحه مسبقا
@$vote_percent=$number_vote[$showanswers]/array_sum($number_vote);
$percent=sprintf("%.2f%%", ($vote_percent * 100));
قمنا هنا بتقسيم عدد اصوات كل جواب على المجموع الكلي للاصوات
وعن طريق الداله sprintf();
قمنا باظهار النسبة المئوية
لكل جواب.
-------
الخطوه الخامسه
اضافة صوت
كود PHP:
if ($_GET['poolgo']=="addvote") {
$poolid=$_POST['poolid'];
$showanswers=$_POST['showanswers'];
$ballot=mysql_query("select * from pool
where poolid='$poolid'");
$vbulletinarab = mysql_fetch_array($ballot);
$number_votes = explode("|||", $vbulletinarab['vote_number']);
if (array_key_exists($showanswers, $number_votes)) {
$number_votes[$showanswers]=($number_votes[$showanswers])+(1);
}
$number_vote=implode("|||", $number_votes);
$addballot=mysql_query("update pool set vote_number='$number_vote' where poolid='$poolid'")Or Die(Mysql_error());
}
نعمل استعلام يجلب فيه التصويت المراد
وبنفس الطريقه التى تم شرحها مسبقا
ولاضافة واحد الى الاجابه التى حددها المستخدم
ومن ثم عمل update
وعمل الزيادة بعدد الاصوات انتهى.
لعرض التصويت
poll.php?poolgo=pool
لاضافة تصويت
poll.php?poolgo=showtools
وملف العمل الذى قمنا به بالمرفق.
والسلام عليكم
all-the-vb
http://vbulletin-arab.com