Câu lệnh điều kiện

Sau khi nắm vững toán tử trong PHP, bước tiếp theo là học cách kiểm soát luồng chương trình thông qua câu lệnh điều kiện trong PHP. Điều kiện giúp chương trình “ra quyết định” – thực thi đoạn code này hay đoạn code khác tùy theo tình huống. Từ kiểm tra đăng nhập, xác thực dữ liệu, đến tính điểm, phân loại – tất cả đều cần câu lệnh điều kiện.

1. Câu lệnh điều kiện là gì?

Câu lệnh điều kiện (Conditional Statement) cho phép chương trình thực thi các đoạn code khác nhau dựa trên điều kiện đúng hay sai. Giống như trong cuộc sống:

  • Nếu trời mưa thì mang ô, nếu không thì không cần
  • Nếu điểm >= 8.0 thì “Giỏi”, nếu không nếu điểm >= 6.5 thì “Khá”
  • Nếu tuổi >= 18 thì cho phép xem phim 18+

PHP cung cấp các cấu trúc điều kiện:

  • if – Nếu điều kiện đúng
  • if...else – Nếu đúng thì A, sai thì B
  • if...elseif...else – Nhiều điều kiện liên tiếp
  • switch...case – So sánh một giá trị với nhiều trường hợp
  • ✅ Toán tử ba ngôi ? : – Rút gọn if-else

LUỒNG HOẠT ĐỘNG IF-ELSE BẮT ĐẦU ĐIỀU KIỆN ($tuoi >= 18) TRUE Thực thi code IF echo "Đủ tuổi"; FALSE Thực thi code ELSE echo "Chưa đủ tuổi"; KẾT THÚC if ($tuoi >= 18) { echo "Đủ tuổi bầu cử"; } else { echo "Chưa đủ tuổi"; }
Hình 1: Luồng hoạt động if-else trong PHP

2. Câu lệnh if

Cú pháp cơ bản nhất – chỉ thực thi code khi điều kiện đúng:

<?php
// Cú pháp
if (điều_kiện) {
  // Code thực thi nếu điều kiện đúng
}

// Ví dụ 1: Kiểm tra tuổi
$tuoi = 20;
if ($tuoi >= 18) {
  echo "Bạn đã đủ tuổi bầu cử";
}

// Ví dụ 2: Kiểm tra điểm
$diem = 8.5;
if ($diem >= 8.0) {
  echo "Chúc mừng! Bạn đạt loại Giỏi";
}

// Ví dụ 3: Kiểm tra đăng nhập
$da_dang_nhap = true;
if ($da_dang_nhap) {
  echo "Chào mừng trở lại!";
}
?>

💡 Lưu ý: Nếu chỉ có 1 câu lệnh, có thể bỏ dấu {}, nhưng không khuyến khích vì dễ gây lỗi khi thêm code sau này.

3. Câu lệnh if…else

Thực thi code A nếu điều kiện đúng, ngược lại thực thi code B:

<?php
// Cú pháp
if (điều_kiện) {
  // Code nếu điều kiện đúng
} else {
  // Code nếu điều kiện sai
}

// Ví dụ 1: Kiểm tra số chẵn lẻ
$so = 7;
if ($so % 2 == 0) {
  echo "$so là số chẵn";
} else {
  echo "$so là số lẻ";
}

// Ví dụ 2: Kiểm tra đủ tuổi
$tuoi = 16;
if ($tuoi >= 18) {
  echo "Được phép xem phim 18+";
} else {
  echo "Chưa đủ tuổi xem phim này";
}

// Ví dụ 3: Kiểm tra đăng nhập
$ten_dang_nhap = "admin";
$mat_khau = "123456";

if ($ten_dang_nhap == "admin" && $mat_khau == "123456") {
  echo "Đăng nhập thành công!";
} else {
  echo "Sai tên đăng nhập hoặc mật khẩu";
}
?>

4. Câu lệnh if…elseif…else

Kiểm tra nhiều điều kiện liên tiếp, thực thi đoạn code đầu tiên thỏa mãn:

<?php
// Cú pháp
if (điều_kiện_1) {
  // Code nếu điều kiện 1 đúng
} elseif (điều_kiện_2) {
  // Code nếu điều kiện 2 đúng
} elseif (điều_kiện_3) {
  // Code nếu điều kiện 3 đúng
} else {
  // Code nếu tất cả điều kiện sai
}

// Ví dụ 1: Xếp loại học lực
$diem = 7.5;

if ($diem >= 9.0) {
  $xep_loai = "Xuất sắc";
} elseif ($diem >= 8.0) {
  $xep_loai = "Giỏi";
} elseif ($diem >= 6.5) {
  $xep_loai = "Khá";
} elseif ($diem >= 5.0) {
  $xep_loai = "Trung bình";
} else {
  $xep_loai = "Yếu";
}

echo "Điểm: $diem - Xếp loại: $xep_loai";
// Kết quả: Điểm: 7.5 - Xếp loại: Khá
?>

4.1. Ví dụ thực tế: Tính cước taxi

<?php
$km = 12; // Số km đi được
$gia_mo_cua = 15000;
$gia_km_1_30 = 12000; // Từ km 1-30
$gia_km_31_tro_len = 10000; // Từ km 31 trở lên

if ($km <= 0) {
  $tong_tien = 0;
  echo "Số km không hợp lệ";
} elseif ($km <= 1) {
  $tong_tien = $gia_mo_cua;
} elseif ($km <= 30) {
  $tong_tien = $gia_mo_cua + ($km - 1) * $gia_km_1_30;
} else {
  $tien_30km_dau = $gia_mo_cua + 29 * $gia_km_1_30;
  $tien_phan_con_lai = ($km - 30) * $gia_km_31_tro_len;
  $tong_tien = $tien_30km_dau + $tien_phan_con_lai;
}

echo "Số km: $km km<br>";
echo "Tổng tiền: " . number_format($tong_tien) . " VNĐ";
// Kết quả: Số km: 12 km - Tổng tiền: 147,000 VNĐ
?>

5. Câu lệnh switch...case

Dùng khi cần so sánh một biến với nhiều giá trị cụ thể. Gọn hơn nhiều if...elseif:

<?php
// Cú pháp
switch (biến) {
  case giá_trị_1:
    // Code cho giá trị 1
    break;
  case giá_trị_2:
    // Code cho giá trị 2
    break;
  default:
    // Code nếu không khớp giá trị nào
}

// Ví dụ 1: Menu theo ngày trong tuần
$thu = 3; // 2 = Thứ 2, 3 = Thứ 3...

switch ($thu) {
  case 2:
    echo "Thứ 2: Phở bò";
    break;
  case 3:
    echo "Thứ 3: Cơm gà";
    break;
  case 4:
    echo "Thứ 4: Bún chả";
    break;
  case 5:
    echo "Thứ 5: Bánh mì";
    break;
  case 6:
    echo "Thứ 6: Mì xào";
    break;
  case 7:
    echo "Thứ 7: Pizza";
    break;
  case 8:
    echo "Chủ nhật: Buffet";
    break;
  default:
    echo "Ngày không hợp lệ";
}
?>

5.1. Tại sao cần break?

Nếu không có break, code sẽ "rơi xuống" (fall through) các case tiếp theo:

<?php
$thang = 2;

switch ($thang) {
  case 12:
  case 1:
  case 2:
    echo "Mùa đông";
    break;
  case 3:
  case 4:
  case 5:
    echo "Mùa xuân";
    break;
  case 6:
  case 7:
  case 8:
    echo "Mùa hè";
    break;
  case 9:
  case 10:
  case 11:
    echo "Mùa thu";
    break;
  default:
    echo "Tháng không hợp lệ";
}
// Kết quả: Mùa đông
?>

CẤU TRÚC SWITCH-CASE SWITCH ($thu) Giá trị: 3 case 2: echo "Thứ 2"; break; ❌ Không khớp case 3: echo "Thứ 3"; break; ✅ KHỚP → Thực thi case 4: echo "Thứ 4"; break; ❌ Không khớp KẾT THÚC switch ($thu) { case 2: echo "Thứ 2"; break; case 3: echo "Thứ 3"; break; // ← Thực thi case này case 4: echo "Thứ 4"; break; default: echo "Không hợp lệ"; }
Hình 2: Cấu trúc switch-case trong PHP

5.2. Ví dụ thực tế: Tính số ngày trong tháng

<?php
$thang = 2;
$nam = 2024;

switch ($thang) {
  case 1:
  case 3:
  case 5:
  case 7:
  case 8:
  case 10:
  case 12:
    $so_ngay = 31;
    break;
  case 4:
  case 6:
  case 9:
  case 11:
    $so_ngay = 30;
    break;
  case 2:
    // Kiểm tra năm nhuận
    if (($nam % 4 == 0 && $nam % 100 != 0) || ($nam % 400 == 0)) {
      $so_ngay = 29;
    } else {
      $so_ngay = 28;
    }
    break;
  default:
    $so_ngay = 0;
}

echo "Tháng $thang năm $nam có $so_ngay ngày";
// Kết quả: Tháng 2 năm 2024 có 29 ngày
?>

6. So sánh if...elseif vs switch...case

Tiêu chíif...elseif...elseswitch...case
Dùng khiNhiều điều kiện phức tạpSo sánh 1 biến với nhiều giá trị
Toán tửHỗ trợ tất cả (>, <, &&, ...)Chỉ so sánh bằng (==)
Độ dễ đọcKhó đọc khi nhiều điều kiệnDễ đọc với nhiều giá trị cụ thể
Hiệu năngChậm hơn một chútNhanh hơn với nhiều case
Ví dụif ($diem >= 8.0)switch ($thu)

💡 Khuyến nghị: Dùng switch khi so sánh 1 biến với 3+ giá trị cố định. Dùng if cho các điều kiện phức tạp.

7. Câu điều kiện lồng nhau (Nested If)

Đặt câu điều kiện bên trong câu điều kiện khác:

<?php
$tuoi = 20;
$co_giay_phep = true;

if ($tuoi >= 18) {
  echo "Bạn đủ tuổi lái xe<br>";
  
  if ($co_giay_phep) {
    echo "Bạn có giấy phép → Được phép lái xe";
  } else {
    echo "Bạn chưa có giấy phép → Không được lái xe";
  }
} else {
  echo "Bạn chưa đủ tuổi lái xe";
}
?>

7.1. Ví dụ phức tạp: Hệ thống giảm giá

<?php
$tong_tien = 500000;
$la_thanh_vien = true;
$ma_giam_gia = "SALE20";

$giam_gia = 0;

// Kiểm tra điều kiện giảm giá
if ($tong_tien >= 300000) {
  
  if ($la_thanh_vien) {
    $giam_gia = 10; // Thành viên giảm 10%
    
    if ($ma_giam_gia == "SALE20") {
      $giam_gia = 20; // Có mã giảm thêm → 20%
    }
  } else {
    if ($ma_giam_gia == "SALE20") {
      $giam_gia = 15; // Không phải thành viên nhưng có mã → 15%
    }
  }
}

$tien_giam = $tong_tien * ($giam_gia / 100);
$thanh_toan = $tong_tien - $tien_giam;

echo "Tổng tiền: " . number_format($tong_tien) . " VNĐ<br>";
echo "Giảm giá: $giam_gia% = " . number_format($tien_giam) . " VNĐ<br>";
echo "Thanh toán: " . number_format($thanh_toan) . " VNĐ";
// Kết quả: Thanh toán: 400,000 VNĐ
?>

ĐIỀU KIỆN LỒNG NHAU (NESTED IF) if ($tuoi >= 18) { // CẤP 1: Kiểm tra tuổi Điều kiện: $tuoi >= 18 ✅ TRUE → Tiếp tục kiểm tra bên trong if ($co_giay_phep) { // CẤP 2: Kiểm tra giấy phép lái xe Điều kiện: $co_giay_phep == true ✅ TRUE → Kiểm tra loại xe if ($loai_xe == "oto") { // CẤP 3: Kiểm tra loại xe ✅ Được phép lái ô tô } else { echo "Chỉ lái xe máy"; } } } ⚠️ Tránh lồng quá 3 cấp - khó đọc và bảo trì
Hình 3: Điều kiện lồng nhau (Nested If)

⚠️ Lưu ý: Tránh lồng quá sâu (>3 cấp) vì khó đọc và bảo trì. Nên tách thành các hàm riêng.

8. Toán tử ba ngôi (Ternary Operator)

Rút gọn câu if...else đơn giản thành 1 dòng:

<?php
// Cú pháp
$bien = (điều_kiện) ? giá_trị_nếu_đúng : giá_trị_nếu_sai;

// Ví dụ 1: Kiểm tra tuổi
$tuoi = 20;
$ket_qua = ($tuoi >= 18) ? "Trưởng thành" : "Vị thành niên";
echo $ket_qua; // Trưởng thành

// Ví dụ 2: Hiển thị trạng thái
$trang_thai = 1;
$text = ($trang_thai == 1) ? "Hoạt động" : "Tạm dừng";
echo $text; // Hoạt động

// Ví dụ 3: Tính phí ship
$tong_tien = 200000;
$phi_ship = ($tong_tien >= 300000) ? 0 : 30000;
echo "Phí ship: " . number_format($phi_ship) . " VNĐ";
// Kết quả: Phí ship: 30,000 VNĐ
?>

8.1. Toán tử ba ngôi lồng nhau

<?php
$diem = 7.5;

// Lồng nhau (không khuyến khích nếu quá phức tạp)
$xep_loai = ($diem >= 9.0) ? "Xuất sắc" :
            (($diem >= 8.0) ? "Giỏi" :
            (($diem >= 6.5) ? "Khá" : "Trung bình"));

echo "Xếp loại: $xep_loai"; // Khá

// Nên viết lại bằng if...elseif cho dễ đọc
if ($diem >= 9.0) {
  $xep_loai = "Xuất sắc";
} elseif ($diem >= 8.0) {
  $xep_loai = "Giỏi";
} elseif ($diem >= 6.5) {
  $xep_loai = "Khá";
} else {
  $xep_loai = "Trung bình";
}
?>

8.2. Null Coalescing Operator (PHP 7+)

Toán tử đặc biệt ?? để xử lý giá trị null:

<?php
// Cú pháp: $bien = $gia_tri ?? $gia_tri_mac_dinh;

// Ví dụ 1: Lấy tham số từ URL
$ten = $_GET['name'] ?? "Khách";
echo "Xin chào, $ten!";

// Ví dụ 2: Lấy session
$user_id = $_SESSION['user_id'] ?? null;

if ($user_id === null) {
  echo "Chưa đăng nhập";
} else {
  echo "User ID: $user_id";
}

// Ví dụ 3: Chuỗi nhiều giá trị
$ho_ten = $_POST['name'] ?? $_SESSION['name'] ?? "Người dùng";
echo $ho_ten;
?>

9. Một số lưu ý quan trọng

9.1. Phân biệt = và ==

<?php
$x = 10;

// ❌ Sai: Dùng = (gán) thay vì == (so sánh)
if ($x = 5) {
  echo "x bằng 5"; // Luôn chạy vì $x = 5 trả về 5 (true)
}

// ✅ Đúng: Dùng ==
if ($x == 10) {
  echo "x bằng 10";
}
?>

9.2. Dùng === thay vì ==

<?php
$input = "0";

// Với ==
if ($input == false) {
  echo "Điều kiện đúng"; // Chạy vì "0" == false → true
}

// Với === (an toàn hơn)
if ($input === false) {
  echo "Điều kiện đúng"; // Không chạy vì "0" !== false
}
?>

9.3. Kiểm tra isset() và empty()

<?php
// isset() - Kiểm tra biến đã được định nghĩa chưa
if (isset($_POST['email'])) {
  $email = $_POST['email'];
} else {
  $email = "";
}

// empty() - Kiểm tra biến rỗng (null, "", 0, false, [])
$ten = "";
if (empty($ten)) {
  echo "Vui lòng nhập tên";
}

// Kết hợp
if (isset($_POST['phone']) && !empty($_POST['phone'])) {
  $sdt = $_POST['phone'];
} else {
  echo "Số điện thoại không được để trống";
}
?>

10. Ví dụ tổng hợp

10.1. Form đăng ký validation

<?php
// Giả sử nhận dữ liệu từ form
$ten = "Nguyễn Văn A";
$tuoi = 17;
$email = "test@email.com";
$mat_khau = "123";

$loi = [];

// Kiểm tra tên
if (empty($ten)) {
  $loi[] = "Tên không được để trống";
} elseif (strlen($ten) < 3) {
  $loi[] = "Tên phải có ít nhất 3 ký tự";
}

// Kiểm tra tuổi
if ($tuoi < 18) {
  $loi[] = "Phải từ 18 tuổi trở lên";
} elseif ($tuoi > 100) {
  $loi[] = "Tuổi không hợp lệ";
}

// Kiểm tra email
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
  $loi[] = "Email không hợp lệ";
}

// Kiểm tra mật khẩu
if (strlen($mat_khau) < 6) {
  $loi[] = "Mật khẩu phải có ít nhất 6 ký tự";
}

// Hiển thị kết quả
if (empty($loi)) {
  echo "✅ Đăng ký thành công!";
} else {
  echo "❌ Có lỗi:<br>";
  foreach ($loi as $l) {
    echo "- $l<br>";
  }
}
?>

10.2. Tính thuế thu nhập cá nhân

<?php
$thu_nhap_thang = 15000000; // 15 triệu/tháng
$giam_tru = 11000000; // 11 triệu (bản thân + người phụ thuộc)

$thu_nhap_tinh_thue = $thu_nhap_thang - $giam_tru;
$thue = 0;

if ($thu_nhap_tinh_thue <= 0) {
  $thue = 0;
} elseif ($thu_nhap_tinh_thue <= 5000000) {
  $thue = $thu_nhap_tinh_thue * 0.05;
} elseif ($thu_nhap_tinh_thue <= 10000000) {
  $thue = 5000000 * 0.05 + ($thu_nhap_tinh_thue - 5000000) * 0.10;
} elseif ($thu_nhap_tinh_thue <= 18000000) {
  $thue = 5000000 * 0.05 + 5000000 * 0.10 + ($thu_nhap_tinh_thue - 10000000) * 0.15;
} else {
  $thue = 5000000 * 0.05 + 5000000 * 0.10 + 8000000 * 0.15 + ($thu_nhap_tinh_thue - 18000000) * 0.20;
}

$thuc_linh = $thu_nhap_thang - $thue;

echo "Thu nhập: " . number_format($thu_nhap_thang) . " VNĐ<br>";
echo "Giảm trừ: " . number_format($giam_tru) . " VNĐ<br>";
echo "Thuế TNCN: " . number_format($thue) . " VNĐ<br>";
echo "Thực lĩnh: " . number_format($thuc_linh) . " VNĐ";
?>

Tóm tắt

Qua bài này bạn đã nắm được:

  • Câu lệnh điều kiện PHP kiểm soát luồng chương trình dựa trên điều kiện đúng/sai
  • if - Thực thi code khi điều kiện đúng
  • if...else - Thực thi code A nếu đúng, code B nếu sai
  • if...elseif...else - Kiểm tra nhiều điều kiện liên tiếp
  • switch...case - So sánh 1 biến với nhiều giá trị cụ thể, nhớ dùng break
  • Nested if - Điều kiện lồng nhau, tránh lồng quá 3 cấp
  • Toán tử ba ngôi ? : - Rút gọn if-else đơn giản
  • ?? (Null Coalescing) - Xử lý giá trị null an toàn
  • ✅ Dùng === thay vì ==, kiểm tra isset()empty()

Bài tiếp theo, bạn sẽ học về vòng lặp trong PHP để thực thi code lặp đi lặp lại nhiều lần.

🎯 Bài tập thực hành

  1. Bài 1: Viết chương trình nhập 3 số $a, $b, $c. Tìm và in ra số lớn nhất trong 3 số.
  2. Bài 2: Viết chương trình kiểm tra một năm có phải năm nhuận không. Năm nhuận thỏa mãn: (chia hết cho 4 NHƯNG không chia hết cho 100) HOẶC (chia hết cho 400).
  3. Bài 3: Viết chương trình tính tiền điện theo bậc thang:
    • 0-50 kWh: 1,678 đ/kWh
    • 51-100 kWh: 1,734 đ/kWh
    • 101-200 kWh: 2,014 đ/kWh
    • 201-300 kWh: 2,536 đ/kWh
    • Trên 300 kWh: 2,834 đ/kWh

Gợi ý Bài 1:

<?php
$a = 15;
$b = 28;
$c = 22;

if ($a >= $b && $a >= $c) {
  $max = $a;
} elseif ($b >= $a && $b >= $c) {
  $max = $b;
} else {
  $max = $c;
}

echo "Số lớn nhất là: $max";
?>

Gợi ý Bài 2:

<?php
$nam = 2024;

if (($nam % 4 == 0 && $nam % 100 != 0) || ($nam % 400 == 0)) {
  echo "$nam là năm nhuận";
} else {
  echo "$nam không phải năm nhuận";
}
?>

Gợi ý Bài 3:

<?php
$so_kwh = 250;
$tien_dien = 0;

if ($so_kwh <= 50) {
  $tien_dien = $so_kwh * 1678;
} elseif ($so_kwh <= 100) {
  $tien_dien = 50 * 1678 + ($so_kwh - 50) * 1734;
} elseif ($so_kwh <= 200) {
  $tien_dien = 50 * 1678 + 50 * 1734 + ($so_kwh - 100) * 2014;
} elseif ($so_kwh <= 300) {
  $tien_dien = 50 * 1678 + 50 * 1734 + 100 * 2014 + ($so_kwh - 200) * 2536;
} else {
  $tien_dien = 50 * 1678 + 50 * 1734 + 100 * 2014 + 100 * 2536 + ($so_kwh - 300) * 2834;
}

echo "Số điện tiêu thụ: $so_kwh kWh<br>";
echo "Tiền điện: " . number_format($tien_dien) . " VNĐ";
?>

Để lại bình luận

Email của bạn sẽ không được hiển thị.