بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
استاذي العزيز feckra نعم يمكنك عمل ذلك وبكل سهولة فهناك دالة تسمى
كود PHP:
session_set_save_handler();
كما ذكر أستاذي Dr-dre67 .
إن PHP تستخدم طريقة إفتراضية (Default) للتعامل مع sessions وهي كالتالي:
عندما يدخل المستخدم الموقع
يتم فتح ملف عادي (Flat File) ويتم كتابة المعلومات بإستخدام fopen اي بالطريقة التقليدية للتعامل مع الملفات ثم يغلقه حين تكتمل الصفحة وبعد ان تنتقل على صفحة اخرى يقوم بفتحه وقراءته مرة اخرى وهذا بالنسبة للطريقة الإفتراضية ل php
فهناك 6 دوال يتم التعامل معها كـ (callback) وهي :
كود PHP:
open();
close();
read();
write();
destroy();
gc();
للتعامل مع session وهذه الدوال تمرر إلى الدالة
كود PHP:
session_set_save_handler();
واين يتم تخزين وقراءة الجلسات وماذا يحدث عند فتحها واغلاقها وتدميرها فأنت تتحكم بها بهذه الدوال بعد كتابتها ثم تمريرها إلى الدالة المذكورة بالأعلى وليس شرط ان تكون هذه الدوال بهذا الأسم ويمكنك تسميتها كيفما تريد ولكن المهم الترتيب عند تمريرها للدالة المذكورة بالأعلى والأن سأعطيك مثال للطريقة الإفتراضية التي تستخدمها Php للتعامل مع session :
كود PHP:
function open($save_path, $session_name)
{
global $sess_save_path, $sess_session_name;
$sess_save_path = $save_path;
$sess_session_name = $session_name;
return(true);
}
function close()
{
return(true);
}
function read($id)
{
global $sess_save_path, $sess_session_name;
$sess_file = "$sess_save_path/sess_$id";
if ($fp = @fopen($sess_file, "r")) {
$sess_data = fread($fp, filesize($sess_file));
return($sess_data);
} else {
return(""); // Must return "" here.
}
}
function write($id, $sess_data)
{
global $sess_save_path, $sess_session_name;
$sess_file = "$sess_save_path/sess_$id";
if ($fp = @fopen($sess_file, "w")) {
return(fwrite($fp, $sess_data));
} else {
return(false);
}
}
function destroy($id)
{
global $sess_save_path, $sess_session_name;
$sess_file = "$sess_save_path/sess_$id";
return(@unlink($sess_file));
}
/*********************************************
* WARNING - You will need to implement some *
* sort of garbage collection routine here. *
*********************************************/
function gc($maxlifetime)
{
return true;
}
session_set_save_handler("open", "close", "read", "write", "destroy", "gc");
session_start();
// proceed to use sessions normally
ويمكنك عمل ماتريد في حال تعديلك للدوال فقط كل ماعليك هو اخبار PHP بالطريقة التي تريدها للتعامل مع SESSION من خلال الطريقة التي ذكرناها وبعده تمررها إلى session_set_save_handler ليعرف php كيف يتعامل مع الجلسات اما طريقة تحويل session للتعامل مع قواعد البيانات فالعملية بسيطة واتضحت الآن وانا لا أستطيع كتابة مثال لأنه طويل نوعاً ما ولكن الحمد لله بحثت عن مثال ووجدت مثال ممتاز وهو الذي استخدمه الأستاذ رفيع :
واليك تحويل طريقة التعامل مع session من طريقة php الإفتراضية وهي الملفات إلى طريقة تعامل session مع قواعد البيانات :
كود PHP:
/*
+===========================================+
| Rafiaphp V2.0 Copyright © 2003 |
| ------------------------------------- |
| |
| by Rafia AL-Otibi |
| |
| ------------------------------------- |
| web: [url]http://www.rafiaphp.com[/url] |
| email: [email]abobadar@msn.com[/email] |
+===========================================+
*/
class sessions
{
function start_sessions ()
{
global $maxlifetime;
function _open($session_path, $session_name)
{
}
function _close()
{
return 1;
}
function _select($SID)
{
$query = "SELECT value FROM rafia_sessions
WHERE SID = '$SID' AND
expiration > ". time();
$result = mysql_query($query);
}
function _write($SID,$value)
{
global $maxlifetime;
$expiration = time() + $maxlifetime;
$query = "INSERT INTO rafia_sessions
VALUES('$SID', '$expiration', '$value')";
$result = mysql_query($query);
if (!$result) {
$query = "UPDATE rafia_sessions SET
expiration = '$expiration',
value = '$value' WHERE
SID = '$SID' AND expiration >". time();
$result = mysql_query($query);
}
}
function _destroy($sessionID)
{
$query = "DELETE FROM rafia_sessions WHERE SID = '$sessionID'";
$result = mysql_query($query);
}
function _gc($maxlifetime)
{
global $maxlifetime;
$expiration = time() - $maxlifetime;
$query = "DELETE FROM rafia_sessions WHERE expiration < '$expiration'";
$result = mysql_query($query);
if($result)
return 1;
}
session_set_save_handler("_open","_close","_select","_write","_destroy","_gc");
session_start();
}
}
والأمر واضح بإذن الله تعالى الآن فلقد استخدم جدول المستخدمين وعملية insert حين حفظ المعلومات وعند الإغلاق والتدمير جملة delete
ولكن لاحظ ان الأستاذ رفيع استخدم اسم _select وذلك ليشير الى عملية القراءة من session فكما قلنا سابقاً ان تسمية الدالة لاتشكل مشكلة ولكن يجب تمريرها الى دالة session_set_save_handler بنفس التسمية التي قمت بتسميتها .
وارجوا ان اكون قد وفقت في ايصال ولو بعض الفائدة للجميع عسى الله ان يوفقنا لما يحب ويرضى وهذا مالدي الآن فإن أخطأت فمن نفسي والشيطان وإن أصبت فمن الله عز وجل
أخوكم عبدالله عيد