Ngu ngơ học làm web (94) - Học PHP bằng tiếng Anh - 2

Tiếp theo của: Ngu ngơ học làm web (93) - Học PHP bằng tiếng Anh - 1
------

Phần 94.       Học PHP bằng tiếng Anh – 2


38-Array

39-Associative array

40-Multi-dimensional aray

41-Vòng lặp foreach

42-Include và require

43-Include_once và require_once

44-Expression matching

45-Expression matching (tiếp)

46-String function : string length

47-Hàm đổi chữ hoa, chữ thường

48-String position

49-String position (tt)

50-Thay thế một phần chuỗi

51-Replacing Predefined Part of a String

52-Word Censoring (kiểm duyệt văn bản gửi về server)

53-Word Censoring (kiểm duyệt văn bản gửi về server)(tt)

54-Creating a Find and Replace Application Part 1

55-Creating a Find and Replace Application Part 2

56-Creating a Find and Replace Application Part 3

57-Creating a Find and Replace Application Part 4

58-timestamp

59- Modifying timestamps

60- Random Number Generation

61- $_SERVER Variables: Script Name

Sử dụng biến $_SERVER[‘SCRIPT_NAME’] để lấy đường dẫn (thư mục) hiện tại của trang web, sau đó gán vào thuộc tính action của form.

Ví dụ,

<?php
            $script_name = $_SERVER['SCRIPT_NAME'];
?>
<form action="<?php echo $script_name; ?>" method="post">
            <input type="submit" value="Submit">
</form>

62- $_SERVER Variables: Host Name

Sử dụng biến $_SERVER[‘HTTP_HOST’] để lấy phần hostname của một URL, dùng để thiết lập các đường dẫn linh hoạt hơn.

Ví dụ,

<?php
            $host = $_SERVER['HTTP_HOST'];
            $images = $host.'/images/';
            echo '<img src="'.$images.'abc.gif" >';
?>

63- Using the Header to Force Page Redirect

Sử dụng hàm header để chuyển hướng trang web sang một trang mới.

Ví dụ,

<?php
            header('location: http://www.google.com');
?>

Đọc thêm về hàm header tại đây:

64- ob_start

65- Getting Visitors IP Address
Lấy địa chỉ IP của người truy cập trang web, và cấm truy cập trang web.

66- Better Way to Get Visitors IP Address
Các hàm khác để lấy IP của người truy cập.

Ví dụ,

<?php
            $http_client_ip = $_SERVER['HTTP_CLIENT_IP'];
            $http_x_forwarded_for = $_SERVER['HTTP_X_FORWARDED_FOR'];
            $remote_addr = $_SERVER['REMOTE_ADDR'];

            if(!empty($http_client_ip)) {
                        $ip_address = $http_client_ip;
            }else if (!empty($http_x_forwarded_for)) {
                        $ip_address = $http_x_forwarded_for;
            } else {
                        $ip_address = $remote_addr;
            }

            echo $ip_address;
?>

67-68 Detecting a Visitors Browser
Để kiểm tra xem người dùng đang sử dụng trình duyệt nào, khuyến cáo họ đổi trình duyệt khác nếu cần.

Tuy nhiên, làm theo clip sẽ không có kết quả như mong muốn. Có người đã thắc mắc trên Stackoverflow: http://stackoverflow.com/questions/31197898/how-can-i-detect-a-visitors-browser-using-php

Sử dụng hàm khác để thay thế,

<?php
function getBrowser(){

$agent = $_SERVER['HTTP_USER_AGENT'];
$name = 'NA';

if (preg_match('/MSIE/i', $agent) && !preg_match('/Opera/i', $agent)) {
    $name = 'Internet Explorer';
} elseif (preg_match('/Firefox/i', $agent)) {
    $name = 'Mozilla Firefox';
} elseif (preg_match('/Chrome/i', $agent)) {
    $name = 'Google Chrome';
} elseif (preg_match('/Safari/i', $agent)) {
    $name = 'Apple Safari';
} elseif (preg_match('/Opera/i', $agent)) {
    $name = 'Opera';
} elseif (preg_match('/Netscape/i', $agent)) {
    $name = 'Netscape';
}

return $name;
}

echo getBrowser();
?>

69-70-Working with $_GET, $_POST Variables

Làm việc với biến $_GET, $_POST.

Trước khi sử dụng một biến $_GET, $_POST,

- Cần kiểm tra nó có tồn tại không, nói cách khác là nó đã được gửi lên (submit) chưa: dùng hàm isset()

- Và kiểm tra nó có giá trị chưa: dùng hàm empty()

Ví dụ,

<?php
            if(isset($_GET['name'])) {
                        $name = $_GET['name'];
                        if(!empty($name)) {
                                    // các lệnh xử lý
                        }
            }

?>
-----------
Cập nhật 31/1/2018
-----------
Xem thêm:
Tổng hợp các bài viết về Ngu ngơ học làm web

Ngu ngơ học làm web (93) - Học PHP bằng tiếng Anh - 1

Tiếp theo của: Ngu ngơ học làm web (92) - Phân biệt front-end, back-end và full-stack
------

Phần 93.       Học PHP bằng tiếng Anh - 1


Học thêm những kiến thức mới và học tiếng Anh chuyên ngành. Khi đã đọc và nghe được tiếng Anh chuyên ngành rồi thì không quá khó để cập nhật những công nghệ mới từ cộng đồng làm nghề trên thế giới. Không loay hoay với cái “ao làng” nữa.
Đây là loạt bài giảng gồm 200 clip, thời gian khoảng 16 tiếng, do TheNewBoston thực hiện và chia sẻ.

1- Giới thiệu về PHP:

2,3-Cài đặt XAMPP:

4-Tổ chức thư mục của XAMPP:

5-Chương trình đầu tiên:

6-Hàm phpinfo(); để xem thông tin về PHP, Apache,...v.v.:

7-Tập tin php.ini

8-Bố cục khi viết mã (indentation): cách viết dấu { }, thụt đầu hàng,…v.v

9-echo

10-print

11-Xuất HTML bằng echo/print, dấu nháy đơn và nháy kép:

12-Nhúng PHP trong HTML

13-Chú thích

14,15-Cho PHP hiển thị thông báo khi có lỗi:

Để cho PHP hiển thị thông báo lỗi, thực hiện như sau:

- Tìm tới thư mục C:\xampp\php, mở tập tin php.ini

- Tìm tới hàng có nội dung: error_reporting=

- Sửa lại hàng đó thành như sau: error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT

- Stop và Start lại XAMPP

- Nếu chưa hiển thị lỗi, kiểm tra dòng này: display_errors = , đảm bảo phải được thiết lập là On.

- Stop và Start lại XAMPP

Hiển thị thông báo lỗi có liên quan đến vấn đề bảo mật của website, vì vậy nên để ý vấn đề này.

16-Variables

17-Concatenation – toán tử nối (.)

18,19-if else

20-Toán tử gán

21-Toán tử so sánh

22-Phép toán đại số

23-Phép toán logic

24-Dấu ===

25-Vòng lặp while

26-Vòng lặp do-while

27-Vòng lặp for

28- Lệnh switch


Hàm die và exit có chức năng giống nhau, đó là: xuất thông báo và kết thúc việc biên dịch mã PHP. Ví dụ,
<?php
            echo 'xin chào';
            die('<br> tạm biệt');
            echo 'chào lại';
?>

30-Hàm

31-Hàm có truyền đối số

32-Hàm có trả về giá trị

33-Biến toàn cục

34-String functions1

35-String functions2

36-String functions3

37-String functions4
https://www.youtube.com/watch?v=yx6VDuD5iXk&list=PL442FA2C127377F07&index=38
-----------
Cập nhật 15/1/2018
-----------
Xem thêm:
Tổng hợp các bài viết về Ngu ngơ học làm web

Ngu ngơ học làm web (90) - Gửi email

Tiếp theo của: Ngu ngơ học làm web (89) - Cookie
-----

Phần 90.       Gửi email


Đây là clip số 105:


Cấu hình XAMPP để gửi email từ local bằng hàm mail của PHP.

Cấu hình trong tập tin php.ini tại đường dẫn: \xampp\php\php.ini. Cấu hình các mục sau:

extension=php_sockets.dll
extension=php_openssl.dll
sendmail_path ="\"D:\xampp\sendmail\sendmail.exe\" -t"

Cấu hình các thông tin sau trong tập tin sendmail.ini tại đường dẫn: \xampp\sendmail\sendmail.ini

smtp_server=smtp.gmail.com
smtp_port=465
smtp_ssl=ssl
default_domain=localhost
error_logfile=error.log
debug_logfile=debug.log
auth_username=xxx@gmail.com //tên một hộp thư gmail hợp lệ, dùng email này để gửi  
auth_password: //mật khẩu của hộp thư gmail ở trên
hostname=localhost

Sau khi cấu hình xong các thông tin ở trên, nhớ restart XAMPP để nó cập nhật các giá trị vừa mới sửa đổi.

Sử dụng hàm mail của PHP để gửi email, cú pháp của hàm mail:

mail($to, $subject, $message, $header)

- $to: địa chỉ email người nhận

- $subject: tiêu đề của email

- $message: nội dung email

- $header: chứa các thông tin cấu hình, quản lý, ví dụ CC, BCC,

Hàm mail sẽ trả về giá trị “true” nếu thành công (tuy không chắc chắn đã gửi tới được đích, chỉ là đã hoàn thành việc gửi email) và trả về giá trị “false” nếu thất bại.

Ví dụ,

<?php
  $to = 'xxx@gmail.com'; //tên hộp thư nhận email
  $subject = 'test mail';
  $message = 'content of email';
  $header = 'from:abc@gmail.com';

  if (mail($to, $subject, $message, $header)) {
    echo 'thanh cong';
  } else {
    echo 'that bai';
  }
?>

Khi chạy đoạn mã trên có thể gặp lỗi này (xem trong tập tin error.log):

<https://accounts.google.com/signin/continue?sarp=1&scc=1&plt=AKgnsbvH<EOL>wU53sSUsUXEeZdJHMkRcAQ6aFlQw1-bVfd5aoAM4_SkZO7MVd4cdG5AjdBe_SddXY8wIa0<EOL>-iwKTdED2cqWKVm1HgM7j9EbLJalYKEL6ef9TgP9GBx2jCLNZFt2YewbAlbSiANnxmgppz<EOL>sdvUxQddYoj4i8ByN82r61aZy7A22GHiM39P8-wt11VQIeCjwOkMuaoT8tHNiclxnjUhFK<EOL>2bVvAk8Bs_uQnl92J2xtKFr1NqVdk> Please log in via your web browser and<EOL>then try again.<EOL> Learn more at<EOL> https://support.google.com/mail/answer/78754 r9sm11864905pgp.78 - gsmtp<EOL>

Lỗi trên là do email của gmail được bảo mật, nên không cho ứng dụng được phép truy cập vào để gửi email, kết quả là ứng dụng web sẽ bị lỗi. Nghĩa là ‘Allow less secure apps’ đang ở chế độ OFF, cần chuyển sang chế độ ON để chạy được đoạn mã và kiểm tra. Sau đó nhớ chuyển email về lại chế độ OFF để đảm bảo an toàn cho hộp thư.

Đăng nhập vào hộp thư gmail, sau đó bấm vào link này để chuyển hộp thư sang chế độ ít an toàn: 


Muốn gửi email tới nhiều người, chỉ việc thêm hộp thư đến vào biến $to, ví dụ,

$to = 'xxx@gmail.com, yyy@gmail.com';

Nếu muốn gửi email mà phần nội dung có kèm theo thẻ HTML, thì trong header thêm thuộc tính Content-type: text/html, ví dụ,

  $message = '<h3 style="color: red">content of email<h3>';
  $header = 'from:abc@gmail.com' . "\r\n";
  $header .= 'Content-type: text/html';   

Để gửi Cc và Bcc, chỉ cần thêm thông tin vào $header, ví dụ,

$header = 'from:abc@gmail.com' . "\r\n";
  $header .= 'Content-type: text/html' . "\r\n";

  $header .= 'Cc: xyz@gmail.com';
-----------
Cập nhật [16/9/2020]
-----------
Xem thêm:

Ngu ngơ học làm web (89) - Cookie

Tiếp theo của: Ngu ngơ học làm web (88) - Bài tập về session
-----

Phần 89.       Cookie


Đây là clip số 104:


- Cookie được sử dụng để lưu trữ dữ liệu người dùng trên máy client.

- Mỗi trình duyệt trên máy client có một vùng nhớ cookie riêng, vì vậy nếu dùng hai trình duyệt truy cập vào cùng một website thì sẽ có hai cookie khác nhau.

Để tạo cookie, sử dụng hàm:

setcookie($name, $value, $time)

- $name: tên cookie

- $value: giá trị gán cho $name

- $time: thời gian tồn tại của cookie $name

Ví dụ,

<?php
  setcookie('myCookie','my test', time() + 60); //thời gian tồn tại là 1 phút
?>

Sau khi chạy đoạn mã trên, vào xem giá trị của cookie vừa lưu, trong trình duyệt chrome:

- Mở menu ở góc trên, bên phải của trình duyệt

- Vào mục Settings, bấm tiếp vào mục Advanced ở cuối màn hình

- Trong mục Privacy and security, chọn mục Content settings, chọn tiếp mục Cookies

- Chọn mục See all cookies and site data, các cookie sẽ được sắp xếp tăng theo tên của trang web. Có thể xóa tất cả cookie bằng nút REMOVE ALL, sau đó chạy lại đoạn mã PHP, để tìm cookie dễ hơn.

Để truy cập cookie, sử dụng biến $_COOKIE

Ví dụ,

setcookie('myCookie','my test', time() + 60); //thời gian tồn tại là 1 phút
  echo '<pre>';
  print_r($_COOKIE);
  echo '</pre>';

Hoặc,

  setcookie('myCookie','my test', time() + 60); //thời gian tồn tại là 1 phút
  echo '<pre>';
  print_r($_COOKIE['myCookie']);
  echo '</pre>';

Để xóa cookie, sử dụng một trong hai hàm sau:

- setcookie($name), với $name là tên cookie muốn xóa

- setcookie($name, $value, $time), với $time thuộc về quá khứ

Ví dụ,

setcookie('myCookie','my test', time() + 20);
  setcookie('myCookie');
  echo '<pre>';
  print_r($_COOKIE);
  echo '</pre>';

Ví dụ,

setcookie('myCookie','my test', time() + 20);
  setcookie('myCookie', 'abc', time() - 1);
  echo '<pre>';
  print_r($_COOKIE);
  echo '</pre>';

Bài tập: khi truy cập vào trang web, hãy xuất thời gian đăng nhập của lần gần đây nhất. Đây là đoạn mã,

  echo 'Xin chào!' . '<br>';
 
  if (isset($_COOKIE['lastLogin'])) {
    $time = $_COOKIE['lastLogin'];
    echo 'last login: ' . date('d/m/Y H:i:s', $time);
    setcookie('lastLogin',time());
  } else {
    setcookie('lastLogin',time(), time() + 3600);
  }

Bài tập:

- Kiểm tra thông tin đăng nhập của người dùng, nếu khớp với thông tin người dùng trong tập tin users.ini thì tạo cookie lưu lại thông tin đăng nhập.

- Sau khi người dùng đăng nhập thành công, duy trì việc đăng nhập này trong 20 giây, quá thời gian này, tự động đăng xuất người dùng.

[index.php]

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <link href="css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
  <div class="container">
    <?php
    if (isset($_COOKIE['fullname'])) {
      echo '<h3> Xin chào: ' . $_COOKIE['fullname'] . '</h3>';
      echo '<a href="logout.php">Đăng xuất</a>';
    } else {
      ?>
    <h3 class="text-center">Login</h3>
    <div class="row">
      <div class="col-md-4 col-md-offset-4">
       <form action="process.php" method="post">
        <div class="form-group">
          <label for="username">Username</label>
          <input type="text" id="username" name="username"class="form-control">
        </div>
        <div class="form-group">
          <label for="password">Password</label>
          <input type="password" id="password" name="password" class="form-control">
        </div>
        <button type="submit" class="btn btn-primary">Đăng nhập</button>
      </form>
    </div>
  </div>
  <?php
      }
  ?>
</div>
</body>
</html>

[process.php]

<h3 class="text-center">process</h3>
<?php
  // kiểm tra dữ liệu khác rỗng
  function checkEmpty($value) {
    $flag = false;
    if (!isset($value) || trim($value) == '') {
      $flag = true;
    }
    return $flag;
  }

  if (isset($_COOKIE['fullname'])) {
    echo '<h3> Xin chào: ' . $_COOKIE['fullname'] . '</h3>';
    echo '<a href="logout.php">Đăng xuất</a>';
  } else {
    if (!checkEmpty($_POST['username']) && !checkEmpty($_POST['password'])) {
      $username = $_POST['username'];
      $password = md5($_POST['password']);
      $data = parse_ini_file('users.ini');
      if (array_key_exists($username, $data)) {
        $userInfo = explode ('|', $data[$username]);
        if ($username == $userInfo[0] && $password == $userInfo[1]) {
          setcookie('fullname', $userInfo[2], time() + 200);
          echo '<h3> Xin chào: ' . $userInfo[2] . '</h3>';
          echo '<a href="logout.php">Đăng xuất</a>';
        } else {
          header('location:index.php');
        }
      }else {
        header('location:index.php');
      }
    } else {
    // die('test');
      header('location:index.php');
    }
  }
?>

[logout.php]

<?php
  setcookie('fullname');
  header('location:index.php');
?>

[users.ini]

teo = "teo|c4ca4238a0b923820dcc509a6f75849b|Nguyen Van Teo"
ti = "ti|c81e728d9d4c2f636f067f89cc14862c|Tran Van Ti"

So sánh session và cookie:


Session
Cookie
Lưu dữ liệu tại server
Lưu dữ liệu tại client
Bị xóa khi người dùng đóng trình duyệt
Bị xóa khi hết thời gian tồn tại
Bảo mật hơn do lưu trên server
Dễ bị chỉnh sửa, do tồn tại trên máy của người dùng

-----------
Cập nhật [8/1/2018]
-----------
Xem thêm:

Ngu ngơ học làm web (88) - Bài tập về session

Tiếp theo của: Ngu ngơ học làm web (87) - Session
-----

Phần 88.       Bài tập về session


Đây là clip số 102:


Lưu lại thông tin đăng nhập của người dùng vào session trong một khoảng thời gian, ví dụ 20 giây. Trong khoảng thời gian 20 giây này, người dùng có thể thực hiện mọi thao tác. Khi hết thời gian 20 giây, thông tin đăng nhập của người dùng trong session sẽ bị xóa.

Tạo giao diện,

[index.php]

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <link href="css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
  <div class="container">
    <h3 class="text-center">Login</h3>
    <div class="row">
      <div class="col-md-4 col-md-offset-4">
       <form action="process.php" method="post">
        <div class="form-group">
          <label for="username">Username</label>
          <input type="text" id="username" name="username"class="form-control">
        </div>
        <div class="form-group">
          <label for="password">Password</label>
          <input type="password" id="password" name="password" class="form-control">
        </div>
        <button type="submit" class="btn btn-primary">Đăng nhập</button>
      </form>
    </div>
  </div>
</div>
</body>
</html>

Tập tin users.txt sẽ chứa tên đăng nhập, mật khẩu và tên đầy đủ của người dùng. Mã hóa mật khẩu bằng MD5, ví dụ vào trang http://www.md5.cz/, nhập mật khẩu để có được chuỗi mã hóa.

Sử dụng hàm header() để điều hướng trang web, ví dụ:

if (!checkEmpty($_POST['username']) && !checkEmpty($_POST['password'])) {
    echo '<pre>';
    print_r($_POST);
    echo '</pre>';

  } else {
    header('location:index.php');
  }

[users.txt]

teo|c4ca4238a0b923820dcc509a6f75849b|Nguyen Van Teo
ti|c81e728d9d4c2f636f067f89cc14862c|Tran Van Ti

Nếu đăng nhập đúng tên người dùng trong tập tin users.txt, thì xuất ra thông tin của người dùng đó ra màn hình.

[process.php]

<?php
  // kiểm tra dữ liệu khác rỗng
  function checkEmpty($value) {
    $flag = false;
    if (!isset($value) || trim($value) == '') {
      $flag = true;
    }
    return $flag;
  }

  if (!checkEmpty($_POST['username']) && !checkEmpty($_POST['password'])) {
    $username = $_POST['username'];
    $password = $_POST['password'];
    $data = file('users.txt');
    foreach ($data as $value) {
      $user = explode('|', $value);
        if ($user[0] == $username) {
          echo '<pre>';
          print_r($user);
          echo '</pre>';
          break;
        }
    }
  } else {
    header('location:index.php');
  }
?>

Cách làm trên không tối ưu về tốc độ xử lý.

Viết lại bằng giải pháp khác.

Đổi tập tin users.txt thành users.ini.

[users.ini]

teo = "teo|c4ca4238a0b923820dcc509a6f75849b|Nguyen Van Teo"
ti = "ti|c81e728d9d4c2f636f067f89cc14862c|Tran Van Ti"

[process.php]

<?php
  // kiểm tra dữ liệu khác rỗng
  function checkEmpty($value) {
    $flag = false;
    if (!isset($value) || trim($value) == '') {
      $flag = true;
    }
    return $flag;
  }

  if (!checkEmpty($_POST['username']) && !checkEmpty($_POST['password'])) {
    $username = $_POST['username'];
    $password = $_POST['password'];
    $data = parse_ini_file('users.ini');
    if (array_key_exists($username, $data)) {
      echo $userInfo = $data[$username];
    }
  } else {
    header('location:index.php');
  }
?>

Đây là clip số 103:


Kiểm tra thông tin đăng nhập của người dùng, nếu khớp với thông tin người dùng trong tập tin users.ini thì tạo session lưu lại thông tin đăng nhập.

Sau khi người dùng đăng nhập thành công, duy trì việc đăng nhập này trong 20 giây, quá thời gian này, tự động đăng xuất người dùng.

[index.php]

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <link href="css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
  <div class="container">
     <?php
     session_start();
     if (isset($_SESSION['flagPermission'])) {
      if (time() - 20 > $_SESSION['timeout']) {
        session_unset();
        header('location:index.php');
      } else {
        echo '<h3> Xin chào: ' . $_SESSION['fullname'] . '</h3>';
        echo '<a href="logout.php">Đăng xuất</a>';
      }
    } else {
      ?>
    <h3 class="text-center">Login</h3>
    <div class="row">
      <div class="col-md-4 col-md-offset-4">
       <form action="process.php" method="post">
        <div class="form-group">
          <label for="username">Username</label>
          <input type="text" id="username" name="username"class="form-control">
        </div>
        <div class="form-group">
          <label for="password">Password</label>
          <input type="password" id="password" name="password" class="form-control">
        </div>
        <button type="submit" class="btn btn-primary">Đăng nhập</button>
      </form>
    </div>
  </div>
  <?php
      }
  ?>
</div>
</body>
</html>

[process.php]

<h3 class="text-center">process</h3>
<?php
  // kiểm tra dữ liệu khác rỗng
  function checkEmpty($value) {
    $flag = false;
    if (!isset($value) || trim($value) == '') {
      $flag = true;
    }
    return $flag;
  }

  session_start();
  if (isset($_SESSION['flagPermission'])) {
    if (time() - 20 > $_SESSION['timeout']) {
      session_unset();
      header('location:index.php');
    } else {
      echo '<h3> Xin chào: ' . $_SESSION['fullname'] . '</h3>';
      echo '<a href="logout.php">Đăng xuất</a>';
    }
  } else {
    if (!checkEmpty($_POST['username']) && !checkEmpty($_POST['password'])) {
      $username = $_POST['username'];
      $password = md5($_POST['password']);
      $data = parse_ini_file('users.ini');
      if (array_key_exists($username, $data)) {
        $userInfo = explode ('|', $data[$username]);
        if ($username == $userInfo[0] && $password == $userInfo[1]) {
          $_SESSION['fullname'] = $userInfo[2];
          $_SESSION['flagPermission'] = true;
          $_SESSION['timeout'] = time();
          echo '<h3> Xin chào: ' . $_SESSION['fullname'] . '</h3>';
          echo '<a href="logout.php">Đăng xuất</a>';
        } else {
          header('location:index.php');
        }
      }else {
        header('location:index.php');
      }
    } else {
    // die('test');
      header('location:index.php');
    }
  }
?>

[logout.php]

<?php
  session_start();
  session_unset();
  header('location:index.php');

?>
-----------
Cập nhật [8/1/2018]
-----------
Xem thêm:

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 (86) - Lỗi và ngoại lệ

Tiếp theo của: Ngu ngơ học làm web (85) - Filter và validate trong PHP
-----

Phần 86.       Lỗi và ngoại lệ


Đây là clip số 98:


Các lỗi thường gặp trong PHP:

- Đặt tên hàm, tên biến không theo quy ước (chương trình vẫn chạy bình thường, tuy nhiên gây ra tâm lý rất khó chịu cho các thành viên làm chung)

- Gõ sai tên hàm, tên biến

- Thiếu các dấu kết thúc câu lệnh, dấu bao khối lệnh

- Lỗi khi thực thi đoạn mã

Sử dụng câu lệnh die() để kết thúc ngay chương trình, sử dụng trong quá trình dò tìm và sửa lỗi (debug).

Xem ví dụ sau:

  if (file_exists('data.txt')) {
    $data = file_get_contents('data.txt');
    foreach($data as $key => $value) {
      echo $value['name'] . '<br />';
    }
  } else {
    echo 'File not found';
  }
  echo '<br /> Should not appear'; 

Ở ví dụ trên, trong trường hợp tập tin data.txt không tồn tại, thì đoạn mã sẽ kết thúc ngay khi xuất câu thông báo ‘File not found’, tuy nhiên câu ‘Should not appear’ vẫn xuất hiện.

Sử dụng hàm die($variable) để xuất nội dung $variable và kết thúc chương trình:

  if (file_exists('data.txt')) {
    $data = file_get_contents('data.txt');
    foreach($data as $key => $value) {
      echo $value['name'] . '<br />';
    }
  } else {
    die('File not found');
  }
  echo '<br /> Should not appear';

Ẩn thông báo lỗi trên giao diện web: khi đưa website vào vận hành, nên thiết lập cơ chế để không cho hệ thống hiển thị các thông báo lỗi ra màn hình giao diện. Nếu có lỗi, nên ghi vào tập tin log để theo dõi và tìm cách khắc phục.

Để đọc tập tin cấu hình của PHP, tập tin php.ini, sử dụng hàm: ini_get_all().

Ví dụ,

// xuất giá trị của một tham số
  echo ini_get('date.timezone');
// xuất tất cả các tham số
  $config = ini_get_all();
  echo '<pre>';
  print_r($config);
  echo '</pre>';

Để thay đổi giá trị trong tập tin php.ini, sử dụng hàm ini_set($varname, $newvalue); Ví dụ:

  echo ini_get('date.timezone');
  ini_set('date.timezone', 'Asia/Ho_Chi_Minh');
  echo '<br />';
  echo ini_get('date.timezone');

Ví dụ sau sẽ không hiển thị thông báo lỗi của đoạn mã bên dưới,

  // tắt thông báo lỗi
  ini_set('display_errors', 'off');
  // bật chế độ ghi lỗi vào tập tin log
  ini_set('log_errors', 'on');
  // ghi vào tập tin php_error.log trong thư mục gốc của dự án
  ini_set('error_log', 'php_error.log');
  // đoạn mã sau sẽ có lỗi
  foreach ($array as $key => $value) {
    echo $value;
  }

Cho phép các lỗi nào thì được hiển thị lên giao diện web: sử dụng hàm error_reporting() hoặc ini_set(‘error_reporting’, VALUE)

- Ẩn tất cả lỗi: error_reporting(0)

- Hiển thị tất cả lỗi: error_reporting(E_ALL)

- Hiển thị phần warning: error_reporting(E_WARNING)

- Hiển thị các phần notice: error_reporting(E_NOTICE)

- Giá trị hiển thị được thiết lập mặc định: error_reporting(E_ALL ^ E_NOTICE) // hiển thị tất cả lỗi, nhưng không hiển thị notice.

Đây là clip số 99:


Tùy biến hàm xuất thông báo lỗi:

error_function(error_level, error_message, error_file, error_line, error_context)
- error_level: gồm E_NOTICE, E_WARNING, E_ALL,…
- error_message: nội dung thông báo lỗi muốn hiển thị
- error_file: tên tập tin xảy ra lỗi
- error_line: lỗi ở hàng nào
- error_context: thông tin liên quan đến các biến GET, POST,…

Ví dụ,

function myError($error_level, $error_message, $error_file, $error_line, $error_context) {
    // các biến ($error_level, $error_message, $error_file, $error_line, $error_context)
    // đều đã có giá trị, sẽ tùy biến việc hiển thị
    $result[] = 'Mã lỗi: ' . $error_level . '<br />';
    $result[] = 'Tên lỗi: ' . $error_message . '<br />';
    $result[] = 'Tập tin bị lỗi: ' . $error_file . '<br />';
    $result[] = 'Lỗi tại hàng: ' . $error_line . '<br />';

    $result = implode(' ', $result);
    die($result);
  }
  // đăng kí các thông báo lỗi
  set_error_handler('myError');
  // đoạn mã tạo ra lỗi
  foreach ($array as $key => $value) {
    echo $value;

  }
-----------
Cập nhật [16/9/2020]
-----------
Xem thêm: