النتائج 1 إلى 13 من 13

الموضوع: حلول برمجية (5) PHP : إيقاف التصويت المتعدد

  1. #1
    عضو سوبر نشيط
    تاريخ التسجيل
    Dec 2000
    المشاركات
    998

    حلول برمجية (5) PHP : إيقاف التصويت المتعدد



    طلب مني أحد الأحبة أن أكتب له هذا الحل، فأردت إشراككم في الفائدة.





    إذا كان لديك برنامج تصويت، فإنه يمكن أن يعبث متصفح بواحد بنتائج التصويت؛ وذلك بتكرار

    العملية.

    هناك عدة حلول :

    1 - الحل الأول : أن تجعل التصويت للأعضاء. فإذا (صوّت) عضو فإن رقمه يسجل في قاعدة البيانات،

    ولا يمكن أن يصوت مرة أخرى.

    وهذه الطريقة معمول بها في المنتديات.

    2 - الحل الثاني : أن تعتمد على ملف البصمة(cookie)؛ لحفظ معلومات المتصفح.
    وهذه الطريقة تقلل العبث، ولا تقضي عليه؛ لأنه يمكن حذف ملف البصمة؛ لكن الغالب أن متصفح

    الشبكة لا يهتمون بمثل هذه الأمور.

    3 - الحل الثالث : الاعتماد على ملفات نصية أو قاعدة البيانات في حفظ معلومات المتصفح. وهي

    أفضل من الطريقة السابقة؛ لأنه لا يمكن للعابث أن يحذف المعلومات.

    أما الحل الأول فهو واضح؛ وذلك بأن تضع في حقل التصويت حقلا باسم

    كود PHP:
    member_id 
    ثم يدخل رقم العضو في هذا الحقل عند التصويت

    وقبل إدخال قيمة التصويت يُتحقق من وجود الرقم أو لا؟

    كود PHP:
    $query ="SELECT member_id FROM vote WHERE vote_id='$vote_id'";
    $result=mysql_query($query);

    while (list (
    $member_id)=mysql_fetch_array ($result)) {
    if ( 
    $member_id== $m_id ) {
    echo 
    "لا يمكنك التصويت أكثر من مرة";
    exit ();
    }
    // End : if
    }// End : While 
    الأمر الأول :

    كود PHP:
    $query ="SELECT member_id FROM vote WHERE vote_id='$vote_id'"
    طلبنا الاستعلام من قاعدة البيانات؛ حيث طلبنا رقم العضو من الجدول vote حيث رقم التصويت

    vote_id يساوي التصويت المختار.

    لأننا نريد التأكد هل صوت في هذا التصويت أو لا؟

    الأمر الثاني :

    طلب هذا الاستعلام من قاعدة البيانات وجعله في متغير باسم $result

    كود PHP:
    $result=mysql_query($query); 
    الأمر الثالث :

    عمل حقلة تكرار لأرقام الأعضاء بحيث نستعرض أرقام الأعضاء الذين صوّتوا في هذا التصويت.

    while (list ($member_id)=mysql_fetch_array ($result)) {

    الأمر الرابع :

    في أثناء حقلة التكرار نستعرض كل رقم على حدة؛ لنرى هذا يوافق رقم العضو الرقم المخزن في قاعدة

    البيانات؟
    فـ $member_id هم رقم العضو المخزن في القاعدة.
    و $m_id هو رقم العضو الذي جلبناه عنده تسجيله الدخول

    كود PHP:

    if ( $member_id== $m_id ) { 
    الأمر الخامس :

    إذا كان رقم العضو يتفق مع الرقم في قاعدة البيانات فهذا يعني أنه سبق أن صوت؛ فنظهر له رسالة، ثم

    نوقف العمل.

    كود PHP:

    echo "لا يمكنك التصويت أكثر من مرة";

    exit (); 
    ثم نغلق الأقواس


    كود PHP:

    }// End : if
    }// End : While 

    هذه طريقة الحل الأول؛ وهو التصويت الخاص بالأعضاء

    الحل الثاني : الاعتماد على ملف البصمة :

    قبل التصويت علينا أن نحصل على معلومات معينة عن الزائر


    كود PHP:

    $rate_agent 
    $_SERVER['HTTP_USER_AGENT'];
    $rate_ip=$_SERVE['REMOTE_ADDR'];
    $rate_host=$_SERVER['REMOTE_HOST']; 
    المتغير $_SERVER هو متغير خاص بمتغيرات المزود والزائر، وهو اختصار للمتغير في الإصدارات

    القديمة : $HTTP_SERVER_VARS

    يمكنك عن طريق هذا المتغير تحديد عدة معلومات حسب النوع؛ ويمكنك معرفة الأنواع التي يمكن جلبها

    من هنا :

    أو البحث في دليل php
    في

    VII. Appendixes

    ثم
    Appendix G. List of Reserved Words

    ثم

    Predefined Variables

    في السطر الأول طلبنا معلومات معلومات النظام والمتصفح

    ($_SERVER['HTTP_USER_AGENT'];)؛ فإذا كان الزائر يستخدم نظام XP

    ومتصفح إنترنت إكسبلورر فستظهر معلومات مشابهة لهذه :
    Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Q312461)

    في السطر الثاني : طلبنا معلومات الرقتفي ( مصطلح من بدلا من آيبي )

    ($_SERVE['REMOTE_ADDR'])

    في السطر الثالث طلبنا معلومات مقدم الخدمة ($_SERVER['REMOTE_HOST'])

    وحفظنا هذه المعلومات في المتغيرات الثلاث :

    كود PHP:

    $rate_agent 
    $rate_ip
    $rate_host 

    ثم نضيف متغيرا آخر وهو رقم التصويت :

    كود PHP:
    $rate_id $voteid
    بعد هذا نشئ ملف بصمة جديد

    كود PHP:

    $cookieinfo 
    "$rate_agent:$rate_ip:$rate_host";
        
    setcookie("rateinfo($rate_id)","$cookieinfo",time()+3600*120); 
    أولا جمعنا المتغيرات الثلاث السابقة في متغير واحد، وفصلنا بينها بعلامة (:) نقطة فوقها نقطة.

    ثم طلبنا إنشاء ملف البصمة ؛ حيث يحمل الاسم rateinfo ورقم التصويت الحالي

    كود PHP:
    rateinfo($rate_id

    تلحظ أنن وضعنا رقم التصويت مع اسم ملف البصمة؛ وذلك لئلا تحصل مشكلات عند تعدد التصويت؛

    لأننا لو وضعنا اسم ملف البصمة هكذا

    rateinfo

    فإنه لن يسمح إلا بالمشاركة في تصويت واحد فقط؛ فلو كان لديك كل يوم تصويت فلن يتمكن الزائر

    من المشاركة في كلها؛ لهذا من الأفضل أن نحدد اسم ملف البصمة برقم التصويت


    ثم أعلمنا الدالة أن تحفظ المعلومات المخزنة في المتغير $cookieinfo في ملف البصمة

    ثم أعلمنا الدالة أن تحفظ هذه المعلومات لمدة خمسة أيام.

    لأن الساعة فيه 3600 ثانية ( نظام الحفظ يعتمد على الثواني)
    واليوم فيه 24 ساعة، وخمسة أيام تعني 120 ساعة
    فضربنا عدد الثواني في الساعة بعدد الساعات في خمسة أيام

    بعد هذا نغلق قوس الشرط

    }

    الآن حفظت المعلومات.

    هذه المعلومات تكون في صفحة عرض التصويت rate.php

    وفي صفحة اعتماد التصويت dorate.php نضع الأوامر التالية :

    كود PHP:

    $rate_agent 
    $_SERVER['HTTP_USER_AGENT'];
    $rate_ip=$_SERVE['REMOTE_ADDR'];
    $rate_host=$_SERVER['REMOTE_HOST'];
    $rate_id $voteid
    وقد مضت هذه الأوامر من قبل

    ونضيف إليها :


    كود PHP:
    $cookie $_COOKIE['rateinfo($rate_id)']; 

    المتغير $_COOKIE يضمن أن المعلومات المجلوبة هي من ملف البصمة وليس من متغير آخر، فمثلا

    لو وضعت

    $rateinfo فإنه يمكن خداع البرنامج عن طريق المتصفح، وتمرير المتغير منه!

    لكن $_COOKIE لا يسمح بمثل هذا، وهذا المتغير اختصار للمتغير في الإصدارات السابقة

    $HTTP_COOKIE_VARS

    الآن نطلب المعلومات المحفوظة :

    كود PHP:
    $cookieexplode explode (":",$cookie); 
    كما سبق بيانه؛ فإن المعلومات المخزنة في ملف البصمة قد فصلت بعلام : ؛ لهذا طلبنا فصل المتغيرات في

    هذا المتصفح، وجعلها في خانات باسم

    كود PHP:

    $cookieexplode 
    ثم نعيد ترتيب المتغيرات

    كود PHP:

    $getcooki_agent 
    $cookieexplode[0];
    $getcooki_ip $cookieexplode[1];
    $getcooki_host $cookieexplode[2]; 

    السطر الأول يجلب المعلومة في الخانة ذات الرقم صفر

    والثاني يجلب المعلومة في الخانة ذات الرقم 1

    والثالث يجلب المعلومات في الخانة ذات الرقم 2

    لأننا وضعنا متغير ملف البصمة بهذا الترتيب

    كود PHP:

    $cookieinfo 
    "$rate_agent:$rate_ip:$rate_host"

    الآن نتحقق هل المعلومات المسحلة عن الزائر توافق المعلومات المحفوظة في ملف البصمة؟

    كود PHP:

    if ( $rate_agent == $getcooki_agent && $rate_ip == $getcooki_ip 

    && $rate_host == $getcooki_host  ) { 
    فإذا كانت المعلومات الثلاث متطابقة فإننا نظهر رسالة

    كود PHP:
    echo "لقد صوّت من قبل";

    exit (); 
    ثم نغلق قوس الشرط:

    }

    ثم ننفذ عملية إدراج التصويت.

    انتهى الحل الثاني :

    الحل الثالث :

    مثل الطريقة السابقة إلا في طريقة حفظ المعلومات، فبدلا من حفظها في ملف البصمة تحفظ المعلومات

    في ملف نصي أو في قاعدة البيانات.

    ولعلي أتفرغ لشرح الحل الثالث بالتفصيل





    عبد الرحمن غير متواجد حالياً


  2. #2
    عضو سوبر نشيط
    تاريخ التسجيل
    Nov 2001
    المشاركات
    823


    شكرا لك على هذا الدرس الجميل
    وجزاك الله خير





    أبو الوليد غير متواجد حالياً

  3. #3
    عضو جديد
    تاريخ التسجيل
    Jun 2003
    المشاركات
    3


    شكرا لك على هذا الدرس الجميل
    وجزاك الله الف خير

    -----
    اذا ممكن اخى تشوف هذا السؤال
    هذا احد الاشخاص سئل هذا السوال وانا محتاج نفس الشى
    للجواب
    ضرورى
    http://www.phpvillage.com/phpBB2/viewtopic.php?t=1626





    __________________
    php
    بى اتش بى غير متواجد حالياً

  4. #4
    عضو فعال جدا
    تاريخ التسجيل
    Feb 2002
    المشاركات
    2,289


    جزاك الله خير اخوي


    افدتني كثيرااااااا





    المهمة9 غير متواجد حالياً

  5. #5
    عضو نشيط
    تاريخ التسجيل
    Jun 2003
    المشاركات
    37


    درس اكثر من ممتاز

    فلك جزيل الشكر على ذلك





    abo yazeed غير متواجد حالياً

  6. #6
    عضو سوبر نشيط
    تاريخ التسجيل
    Dec 2000
    المشاركات
    998


    أبو الوليد، المهمة9، abo yazeed

    شكرا لكم

    بى اتش بى


    لم أفهم المطلوب، ليتك توضح بالتفصيل





    __________________
    لا تعاند من إذا قال فعل
    الشنكبوتية
    اللغة العربية سياج هويتنا
    عبد الرحمن غير متواجد حالياً

  7. #7
    عضو جديد
    تاريخ التسجيل
    Jun 2003
    المشاركات
    3


    مثلا لوقلنا عندنا صف فى جدول member
    اسمه vote
    --
    وانا عامل صفحه مظهر فيها
    اول 10 مواضيع
    --

    وبجانب كل موضوع شيك بوكس

    والعضو يختار كذا واحد موضوع

    ويتخزن فى
    vote

    ايد المواضيع الى اختارها

    مثلا

    3 5 8

    ياليت شرح وافى

    وشكرا لكم مقدما


    ان شاء الله تكون فهمت قصدى





    __________________
    php
    بى اتش بى غير متواجد حالياً

  8. #8
    عضو سوبر نشيط
    تاريخ التسجيل
    Dec 2000
    المشاركات
    998


    حقيقة لم تصلني الفكرة


    لكن اقرأ هذا الموضوع ربما ينفعك

    http://www.swalif.net/softs/showthre...threadid=41840





    __________________
    لا تعاند من إذا قال فعل
    الشنكبوتية
    اللغة العربية سياج هويتنا
    عبد الرحمن غير متواجد حالياً

  9. #9


    جزاك الله خيراً على هذا الموضوع القيّم
    و من باب المشاركة في العلم
    لا حظت استعمالك للشرط WHERE في الاستعلام لرقم التصويت فقط ثم استعمال جملة التكرير مع الشرط لإيجاد رقم المستخدم للتصويت ، كما ذكرت فيما يلي :


    كود PHP:
    $query ="SELECT member_id FROM v
    ote WHERE vote_id='
    $vote_id'";
    $result=mysql_query($query);

    while (list (
    $member_id)=mysql_fetch_array ($result)) {
    if ( 
    $member_id== $m_id ) {
    echo 
    "لا يمكنك التصويت أكثر من
    مرة"
    ;
    exit ();
    }
    //
    End : if
    }
    // End :
    While 
    مع العلم أنّ رقم المستخدم إن ورد سيكون لمرّة واحدة فقط في قاعدة البيانات ، لذا أقترح أن يضمّن الشرط في جملة الاستعلام مطابقة رقم العضو مع الرقم المخزّن في قاعدة البيانات كالتالي :
    كود PHP:
    $query ="SELECT member_id FROM vote WHERE vote_id='$vote_id' AND member_id='$m_id'"
    و بما أنّ الشرط قد وجد في جملة الاستعلام فلعلّها تفي عن جملة التكرار
    بحيث نختبر متغيّر $result بعد عد صفوف القاعدة العائدة فيه و نختبر وجود قيمه داخله من باب التأكيد كالتالي :

    كود PHP:
    if($result and mysql_num_rows($result)) 
    لتصبح الجملة كاملةً :


    كود PHP:
    $query ="SELECT member_id FROM vote WHERE vote_id='$vote_id' AND member_id='$m_id'";
    $result=mysql_query($query);

       if(
    $result and mysql_num_rows($result)) 
    {
    echo 
    "لا يمكنك التصويت أكثر من مرة";
    exit ();

    }
    //End : if 
    مما يجعل الجملة أقصر و أسرع في التنفيذ و الله أعلم .

    آمل إن كنتم ترون أنّ طريقتي في صياغة هذه الجملة ليست مناسبة ألا تبخلوا بتوجيهي و تصويبي فلم يحدوني للمشاركة إلا طلب العلم و التعلم فقط

    و السلام .





    __________________
    قل خيراً أو اصمت ..
    الصامت غير متواجد حالياً

  10. #10
    عضو سوبر نشيط
    تاريخ التسجيل
    Dec 2000
    المشاركات
    998


    الأخ الصامت :

    كلامك صحيح


    شكرا لك على التنبيه.





    __________________
    لا تعاند من إذا قال فعل
    الشنكبوتية
    اللغة العربية سياج هويتنا
    عبد الرحمن غير متواجد حالياً

  11. #11


    يا اخوان شرحكم ممتاز جدا

    ولكن عندي مشكله

    في مجلة النيوك

    اقدر اصوت الف مره ولا يمنعني

    ومع انه الكود موجود وسليم ولكن احس انه في شي غلط؟؟ لماذا لا يعمل ؟

    كل شي ماشي صح في الكود!

    كود PHP:
    global $HTTP_COOKIE_VARS$prefix$db;
        
    /* من هنا يبدأ صيد الغشاش*/
        
    $ip $_SERVER["REMOTE_ADDR"];
        
    $pollID intval($pollID);
        
    $past time()-1800;
        
    $db->sql_query("DELETE FROM ".$prefix."_poll_check WHERE time < '$past'");
        
    $row $db->sql_fetchrow($db->sql_query("SELECT ip FROM ".$prefix."_poll_check WHERE (ip='$ip') AND (pollID='$pollID'"));
        
    $ips $row['ip'];
        
    $ctime time();
        
    $pollID intval($pollID);
        if (
    $ip == $ips) {
        
    $voteValid 0;
        exit ();
        } else {
        
    $db->sql_query("INSERT INTO ".$prefix."_poll_check (ip, time, pollID) VALUES ('$ip', '$ctime', '$pollID')");
        
    $voteValid "1";
        }
        
    /* Fix end */
        /* update database if the vote is valid */
        
    if($voteValid>0) {
            
    $db->sql_query("UPDATE ".$prefix."_poll_data SET optionCount=optionCount+1 WHERE pollID='$pollID' AND voteID='$voteID'");
            if (
    $voteID != "") {
            
    $db->sql_query("UPDATE ".$prefix."_poll_desc SET voters=voters+1 WHERE pollID='$pollID'");
            
    update_points(8);
            }
        
    Header("Location: $forwarder");
        } else {
            echo
    'heloooooooo!';
        }
        echo 
    "<html><head></head><body></body></html>"


    وين الغلط؟
    لاحظ انه يقوم بإرسال الايبي والوقت ورقم التصويت وكل شي تمام!
    الصورة بالمرفقات**
    طبعا الصورة لسيرفر محلي ونفس الموقع موجود عندي بالجهاز
    تقدرون تجربون هنا
    http://sootk.com/modules.php?name=Nowdays&pollID=46





    الصور المرفقة الصور المرفقة  
    عيون العرب غير متواجد حالياً

  12. #12
    مُجَاهِد سابقاً
    تاريخ التسجيل
    Apr 2004
    المشاركات
    12,000


    الموضوع سنتين له ..





    __________________
    استخدم خاصية تنبيه المشرفين للضرورة وعند ملاحظة موضوع يخالف قوانين منتديات سوالف وسيتم مراجعة الموضوع او المشاركة المبلغ عنها على الفور
    عبد الله هُربي غير متواجد حالياً

  13. #13


    هذا البحث ومايسوي ياخوي مجاهد ههههههههههه

    بس لو في مشاركه راح اكون لكم من الشاكرين

    تحياتي





    عيون العرب غير متواجد حالياً





ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •  

أضف موقعك هنا| اخبار السيارات | حراج | شقق للايجار في الكويت | بيوت للبيع في الكويت | شركة كشف تسربات المياه | شركة عزل اسطح بالرياض | عزل فوم بالرياض| عزل اسطح بالرياض | كشف تسربات المياة بالرياض | شركة عزل اسطح بالرياض