نظرة سريعة على مجريات يوم سوالف
الفائزون في المسابقة الأصغر لسوالف كاست

 

العودة   سوالف سوفت > قسم تطوير وبرمجة المواقع للمتقدمين > PHP
المدوّنات البحث مشاركات اليوم اجعل كافة المشاركات مقروءة

موضوع مغلق
 
LinkBack أدوات الموضوع
عضو سوبر نشيط
تاريخ التسجيل: Dec 2000-
#1 (permalink)  
حلول برمجية (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 (); 
ثم نغلق قوس الشرط:

}

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

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

الحل الثالث :

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

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

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






عبد الرحمن غير متواجد حالياً   قديم 07-06-2003, 05:04 AM
عضو سوبر نشيط
تاريخ التسجيل: Nov 2001-
#2 (permalink)  

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






أبو الوليد غير متواجد حالياً   قديم 07-06-2003, 05:22 AM
عضو جديد
تاريخ التسجيل: Jun 2003-
#3 (permalink)  

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

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






__________________
php
بى اتش بى غير متواجد حالياً   قديم 07-06-2003, 02:14 PM
عضو فعال جدا
تاريخ التسجيل: Feb 2002-
#4 (permalink)  

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


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






__________________
مؤسسة المهمات البرمجية
00966507585887
0507585887


www.mr-php.com.sa
www.mr-php.com
المهمة9 غير متواجد حالياً   قديم 07-06-2003, 07:37 PM
عضو نشيط
تاريخ التسجيل: Jun 2003-
#5 (permalink)  

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

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






abo yazeed غير متواجد حالياً   قديم 08-06-2003, 07:46 AM
عضو سوبر نشيط
تاريخ التسجيل: Dec 2000-
#6 (permalink)  

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

شكرا لكم

بى اتش بى


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






__________________
لا تعاند من إذا قال فعل
الشنكبوتية
اللغة العربية سياج هويتنا
عبد الرحمن غير متواجد حالياً   قديم 08-06-2003, 09:14 AM
عضو جديد
تاريخ التسجيل: Jun 2003-
#7 (permalink)  

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

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

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

ويتخزن فى
vote

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

مثلا

3 5 8

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

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


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






__________________
php
بى اتش بى غير متواجد حالياً   قديم 08-06-2003, 01:44 PM
عضو سوبر نشيط
تاريخ التسجيل: Dec 2000-
#8 (permalink)  

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


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

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






__________________
لا تعاند من إذا قال فعل
الشنكبوتية
اللغة العربية سياج هويتنا
عبد الرحمن غير متواجد حالياً   قديم 08-06-2003, 03:17 PM
عضو نشيط
تاريخ التسجيل: Jan 2001-
#9 (permalink)  

جزاك الله خيراً على هذا الموضوع القيّم
و من باب المشاركة في العلم
لا حظت استعمالك للشرط 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 
مما يجعل الجملة أقصر و أسرع في التنفيذ و الله أعلم .

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

و السلام .






__________________
قل خيراً أو اصمت ..
الصامت غير متواجد حالياً   قديم 23-06-2003, 09:47 AM
عضو سوبر نشيط
تاريخ التسجيل: Dec 2000-
#10 (permalink)  

الأخ الصامت :

كلامك صحيح


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






__________________
لا تعاند من إذا قال فعل
الشنكبوتية
اللغة العربية سياج هويتنا
عبد الرحمن غير متواجد حالياً   قديم 25-06-2003, 09:09 AM
عضو نشيط
تاريخ التسجيل: Jun 2003-
#11 (permalink)  

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

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

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

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

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

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

كود 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






الصور المرفقة
نوع الملف: jpg ssss.JPG‏ (27.0 كيلوبايت, المشاهدات 158)
عيون العرب غير متواجد حالياً   قديم 11-09-2005, 05:42 PM
صاحب موقع مهارات سوفت
تاريخ التسجيل: Apr 2004-
#12 (permalink)  

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






__________________
██████████
██████████
██████████


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


للتواصل ..
00967733873335

باب الحارة .. للبيع ..!!
مُجَاهِد غير متواجد حالياً   قديم 11-09-2005, 09:24 PM
عضو نشيط
تاريخ التسجيل: Jun 2003-
#13 (permalink)  

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

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

تحياتي






عيون العرب غير متواجد حالياً   قديم 12-09-2005, 03:14 AM
موضوع مغلق


أدوات الموضوع

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

كود [IMG] متاحة
كود HTML معطلة
Trackbacks are متاحة
Pingbacks are متاحة
Refbacks are متاحة



الساعة الآن: 12:08 AM بتوقيت المملكة العربية السعودية