Lỗi hiển thị

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp74\htdocs\web02\examples\login.php:8) in C:\xampp74\htdocs\web02\examples\login.php on line 21

Nguyên nhân lỗi

Nguyên nhân là trong lập trình web, chúng ta không thể thay đổi lại Response Header (khi header đã được gởi trả về cho Client). Theo lưu đồ trong hình, chúng ta có 3 đoạn code:
  1. Đoạn code 1: là code PHP, nhiệm vụ hiển thị tất cả các lỗi và cảnh bảo để tiện cho việc phát triển, gỡ lỗi trên môi trường Lập trình. Lưu ý, khi triển khai lên hệ thống thực tế (môi trường Production) không nên sử dụng, sẽ bị lộ thông tin -> hacker có thể tất công web của bạn.
  2. Đoạn code 2: là code HTML, khai báo <!DOCTYPE html>, ngay khi thực hiện dòng code này, sẽ lập tức tạo 1 response trả về cho người dùng (Response Header đã được tạo và trả về người dùng).
  3. Đoạn code 3: là code PHP, chúng ta yêu cầu set giá trị cho Cookie (tức là thay đổi Response Header - đóng thêm 1 dấu mộc, hay thêm thông tin vào trong Response Header).
Do theo thứ tự viết code thực thi đoạn 1 -> 2 -> 3. Do đó chúng ta sẽ bị cảnh báo lỗi như trên.

Ví dụ đoạn code lỗi:

<?php
// Cấu hình để PHP hiện tất cả Lỗi (ERROR) và Cảnh báo (WARNING)
// Chỉ nên sử dụng khi đang phát triển
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
?>

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Học lập trình PHP - Nền tảng Kiến thức</title>
</head>
<body>
  <?php
  $cookie_name = "username";
  $cookie_value = "Nền Tảng";
  setcookie($cookie_name, $cookie_value, time() + 3600, "/");
  ?>
</body>
</html>

Cách khắc phục

Có 2 cách để khác phục lỗi này

Cách 1: Bổ sung hàm Output Buffering

Bạn phải đảm bảo rằng, các các liên quan đến Response Header phải được thao tác trước khi trả về cho Client. Vì vậy tốt nhất là đưa vào bộ nhớ đệm trước khi trả về cho người dùng.

Code fix:

<?php
ob_start(); //<--- Dòng code yêu cầu Output Buffering
// Cấu hình để PHP hiện tất cả Lỗi (ERROR) và Cảnh báo (WARNING)
// Chỉ nên sử dụng khi đang phát triển
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
?>

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Học lập trình PHP - Nền tảng Kiến thức</title>
</head>
<body>
  <?php
  $cookie_name = "username";
  $cookie_value = "NenTang.vn";
  setcookie($cookie_name, $cookie_value, time() + 3600, "/");
  ?>
  <h1>Đã bổ sung phần viết code, hết lỗi ✌</h1>
</body>
</html>
<?php 
ob_end_flush(); //<--- Dòng code yêu cầu in ra tất cả và trả về reponse cho người dùng (Client) 
?>

Cách 2: Thay đổi cấu hình của PHP

Step 1: Hiệu chỉnh file cấu hình của PHP

  • Nếu cài XAMPP mặc định thì nằm ở: C:\xampp\php\php.ini
  • Tìm đòng code, nếu không có thì bổ sung: output_buffering=4096

Step 2: Khởi động lại tiến trình Apache của XAMPP

Done!

Bonus liên quan đến Header

header() không hoạt động header() hoạt động
<?php
     echo "Không thể tìm thấy trang, vui lòng thử một URL khác!";
    header("HTTP/1.0 404 Not Found"); //<-- KHÔNG HOẠT ĐỘNG (WARNING LOG)
<?php
     header("HTTP/1.0 404 Not Found"); //<-- HOẠT ĐỘNG BÌNH THƯỜNG echo "Không thể tìm thấy trang, vui lòng thử một URL khác!";
<?php   ...   echo $pdf_file_data;   header('Content-Type: application/pdf'); // <-- KHÔNG HOẠT ĐỘNG(WARNING LOG) <?php   ...   header('Content-Type: application/pdf'); // <-- HOẠT ĐỘNG BÌNH THƯỜNG   echo $pdf_file_data;