--------------- <> -----------------
--- KHOA HỌC - CÔNG NGHỆ - GIÁO DỤC - VIỆC LÀM ---
--- Học để đi cùng bà con trên thế giới ---

Tìm kiếm trong Blog

Hiển thị các bài đăng có nhãn session. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn session. Hiển thị tất cả bài đăng

Ngu ngơ học làm web (87) - Session

Tiếp theo của: Ngu ngơ học làm web (86) - Lỗi và ngoại lệ
-----

Phần 87.       Session


Đây là clip số 100:


- Khi khai báo biến trên một trang PHP, biến này chỉ tồn tại và được nhận ra trên chính trang đó, khi người duyệt web chuyển trang (page) khác thì toàn bộ các biến (và giá trị của biến) sẽ bị hủy, do vậy để lưu lại giá trị của một biến nhằm sử dụng giữa các trang cần dùng tới session.

- Sử dụng session để lưu dữ liệu của người dùng trên server

- Nội dung của session chỉ được lưu tạm thời, nó sẽ bị xóa sau khi người dùng rời khỏi website

- Mỗi session có một định danh riêng

- Vị trí lưu session được quy định tại mục session.save_path trong php.ini

- Mỗi người truy cập (visitor) sẽ được tạo một chuỗi duy nhất, thông tin sẽ được chứa trong chuỗi duy nhất này

Một số hàm của session:

- session_start(): khởi tạo session

- Cập nhật thông tin session thông qua biến $_SESSION

- Xóa session: unset(), session_unset(), session_destroy()

Ví dụ:

  // khởi tạo session
  session_start();
  // tạo session
  $_SESSION['name'] = 'Nguyễn Văn Tèo';
  echo $_SESSION['name'];
  // thay đổi giá trị của session
  $_SESSION['name'] = 'abc';
  echo '<br />' . $_SESSION['name'];
  // kiểm tra session có tồn tại?
  if (isset($_SESSION['age'])) {
    $_SESSION['age'] = 10;
  } else {
    $_SESSION['age'] = 20;
  }
  echo '<br />' . $_SESSION['age'];
  unset($_SESSION['age']);
  if (isset($_SESSION['age'])) {
    echo 'Tồn tại';
  } else {
    echo 'Không tồn tại';
  }

Đây là clip số 101:


Các nội dung có thể lưu vào session: biến, mảng, hàm, tập tin, hình ảnh

Ví dụ,

Lưu biến vào session,

$variable = 'abc';
  session_start();
  $_SESSION['var'] = $variable;

  echo '<pre>';
  print_r($_SESSION);
  echo '</pre>';

Lưu mảng vào session,

$arr = array(
      array('tên' => 'Tèo', 'tuổi' => 10),
      array('tên' => 'Tí', 'tuổi' => 11),
      array('tên' => 'Sửu', 'tuổi' => 12)
    );
  session_start();
  // xóa các session trước đó
  session_unset();
  $_SESSION['arr'] = $arr;

  echo '<pre>';
  print_r($_SESSION);
  echo '</pre>';

Lưu hàm vào session:

session_start();
  // xóa các session trước đó
  session_unset();
  $_SESSION['func'] = 'function checkNumber($number) {
                          return($number % 2 ? "số lẻ" : "số chẵn");
                        }';
  eval($_SESSION['func']); // hàm eval($code) sẽ in ra, đánh giá và kiểm tra đoạn code $code theo cú pháp PHP
  echo checkNumber(2);

Lưu file vào session,

<?php
  session_start();
  //xóa các session trước đó
  session_unset();
  $_SESSION['file'] = '<!DOCTYPE html>
                        <html lang="en">
                        <head>
                          <meta charset="UTF-8">
                          <title>PHP</title>
                        </head>
                        <body>
                          <h1>This is a file</h1>
                        <?php
                          function checkNumber($number) {
                            return($number % 2 ? "số lẻ" : "số chẵn");
                          }
                        ?>';
  eval('?>' . $_SESSION['file']);
  echo checkNumber(3);
?>

Lưu ảnh vào session, (chỉ để mã PHP sẽ chạy)

<?php
  session_start();
  //xóa các session trước đó
  session_unset();
  $image = 'images/bg.jpg';
  if (file_exists($image)) {
    // lấy thông tin của một tập tin hình ảnh
    $_SESSION['image']['info'] = getimagesize($image);
    // lấy nội dung của hình ảnh
    $_SESSION['image']['data'] = file_get_contents($image);
  } else {
    echo 'Tập tin không tồn tại';
  }
  header('Content-type: image/jpeg');
  echo $_SESSION['image']['data'];
?>

Sử dụng hàm header() để xác định kiểu dữ liệu sẽ xuất.

Hàm session_encode(): chuyển nội dung đang được lưu trong session thành một chuỗi đặc biệt

Hàm session_decode(): phân tích chuỗi đặc biệt do hàm session_encode() tạo ra và lưu vào session.

Ví dụ về hàm session_encode(),

  session_start();
  //xóa các session trước đó
  session_unset();
  $_SESSION['var'] = 'abc';
  $session = session_encode();
  echo $session;

Kết quả xuất ra màn hình là: var|s:3:"abc";

Ví dụ về session_decode(),

  session_start();
  //xóa các session trước đó
  session_unset();
  $_SESSION['var'] = 'abc';
  $session = session_encode();
  echo $session;
  // xóa session
  session_unset();
  // in sẽ thấy session rỗng
  echo '<pre>';
  print_r($_SESSION);
  echo '</pre>';
  // khôi phục lại giá trị cũ của session
  session_decode($session);
  // in sẽ thấy session được phục hồi
  echo '<pre>';
  print_r($_SESSION);

  echo '</pre>';
-----------
Cập nhật [4/1/2018]
-----------
Xem thêm:

Ngu ngơ học làm web (x24) - CakePHP2 - Session, postLink, giỏ hàng

Tiếp theo của: Ngu ngơ học làm web (x23) - CakePHP2 – Link hình ảnh, Flash, Load theo vị trí
-----

Phần x24. CakePHP2 – Session, postLink, giỏ hàng


Xem (clip số 25 – chickenrainshop):

Trong CakePHP, có thể thao tác với session ở controller và view.

Controlller
View
Session component
Session helper
- check(): kiểm tra sự tồn tại của một session
- read(): đọc nội dung của một session
- write(): tạo mới hoặc chỉnh sửa nội dung của một session
- setFlash(), hoặc Flash->set(): gửi thông báo lên view
- delete(): xóa một session cụ thể
- destroy(): xóa tất cả các session đã tạo ra
Kiểm tra và hiển thị dữ liệu session đã được xử lý ở controller.
- check(): kiểm tra sự tồn tại của một session
- read(): đọc nội dung của một session
- flash() hoặc Flash->render(): hiển thị thông tin session đã được thiết lập trong hàm setFlash(), hoặc Flash->set()


Có hai loại session:

- Session thông thường: được lưu dưới dạng một cái tên, ví dụ A, có thể lưu vào A dữ liệu có kiểu bất kì như: kiểu số, chuỗi hoặc mảng.

- Session dạng mảng: một session sẽ có cấu trúc là một mảng, ví dụ B, để lấy giá trị: sử dụng B.key-1, B.key-2,…

Xem (clip số 26 – chickenrainshop):

- postLink - tạo một link giống một button (2":09)

- session->setFlash() - lưu thông báo xuống session(12":30)

postLink để tạo một link, khi người dùng bấm vào link, trình duyệt sẽ gửi một request dạng post về server. Ví dụ,

<?php echo $this->Form->postLink(
// nội dung hiển thị
            '<span class="glyphicon glyphicon-shopping-cart"></span> Thêm vào giỏ hàng',
            // URL và các tham số
            ['action' => 'addToCart', $book['Book']['id']],
            // thông tin tùy chọn
            ['class' => 'btn btn-primary', 'escape' => false]);
?>

Mục đích của tham số escape=>false là để trình duyệt xuất nội dung của phần '<span class="glyphicon glyphicon-shopping-cart"></span> Thêm vào giỏ hàng', ra màn hình chứ không xuất nguyên mã HTML.

Tạo giỏ hàng là tạo một mảng để lưu các sản phẩm, ví dụ:

- Tạo một sản phẩm với các thông tin đi kèm:

$item = [
                                                'id' => $book['Book']['id'],
                                                'title' => $book['Book']['title'],
                                                'slug' => $book['Book']['slug'],
                                                'sale_price' => $book['Book']['sale_price'],
                                                'quantity' => 1
                                    ];

- Lưu sản phẩm vào session kiểu mảng có tên là cart, tại vị trí cart.id:

$this->Session->write('cart.'.$id, $item);

- Thiết lập nội dung thông báo để hiển thị lên view:

$this->Flash->success('Đã thêm quyển sách vào trong giỏ hàng!', [
                                                'params' => [
                                                            'class' => 'alert alert-info'
                                                ]]);

- Lưu ý là sau khi CakePHP thực hiện xong action, nó luôn gửi kết quả tới view tương ứng, vì vậy nếu không có view, nó sẽ báo lỗi. Ở đây không tạo view addToCart, nên sẽ gửi kết quả lên view view.ctp.

$this->redirect($this->referer()); // chuyển hướng về chính cái trang đã gọi action

Khi thiết lập nội dung thông báo để hiển thị lên view, nên đặt tên cho mỗi thông báo để hiển thị chính xác thông báo đó, ví dụ:

[trong controller]

$this->Flash->success('Đã thêm quyển sách vào trong giỏ hàng!', [
                                                'key' => 'cart',
                                                'params' => [
                                                            'class' => 'alert alert-info'
                                                ]]);

[trong view]

<?php echo $this->Flash->render('cart'); ?>

[Controller\BooksController.php action addToCart()]

public function addToCart($id = null) {
                        if ($this->request->is('post')) {
                                    // tìm thông tin về sản phẩm
                                    $book = $this->Book->find('first', [
                                                'recursive' => -1,
                                                'conditions' => ['Book.id' => $id]
                                                ]);
                                    if ($this->Session->check('cart.'.$id)) {
                                                $item = $this->Session->read('cart.'.$id);
                                                $item['quantity'] += 1;
                                    } else {
                                                $item = [
                                                'id' => $book['Book']['id'],
                                                'title' => $book['Book']['title'],
                                                'slug' => $book['Book']['slug'],
                                                'sale_price' => $book['Book']['sale_price'],
                                                'quantity' => 1
                                                ];
                                    }
                                    // tạo giỏ hàng và thêm sản phẩm vào giỏ hàng
                                    $this->Session->write('cart.'.$id, $item);
                                    $this->Flash->success('Đã thêm quyển sách vào trong giỏ hàng!', [
                                                'key' => 'cart',
                                                'params' => [
                                                            'class' => 'alert alert-info'
                                                ]]);
                                    $this->redirect($this->referer());
                        }

            }
-----------
Cập nhật 30/5/2017
-----------
Xem thêm:
Tổng hợp các bài viết về Ngu ngơ học làm web