در قسمت های قبل ما ظاهر نظر سنجی را تغییر دادیم  و همچنین قسمت درخواست های ایجکس رو طراحی کردیم . دراین قسمت هم  قصد داریم که کد های PHP رو بنویسیم  تا این اسکریپت ما تکمیل و قابل استفاده باشه،البته گزینه های دیگه ای هم میشه بهش اضافه کرد که اون رو بعدا توی اموزش های دیگه توضیح میدیم،پس با ما همراه باشید.
بررسی درخواست کاربر

خوب ما توی فایل php که درخواست های ای جکس کاربر رو بررسی میکنه و پردازش مناسب رو انجام میده، اول از همه نوع درخواست رو مشخص میکنیم.

۱    require_once ‘config/database.php’;
۲    if( isset($_POST[‘action’])&& $_POST[‘action’]==’vote’ )
۳    {
۴    $ans=$_POST[‘answer’];
۵    $q_id=$_POST[‘question_id’];
۶    if(!validate_user($q_id))
۷    {
۸    echo ‘شما قبلا رای خود را برای این نظرسنجی ثبت کرده اید.’;
۹    die();
۱۰    }
۱۱    new_vote($ans,$q_id);
۱۲    }
۱۳    elseif(isset($_POST[‘action’]) && $_POST[‘action’]==’result’ )
۱۴    {
۱۵    $q_id=$_POST[‘question_id’];
۱۶    show_results($q_id);
۱۷    }

خوب من راحع به فایل دیتابیس که require شده توضیح نمیدم دیگه،قسمت اول چک میکنیم مقدار action ست شده و هم چنین مقدار این action برابر vote هست یا نه که اگه شرط برقرار باشه مقادیر لازم رو توی متغییر هایی ذخیره میکنیم و اونارو به یه تابع میفرستیم تا پردازش لازم برای رای جدید انجام بش،اما قبلش لازمه که کاربر اعتبار سنجی بشه که قبلا رای داده یا نه،پس با تابع validate_user این کارو انجام میدیم و اگه ااگه مشکلی نبود پس تابع new_vote اجار میشه و رای کاربر ثبت میشه،و اگه مقدار action برابر result بود یعنی کاربر درخواست نمایش نتایج رو داده پس باید تابع show_results رو با پارامترهای مناسب فراخوانی کنیم.

تابع اعتبار سنجی کاربر
۱    function validate_user($q_id)
۲    {
۳    global $db;
۴    $ip=get_user_ip();
۵    $user_ip=ip2long($ip);
۶    $sql=”SELECT * FROM polls WHERE q_id='{$q_id}’ AND ip='{$user_ip}’ LIMIT 1″;
۷    $result=$db->query($sql);
۸    if($db->num_rows($result)==1)
۹    {
۱۰    return false;
۱۱    }
۱۲    else
۱۳    {
۱۴    return true;
۱۵    }
۱۶    }

تابع اعتبار سنجی کاربر ما به این طوره که اول با یه تابع دیگه ip کاربر رو میگیرم،بعدشم این ip رو توسط تابع ip2long به یه عدد متناظر اون ip تبدیل میکنیم،بعدشم یه کوئری میگیرم ببینیم این ip قبلا برای این نظر سنجی ثبت شده یا نه اگه سطری برگردونده بشه یعنی ثبت شده پس کاربر مجاز نیست،اگر نباشه که یعنی کاربر مجازه رای بده.

تابع دریافت ip کاربر
۱    function get_user_ip()
۲    {
۳    //Test if it is a shared client
۴    if (!empty($_SERVER[‘HTTP_CLIENT_IP’])){
۵    $ip=$_SERVER[‘HTTP_CLIENT_IP’];
۶    //Is it a proxy address
۷    }elseif (!empty($_SERVER[‘HTTP_X_FORWARDED_FOR’])){
۸    $ip=$_SERVER[‘HTTP_X_FORWARDED_FOR’];
۹    }else{
۱۰    $ip=$_SERVER[‘REMOTE_ADDR’];
۱۱    }
۱۲    return $ip ;
۱۳    }

تابع ثبت رای جدید
۱    function new_vote($ans,$q_id)
۲    {
۳    global $db;
۴    $ip=ip2long($_SERVER[‘REMOTE_ADDR’]);
۵    $db->connect();
۶    $sql=”UPDATE answers SET number=number + 1 WHERE id={$ans}”;
۷    $db->query($sql);
۸    $sql=”INSERT INTO polls (q_id,ip) VALUES(‘{$q_id}’,'{$ip}’)”;
۹    $db->query($sql);
۱۰    show_results($q_id);
۱۱    }

توی این تابع که متغییر های لازم (شماره جواب و شماره سوال) رو براش ارسال میکنیم،اول ip کاربر رو تبدیل و بعد توی متغییر میریزیم،و بعدش با یه کوئری ساده مقدار جواب مورد نظر رو یکی افزایش میدیم،و بعدشم یه کوئری دیگه که ip کاربر رو ثبت میکنیم،آخرشم تابع show_results رو اجرا میکنیم تا نتایج به کاربر نشون داده بشه.

تابع نمایش نتایج
۱    function show_results($q_id)
۲    {
۳    global $db;
۴    $sql=”SELECT SUM(number) as total FROM answers WHERE q_id='{$q_id}'”;
۵    $result=$db->query($sql);
۶    $total=$db->get_row($result);
۷    $total=(int)$total[0];
۸    $sql=”SELECT * FROM answers WHERE q_id='{$q_id}'”;
۹    $result=$db->query($sql);
۱۰    $output=”;
۱۱    while ($row=$db->fetch_array($result)):
۱۲    $percent=get_percent((int)$row[‘number’],$total);
۱۳    $output.=$row[‘title’].’ – ‘.$percent.’ % با ‘.$row[‘number’].’ ارسال’.'<p><span data-width=”‘.$percent.'”></span></p>’;
۱۴    endwhile;
۱۵    $output.='<p>تعداد کل شرکت کنندگان: ‘.$total.'</p>’;
۱۶    $db->disconnect();
۱۷    echo $output;
۱۸    die();
۱۹    }

خوب توی تابع نمایش نتایج، ما فقط شناسه سوال رو نیاز داریم که براش ارسال کنیم،اولش یه کوئری نوشتیم که تعداد کل رای های این نظر سنجی رو دریافت میکنیم،بعدشم یه کوئر زدیم و تمام سطر های متناظر با شناسهسوال رو دریافت کردیم،حالا باید یه خروجی تولید کنیم (خروجی از نوع HTML – قابل توجه دوستانی که به این کد برای درخواست های ای جکس خودشون نیاز دارن)،خوب یه حلقه تشکیل دادیم که والش درصد هر گرینه رو با تعداد رای های اون گزینه نسبت که تعداد کل رای ها دریافت کردیم،بعدشم توی رشته عنصار مورد نظر HTML خودمون رو نوشتیم و با متغییر های php مقادیر مورد نیاز رو داخل قرار دادیم.

متغییر row با ایندکس title عنوان گزینه روب رای ما میگیره.
متغییر percent درصد هر گزینه رو برای ما نشون میده.
متغییر row با ایندکس number تعداد هر گزینه رو برای ما نشون میده.
ما متغییر percent رو بازم استفاده کردیم و داخل خصوصیت data-width عنصر span قرار دادیم.
خوب بعد از حلقه هم مقدار total رو که داخل یه عنصر p اضافه کردیم و در نهایت هم مقدار این متغییر رو برگردوندیم،تا داخل مقدار data در درخواست ای جکس دریافت بشه و داخل صفحه نشون داده بشه.

تابع محاسبه درصد

۱    function get_percent($value,$total)
۲    {
۳    return round(($value*100)/$total,2);
۴    }

اینم تابع محاسبه درصد هر مقدار که با ضرب مقدار مورد نظر در عدد ۱۰۰ و تقسیم اون بر مجموع به دست میاد.

کد کامل صفحه ajax.php
۱    require_once ‘config/database.php’;
۲    if( isset($_POST[‘action’])&& $_POST[‘action’]==’vote’ )
۳    {
۴    $ans=$_POST[‘answer’];
۵    $q_id=$_POST[‘question_id’];
۶    if(!validate_user($q_id))
۷    {
۸    echo ‘شما قبلا رای خود را برای این نظرسنجی ثبت کرده اید.’;
۹    die();
۱۰    }
۱۱    new_vote($ans,$q_id);
۱۲    }
۱۳    elseif(isset($_POST[‘action’]) && $_POST[‘action’]==’result’ )
۱۴    {
۱۵    $q_id=$_POST[‘question_id’];
۱۶    show_results($q_id);
۱۷    }
۱۸    function get_percent($value,$total)
۱۹    {
۲۰    return round(($value*100)/$total,2);
۲۱    }
۲۲    function validate_user($q_id)
۲۳    {
۲۴    global $db;
۲۵    $ip=get_user_ip();
۲۶    $user_ip=ip2long($ip);
۲۷    $sql=”SELECT * FROM polls WHERE q_id='{$q_id}’ AND ip='{$user_ip}’ LIMIT 1″;
۲۸    $result=$db->query($sql);
۲۹    if($db->num_rows($result)==1)
۳۰    {
۳۱    return false;
۳۲    }
۳۳    else
۳۴    {
۳۵    return true;
۳۶    }
۳۷    }
۳۸    function show_results($q_id)
۳۹    {
۴۰    global $db;
۴۱    $sql=”SELECT SUM(number) as total FROM answers WHERE q_id='{$q_id}'”;
۴۲    $result=$db->query($sql);
۴۳    $total=$db->get_row($result);
۴۴    $total=(int)$total[0];
۴۵    $sql=”SELECT * FROM answers WHERE q_id='{$q_id}'”;
۴۶    $result=$db->query($sql);
۴۷    $output=”;
۴۸    while ($row=$db->fetch_array($result)):
۴۹    $percent=get_percent((int)$row[‘number’],$total);
۵۰    $output.=$row[‘title’].’ – ‘.$percent.’ % با ‘.$row[‘number’].’ ارسال’.'<p><span data-width=”‘.$percent.'”></span></p>’;
۵۱    endwhile;
۵۲    $output.='<p>تعداد کل شرکت کنندگان: ‘.$total.'</p>’;
۵۳    $db->disconnect();
۵۴    echo $output;
۵۵    die();
۵۶    }
۵۷    function new_vote($ans,$q_id)
۵۸    {
۵۹    global $db;
۶۰    $ip=ip2long(get_user_ip());
۶۱    $db->connect();
۶۲    $sql=”UPDATE answers SET number=number + 1 WHERE id={$ans}”;
۶۳    $db->query($sql);
۶۴    $sql=”INSERT INTO polls (q_id,ip) VALUES(‘{$q_id}’,'{$ip}’)”;
۶۵    $db->query($sql);
۶۶    show_results($q_id);
۶۷    }
۶۸    function get_user_ip()
۶۹    {
۷۰    //Test if it is a shared client
۷۱    if (!empty($_SERVER[‘HTTP_CLIENT_IP’])){
۷۲    $ip=$_SERVER[‘HTTP_CLIENT_IP’];
۷۳    //Is it a proxy address
۷۴    }elseif (!empty($_SERVER[‘HTTP_X_FORWARDED_FOR’])){
۷۵    $ip=$_SERVER[‘HTTP_X_FORWARDED_FOR’];
۷۶    }else{
۷۷    $ip=$_SERVER[‘REMOTE_ADDR’];
۷۸    }
۷۹    return $ip ;
۸۰    }