الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

إظهار قائمة بأسماء الأعضاء المتواجدين أون لاين

بدأه ابن رشد في 11 أكتوبر 2008 · 10 رد · 1,640 مشاهدة · في منتدى تطوير المواقع بـ PHP
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته ..

احاول عمل اسكربت يقوم بإظهار اسماء الأعضاء المتواجدين أون لاين على الموقع كما يوجد فى المنتديات ..

وكنت اقوم بالتالي

عمل حقل فى جدول الأعضاء اسمه (status) والديفولت بتاعه 0

بعد ان يقوم العضو بتسجيل الدخول اعدل الحقل (status) الى 1

وبعد ان يقوم العضو بتسجيل الخروج اقوم بتعديله مرة أخرى الى 0

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

فهل هناك أى حلول مقترحة لهذا الاسكربت

#2

بسم الله الرحمن الرحيم

الجواب باختصار :

تنشئ صفحة status.php على السيرفر وظيفتها تحديث الحقل status إن كان صاحب الجلسة موجود أو لا ، ولا تعمل هذه الصفحة أقصد الملف أي شيء آخر ولا ترسل شيء للمتصفح .

في حدث تحميل الصفحة

<body onLoad="window.setTimeout(functionName, secondd);">

تضع الدالة setTimeout التي تأخذ برامترين الأول الإجراء المنفذ ، والثاني التكرار بعدد الثواني .

فتضع الإجراء هي الذي ينادي الصفحة status.php ولا يعمل أي شيء آخر . وتجعل عدد الثواني بما يعادل خمس دقائق أو أكثر .

هذا كله في إثبات حضور الزائر فقط .

أما حذف الزائر غير المتواجد فعند تحميل الصفحة الرئيسية للموقع أو يفحص الأوقات القديمة ويحذف السجلات التابعة لها :

$time=time();
$timeout=$time-3600;
DELETE FROM online WHERE time<{$timeout}

وهذا الكود مأخوذ من برنامج الراصد .

ملاحظة بدون استخدام الجافا سيكريبت سيتم حذف المتواجدون الذين لم يحدثوا صفحاتهم .

ولو وافيت ربك دون ذنب *** وناقشك الحساب إذاً هلكتا

ولم يظلمك في عملٍ ولكن *** عسير أن تقوم بما حملتا

#3

طيب ممكن كود كمثال اخي الكريم

مشروع قناة التكنولوجيا و التقنية العربية

http://www.alfker.com - الفكر العربي

دليل سوق الموبايلات

WwW.Mob4me.Com

#4

أشكرك على إعادة السؤال فبسببه أعدت البحث وتعلمت ما لم أكن اعلم .

اقتباس
طيب ممكن كود كمثال اخي الكريم

هل تقصد عن أكواد الجافا سكريبت :

إذاً فالدالة setTimeout لم أكن طبقت عليها مثالاً واستخدمتها فحصل عندي لبس في فهمها ، كما هو ظاهر في ردي الأخير.

هناك دالتان :

setTimeout وهي لإعطاء مهلة للأمر قبل تنفيذه ولا تفيد التكرار .

setInterval ، وهي تفيد التكرار بالمهلة المحددة .

وكلاهما لهما نفس البرامترين الأول الكود المنفذ، والثاني المهلة [بألف جزء من الثانية]

فأولاً نكتب الإجراء الذي نريد تكراره وهو : getStatus وهو يستخدم كائن الأجاكس في طلبه للملف : status.php .

والثاني كود التكرار للإجراء : getStatus وسنكتبه إن شاء الله بأحد الأمرين setTimeout و setInterval .

هذا الكود يوضع في الصفحة الرئيسية للموقع :

<script type="text/javascript">
var request = null; 
function getXMLHTTP() 
{ 
	var A = null; 
	try { 
		A = new ActiveXObject("Msxml2.XMLHTTP"); 
	} catch(e) { 
		try { 
			A = new ActiveXObject("Microsoft.XMLHTTP"); 
		} catch(oc) { 
			A = null; 
		} 
	} 

	if(!A && typeof XMLHttpRequest != "undefined"){ 
		A = new XMLHttpRequest(); 
	} 
	return A; 
} 

function getStatus() { 
	if(request && request.readyState != 0)  
		request.abort();
  request=getXMLHTTP(); 
  if(request) 
  { 
	request.open("GET", "status.php", true); 
	request.onreadystatechange = null;	 
	request.send(null); 
  }	  
} 

function start() { 
	for (;;setTimeout(getStatus, 1000)) {}
} 
//start();
setInterval(getStatus, 1000);

وأنت مختار ما بين الطريقتين :

1- إما الإجراء start وهو ينادي setTimeout بحلقة for لجعل getStatus يتكرر تنفيذه كل ثانية .

2- وإما الأمر setInterval وهو ويفيد التكرار تلقائية بالمهلة المحددة .

وكما هو واضح فلست محتاجاً إلى وضع الكود في onload للصفحة .

والحمد لله فهذا الكود لا يعاود تحديث الصفحة كل مرة ، ولا يظهر للزائر أنه يعاد التحديث أو إشغال المتصفح ، يعني تحديث صامت لا يشعر به أحد ، وتم اختباره على IE6 و FF و Opera .

--------------------------------

أما بالنسبة لأكواد الـ php فلعل الأمر فيها واضح خصوصاً الاخ أعرف بقاعدة البيانات الخاصة به .

<?php
	header("Cache-Control: no-cache, must-revalidate");
		//
				//	 ولا بد من حتواء قاعدة البيانات على وقت التواجد حتى يتم التحديث	
		//
	exit;	
?>

والكود : [ Cache-Control: no-cache, must-revalidate ] يخبر المتصفح أن لا يحفظ في كاش حتى يتم استدعاء الملف status.php كل مرة .

ملاحظة الحقل status بالقيمة 1 او 0 غير مفيد حالياً لأن العمليات تكون على وقت التواجد لأن الحذف كما مر يكون بعد مضي المدة المحددة . فلو عدِّل إلى حقل من نوع datetime كان اولى .

تم تعديل هذه المشاركة بواسطة أبو محمد اللحياني في 12 أكتوبر 2008 في 22:59

ولو وافيت ربك دون ذنب *** وناقشك الحساب إذاً هلكتا

ولم يظلمك في عملٍ ولكن *** عسير أن تقوم بما حملتا

#5

جزاك الله خيرا اخى ابو محمد على اهتمامك انت وكل اخوانى هنا ..

عندى بس استفسار بسيط

اقتباس
تنشئ صفحة status.php على السيرفر وظيفتها تحديث الحقل status إن كان صاحب الجلسة موجود أو لا

ازاى اقدر اتحقق اذا كانت السيشن لسه موجودة ولا لأ ؟؟

#6

لأنت لديك في الموقع تسجيل دخول أليس كذلك ؟؟

إذاً كيف يعرف سكريبت الموقع أن المستخدم الذي يتنقّل عبر صفحات الموق ويحمِّل المرفقات ويضيف موضوع، هل لا بد أن يسجل الدخول عند كل ما مضى ؟ أم يعرف السكريبت ذلك بالجلسة .

بالجلسة التي تدار تلقائياً بـ php أو بالكوكيز الذي يرسل تلقائياً بالمتصفح .

الآن في الصفحة status.php اكتب الكود التالي : حتى تعرف متغيرات الجلسة التي تستطيع اتقاطها والتعامل معها :

echo 'SESSION:';
print_r($_SESSION);
echo 'COOKIE:';
print_r($_COOKIE);

ولو وافيت ربك دون ذنب *** وناقشك الحساب إذاً هلكتا

ولم يظلمك في عملٍ ولكن *** عسير أن تقوم بما حملتا

#7

أفهم ذلك جيداً أخى ولكن سؤالى هو عن كيفية التحقق من أن هذه السيشن مازال مفتوحاً أم لا من جهتى أنا بحيث فى حالة انى لم اجد هذه السيشن اقوم بتحويل الحالة من اون لاين الى اوف لاين ..

#8
اقتباس
حالة انى لم اجد هذه السيشن اقوم بتحويل الحالة من اون لاين الى اوف لاين

لديك عدة زوار لموقعك . ففي كل مرة يزوره أي عضو لا تتعرف php إلا على بيانات جلسة العضو الزائر فقط .

إذا فتح الموقع العضو ( أ ) فهو الذي يظهر في معلومات الجلسة ولا يظهر غيره ،

وبعد ثانية : فتح الموقع العضو ( ب ) فهو الذي يظهر في معلومات الجلسة ولا يظهر غيره ،

وبعد دقيقة : فتح الموقع العضو ( ج ) فهو الذي يظهر في معلومات الجلسة ولا يظهر غيره ،

فهل في كل مرة تجعل الأعضاء الباقين كلهم منتهية جلساتهم ، مع انهم متواجدون بعضهم منذ دقيقة وبعظهم أكثر أو أقل .

ولو وافيت ربك دون ذنب *** وناقشك الحساب إذاً هلكتا

ولم يظلمك في عملٍ ولكن *** عسير أن تقوم بما حملتا

#9

طيب يا اخوان فكرة اخرى

لو استخدمنا

<BODY onUnload="deleteUser()">

deleteUser() هى فانكشن فى البى اتش بى تصممها لحذف المستخدم من الجدول

انا لم اجربها ولكنها فكرة

#10

اخوانى انا مشكلتى كلها فى حاجة واحدة وهى فى حالة ان المستخدم قفل المتصفح بدون ما يعمل تسجيل خروج ازاى اقدر اتحقق من ان السيشن بتاع انتهى .. أنا لاقيت حاجة اسمها session_id بعض الناس قالولى تقدر تتحق منها بس بصراحة مش عارف ازاى اقدر اتحقق منها فأرجو ان لو حد يعرف الطريقة يقولى عليها وجزاكم الله خيراً

#11
اقتباس
deleteUser() هى فانكشن فى البى اتش بى تصممها لحذف المستخدم من الجدول

انا لم اجربها ولكنها فكرة

المتصفح لا ينفذ أكواد php

اقتباس
ان المستخدم قفل المتصفح بدون ما يعمل تسجيل خروج ازاى اقدر اتحقق من ان السيشن بتاع انتهى

يا اخي المستخدم إذا أغلق المتصفح فإن المتصفح لا يرسل إشارة أن فلان خرج ، وكذلك إذا المستخدم إذا تواجد على صفحة في الموقع مدة ساعة أو حتى ليومين متتاليين لا يرسل إشارة بأن فلاناً متواجد .

إذاً يا أخي الكريم ما هي الطريقة لتجاوز هذه العقبة؟

الحل مضى الإشارة إليه، وهي باستخدام حقل لتسجيل الوقت الذي دخل فيه المستخدم فإذا مضى عليه زمن [أنت من يحدده] فلن يحسب العضو في عدد نتائج الاستعلام .

والسلام عليكم ورحمة الله وبركاته

تم تعديل هذه المشاركة بواسطة أبو محمد اللحياني في 23 أكتوبر 2008 في 23:01

ولو وافيت ربك دون ذنب *** وناقشك الحساب إذاً هلكتا

ولم يظلمك في عملٍ ولكن *** عسير أن تقوم بما حملتا

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…