jQueryTips by Tee++;

  • Home
  • Videos
  • jQueryTips's Fans

Coding like playing a piano.

Subscribe RSS

Search

Search

Sponsored

jQueryTips on Social

Followers

hide
Chainnnn Pang25441 Dexteri@n Ton KanexKane Supachai JustDoIt Rut petchy Tophit anndrew Webmaster

Categories

hide
  • Programing
  • Database
  • Framework
  • Mobile Development
    • Titanium Mobile
    • PhoneGap
  • Life

Tag Cloud

hide
PHP JavaScript MySQL XML Mobile jQuery CodeIgniter Hash php xml Debug Library Zend API Events Plugins Facebook Basic Registration Tool Twitter Search Swath Performance ffmpeg YouTube Web Service Yahoo! NoSQL MongoDB PhoneGap

Recent Posts

hide
  • ใครๆ ก็มี Utils เอางี้เราเพิ่ม Utils ให้กับ CodeIgniter กันบ้าง
  • แนะนำ JS.Class (A JavaScript class library)
  • PHP กับ OOP มาปูพื้นฐานกันเสียใหม่ก่อน
  • ประกาศข่าวสารจาก Admin
  • JSFIDDLE สุดยอด Tools สำหรับการ Debug การเขียนตัวอย่างโคด
  • Titanium Mobile + HTML + Native Scrolling
  • HTML to PDF ตัวไหนดี วันนี้ผมมีคำตอบ ...
  • ทำความรู้จักกับ JavaScript Pattern ในเชิงลึก
  • ผมบอกคุณแล้ว .... คนโง่ก็ Code ได้
  • วันนี้ มาออกแบบ Web Service ด้วย PHP กันเถอะ (CodeIgniter Version)

Recent Comments

hide
  • เยดดดด
  • มีตัวอย่าง CI แบบ เพียว ๆ ไหมครับ
  • ขอบคุณมากครับ เห็นแนวทางได้ชัดขึ้นจากตอนแรก ที่งงไปหมด ไม่รู้อะไรเป็นอะไร
  • ขอบคุณมากเลยครับท่าน....แหม่เพิ่มกำลังใจให้ผมได้เยอะเลย ตอนนี้กำลังฝึกงานอยู่ที่แห่งนึงในหาดใหญ่ พร้อมเด็กจากอีกสถาบันนึง 3 คน เราคิดว่าเรา…
  • Very good blog, I really like ~

Links

hide
  • OSCOOL
  • Architeture & Performance
  • Video and TV
  • Appcelerator
  • PhoneGap
  • Home
  •  » Blogs

หายไปซะนาน วันนี้มาคุยกันเรื่อง session ใน CI พอหอมปากหอมคอกันดีกว่า

Apr 18, 2009 1:05:49 AM | 3 Comments | in Programing | CodeIgniter
ไม่ได้มาอัพซะนาน จนเกือบจะลืมไปละ ชื่อเว็บ ตัวเองสะกดยังไง 555+

พักนี้ไปทำตัวไร้สาระ ซะจนเบื่อ พอละ เลยมา อัพเดทซะหน่อยกลัวจะลืม กัน อิอิ

เรื่องที่จะพูดวันนี้ไม่ใช้ jQuery นะครับ แต่เป็น session library ใน CI ซึ่งตัวเองก็เพิ่ง มีโอกาสได้ลองใช้ ที่ไม่ได้ลองไม่ใช่เพราะมันไม่ดีนะครับ แต่ตอนนั้น ผมมีปัญหาว่า session ใน CI มันไม่ยอม สลาย หลังจาก ปิด Browser ซึ่ง บางโอกาส มันก็ไม่เหมาะกับงานของผม ก็เลย เขียน session lib ใหม่ ซึ่งเป็น native ใช้งาน เอง (session lib ของ CI จะทำงานด้วย Cookie) แต่ตอนนี้ อยากมาลองดูบ้าง เพราะเห็นมันบอกว่า "offering more flexibility for developers" จะดูซิว่าจริงรึเปล่า?

ก็เลย จับมาเทส โดยเอามาโม นิดนึง ให้มัน ทำลายตัวเองได้หลังจากปิด browser โดยการ extends lib มันมาแก้ นิดเดียว (เดี๋ยวจะบอกวิธีแก้ตอนท้ายของบทความ) แล้วก็เลยได้รู้ว่า " ของเค้าดีจริง "

โดยปกติ ผมไม่ชอบใช้งาน session อยู่แล้ว ด้วยเหตุผลหลาย อย่าง เช่น ต้องมา config ถ้าใช้งาน ผ่าน load balancer, session ค้างไม่ยอมลบ ออกจากระบบ File System ทำให้ Node เต็ม เป็นต้น

ผมจึงชอบที่จะใช้ Cookie และก็พอดี session lib ของ CI มัน base on cookie

วันนี้ผมก็เลยเอาซะหน่อย มาเล่าเรื่อง (แปล manual) ของ lib ตัวนี้กัน

ขี้เกียจอธิบายไรมากละ มา Coding กันเลยดีกว่า....

การจะใช้ lib ของ CI ก็ทำเหมือนเดิมล่ะครับ คืือ

$this->load->libary('session');


ซึ่งพอเราเรียกใช้งานแล้ว จะมีข้อมูลบางส่วนทำงานโดยทันทีคือ

[array]

(

     'session_id'    => random hash,

     'ip_address'    => 'string - user IP address',

     'user_agent'    => 'string - user agent data',

     'last_activity' => timestamp

)

ข้อมูลเหล่านี้จะถูก register โดยอัตโนมัติ ที่เรา set ค่า ให้ session ที่ทำงานผ่าน CI (ย้ำ ไม่ใช่ native PHP's session)

โดยประโยชน์ที่เราน่าจะเอาไปใช้งานได้ดีที่สุดก็คือการทำ Authentication ให้กับ Web App นั่นเอง

ลองมาใช้งานดูกัน....

การ set

$this->load->library('session');

$userdata = array('username' => 'Tee++;', 'logged_in' => TRUE);

$this->session->set_userdata($userdata);

การ retrieve data

$this->load->library('session');

$this->session->userdata('username');


อันนี้เป็น basic ง่ายๆ ครับ จริงๆ แล้วถ้าอ่านตาม manual ของเค้ามันจะมีความสามารถดังนี้คือ...
1. set ค่าเป็น ชุด array ได้
2. ตัวเวลาหมดอายุได้ผ่าน config หรือ config->set_item (default คือ 7200ms)
3. ตั้งชื่อ session name ได้
4. ตั้งค่า encrypt session ผ่าน config ได้ (recommended)
5. เก็บค่า session ใน db แทน cookie ได้
6. ...... อ่าน manual เอาเถอะ -*-

จริงๆ จุดประสงค์ที่ผมเขียน บทความนี้เพราะผมชอบความสามารถนึงของมันมาก นั่นคือ Flashdata ครับ ไอ้ข้างบนมันแค่ พื้นๆ

flashdata ทำงานยังไง?

มันก็เหมือนกับการ append session 1 key ลงไป แต่ว่าที่เจ๋งของมันคือ มันจะทำงานแค่ครั้งเดียว ยังไงล่ะ?

เอางี้สมมุติ ผมเป็น user คนนึง เข้ามาทำการ post อะไรสักอย่าง ผมก็สามารถ append status message ไปว่า "I'm just wrote something" แล้วก็ append session ตัวนี้ไปกับตัวผมเอง จากนั้น หน้าต่อมา ผมก็จะเห็น status message ของผม แต่ว่า....

มันจะทำงานแค่ครั้งเดียวครับ แล้วลบตัสเองออกไปเลย Cool!

มาดูวิธีใช้กันเลยดีกว่า

สมมุติผมเพิ่ง post กระทู้ลง forum ผมนะ

$this->load->library(’session’);
$userdata = array(‘username’ => ‘Tee++;’, ‘logged_in’ => TRUE);
$this->session->set_userdata($userdata);

หน้าถัดมาผมก็เอามาแสดงได้เลย

<?php
$this->load->library(’session’);
echo $this->session->flashdata(’status_msg’);
?>

โดยที่ session "status_msg" จะ destroy ตัวเอง ทันที หลังจากที่แสดงไปแล้ว Yep!

ลองไปใช้กันเองละกัน ผมก็แค่เอามา แนะนำอ่ะ

เออ แถมอีกนิด สำหรับการโม session lib ตัวนี้ให้มัน destroy ตัวเองได้หลังจาก ปิด browser

File: MY_Sesssion.php


<?php  if ( ! defined(‘BASEPATH’)) exit(‘No direct script access allowed’);
class MY_Session extends CI_Session {
 
        function _set_cookie($cookie_data = NULL)
        {
                if (is_null($cookie_data))
                {
                        $cookie_data = $this->userdata;
                }
 
                // Serialize the userdata for the cookie
                $cookie_data = $this->_serialize($cookie_data);
 
                if ($this->sess_encrypt_cookie == TRUE)
                {
                        $cookie_data = $this->CI->encrypt->encode($cookie_data);
                }
                else
                {
                        // if encryption is not used, we provide an md5 hash to prevent userside tampering
                        $cookie_data = $cookie_data.md5($cookie_data.$this->encryption_key);
                }
               
                // I’ve just changed a bit here. (Tee++;)
                if ($this->sess_expiration == -1)
                {
                        $expiration = 0;
                }
                else
                {
                        $expiration = $this->sess_expiration + time();
                }
 
                // Set the cookie
                setcookie(
                                        $this->sess_cookie_name,
                                        $cookie_data,
                                        $expiration,
                                        $this->cookie_path,
                                        $this->cookie_domain,
                                        0
                                );
        }
 
}
?>



**** เอา Code ด้านบนไปใส่ใน application/libraries/My_Session.php ****

เวลาเรียกใช้งาน แบบที่จะให้ทำลายตัวเองหลังจาก ปิด Browser

ให้เรียกตัวนี้ก่อนใช้งาน session lib ครับ

$this->config->set_item('sess_expiration', -1);

$this->load->library('session');


วันนี้อาจจะเห็นผมรีบเขียนแบบแปลกๆ จริงๆแล้วไม่ใช่อะไรเลยครับ "ผม มาววววววว" หลังจาก กระดก beer ไป สามขวด ก็นึกอยาก อัพเดทขึ้นมาน่ะ ทำใจหน่อยนะ อาจจะอ่านไม่รู้เรื่องไปบ้าง ก็ขอ อภัย อิอิ

twitter stumbleupon delicious digg facebook

3 comments

Add comment Load previous All comments

Leave a comment

Post Comment

Powered by OSCOOL. You may view this on RSS or ATOM.

OSCOOL

  • Twitter
  • Facebook
  • Next