PDA

View Full Version : آموزش: ذخیره Session ها در db با pdo



reza303
شنبه 17 اسفند 1392, 00:53 صبح
سلام .
پ.ن : امروز یه چی یاد گرفتم گفتم شیر کنم برا دوستان بقیه هم استفاده کنند .
دوستان همون طور که می دونید برا ذخیره یه اطلاعات خاصی ما از کوکی یا سیشن استفاده می کنیم . خب کوکی که کلا خدا رحمتش کنه امنیتش صفره ! و سیشن هم میشه دزدیدش :متعجب:
برا این کار میشه شما سیشن ها رو داخل دیتابیس ذخیره کنید .
خب از روش pdo برا اتصال به دیتابیس که هم امن تر هست و هم سریع تر استفاده کردیم .
قدم اول : فایل دیتابیس ما : db.php .
قدم دوم : ساخت فایل session.php .
ذخیره اطلاعات زیر داخلش :

<?php
abstract class PDOSession
{
private static $connect;
private static $oldData;

/**
* روش اتصال : Pdo .
*/
public static function init(PDO $connect)
{
self::$connect = $connect;
// اضافه کردن سیشن با تنظیمات مربوطه
session_set_save_handler('PDOSession::open', 'PDOSession::close',
'PDOSession::read', 'PDOSession::write',
'PDOSession::destroy', 'PDOSession::garbageCollect');
session_start();
}

/**
* باز کردن و پاچ کردن سیشن
*/
public static function open($save_path, $session_name)
{
// بر گردوندن سیشن
return true;
}

/**
* بستن سیشن
*/
public static function close()
{
return true;
}

/**
* ساخت آی دی سیشن و بار کردن آن
*/
public static function read($session_id)
{
// لود دیتابیس به روش پارام
$query = self::$connect->prepare('
SELECT data
FROM sessions
WHERE session_id = :session_id');
$query->execute(array(':session_id' => $session_id));

return $query->fetchColumn();
}

/**
* ذخیره کردن سیشن
*/
public static function write($session_id, $data)
{
// فراخانی دیتابیس و اپدیت سیشن ذخیره شده در دیتابیس

$query = self::$connect->prepare('
UPDATE sessions
SET data = :data, last_activity = :last_activity
WHERE session_id = :session_id');
$query->execute(array(
':session_id' => $session_id,
':data' => $data,
'last_activity' => time()));

// اگه آپدیت نشد بهش می گیم مجدد یکی بساز
if ($query->rowCount() == 0)
{
self::$connect
->prepare('
INSERT INTO sessions
(session_id, data, last_activity)
VALUES
(:session_id, :data, :last_activity)')
->execute(array(
':session_id' => $session_id,
':data' => $data,
'last_activity' => time())
);
}
}

/**
* حذف سیشن
*/
public static function destroy($session_id)
{
self::$connect
->prepare('
DELETE FROM sessions
WHERE session_id = :session_id')
->execute(array(':session_id' => $session_id));
}

/**
* تنظیمات مربوط به مدت زمان سیشن .
* اپر کاربر 24 دقیقه هیچ کاری با سیشن نکرد سیشن پاک میشه از رو جدول .
*/
public static function garbageCollect($lifetime)
{
self::$connect
->prepare('
DELETE FROM sessions
WHERE last_activity < :min_time')
->execute(array(':min_time' => time() - $lifetime));
}
}
?>
= > مشخصات دیتابیس رو در فایل بالا وارد می کنیم .
قدم سوم : مرتب سازی و فراخانی سیشن جهت استفاده
برا اینکه مرتب باشه کارمون و اینکه نخواییم هی دستور فراخانی فایل بالا و ... رو بزنیم می یایم فایل include رو می سازیم :
و داخلش می گیم :

<?php
require 'session.php';
$connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
PDOSession::init($connect);
?>

قدم چهارم : ساخت جدول
برا این کار کافیه دستورات زیر رو داخل phpmyadmin بزنید :

CREATE TABLE IF NOT EXISTS `sessions` (
`session_id` varchar(40) COLLATE utf8_bin NOT NULL,
`data` text COLLATE utf8_bin NOT NULL,
`last_activity` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
خب حالا وقتشه نتیجه کارمون رو بگیریم :
قدم پنجم : شما کافیه فایل include.php رو هر جا نیاز هست سیشن ساخته بشه و یا سیشن بارگزاری بشه و ازش استفاده بشه اینلود کنید :
مثلا :


include 'db.php';
include 'include.php';

* اول دیتابیس رو فراخانی می کنیم بعد هم اینکلود رو .

قدم ششم : حذف سیشن .
برا حذف ( موقعی که کاربر دکمه خروج رو می زنه و وارد logout.php میشه )
برا همین منظور کافیه دستورات زیر رو داخل logout.php قرار بدین )

<?php
include 'db.php';
include 'include.php';
session_destroy();
header("location:login.php");
?>

خب امید وارم مفید واقع بوده باشه .
دوستان و اساتید لطفا آموزش رو کامل کنند .

saeed-71
دوشنبه 01 اردیبهشت 1393, 16:31 عصر
نمیشه سشن رو تو صفحات دیگه فراخوانی کرد و چاپ کرد اما تو دیتابیس اطلاعات ذخیره میشن!چرا؟

MRmoon
دوشنبه 01 اردیبهشت 1393, 21:25 عصر
به جای fetchColumn از fetch استفاده کنید. فکر کنم مشکل حل میشه.