Sau khi đã học:
✅ Bài 21 — Giới thiệu MySQL
✅ Bài 22 — Kết nối MySQL bằng PHP
✅ Bài 23 — INSERT dữ liệu
Bây giờ chúng ta sẽ học bước quan trọng nhất:
👉 Lấy dữ liệu từ Database đưa ra màn hình Website
Ví dụ:
SELECT dùng để truy vấn dữ liệu từ bảng trong Database.
Cú pháp:
SELECT tên_cột
FROM tên_bảng;
Ví dụ:
Database có bảng:
posts
| id | title | notes |
|---|---|---|
| 1 | Học PHP | Bài đầu tiên |
| 2 | Học MySQL | Làm việc với database |
Muốn lấy toàn bộ dữ liệu:
SELECT * FROM posts;
Kết quả:
1 - Học PHP - Bài đầu tiên
2 - Học MySQL - Làm việc với database
Ví dụ bảng:
CREATE TABLE posts (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255),
notes TEXT
);
Dữ liệu:
INSERT INTO posts(title,notes)
VALUES
('Học PHP','Bài học PHP cơ bản'),
('Học MySQL','Kết nối database');
File:
connect.php
Nội dung:
<?php
$conn = mysqli_connect(
"localhost",
"root",
"",
"demo"
);
if(!$conn){
die("Lỗi kết nối database");
}
?>
File:
index.php
Code:
<?php
include "connect.php";
$sql = "SELECT * FROM posts";
$result = mysqli_query($conn,$sql);
while($row = mysqli_fetch_assoc($result)){
echo $row['title'];
echo "<br>";
echo $row['notes'];
echo "<hr>";
}
?>
Kết quả:
Học PHP
Bài học PHP cơ bản
-----------------
Học MySQL
Kết nối database
$sql = "SELECT * FROM posts";
Ý nghĩa:
Lấy tất cả dữ liệu trong bảng posts.
mysqli_query()
Ví dụ:
$result = mysqli_query($conn,$sql);
PHP gửi yêu cầu:
PHP ➡️ MySQL
"MySQL hãy lấy dữ liệu bảng posts"
mysqli_fetch_assoc()
Ví dụ:
Dòng 1:
$row = [
"id"=>1,
"title"=>"Học PHP",
"notes"=>"Bài học PHP"
];
Ví dụ:
<table border="1">
<tr>
<th>ID</th>
<th>Tiêu đề</th>
<th>Nội dung</th>
</tr>
<?php
$sql="SELECT * FROM posts";
$result=mysqli_query($conn,$sql);
while($row=mysqli_fetch_assoc($result)){
?>
<tr>
<td>
<?= $row['id']; ?>
</td>
<td>
<?= $row['title']; ?>
</td>
<td>
<?= $row['notes']; ?>
</td>
</tr>
<?php
}
?>
</table>
Kết quả:
| ID | Tiêu đề | Nội dung |
|---|---|---|
| 1 | Học PHP | Bài học PHP |
| 2 | Học MySQL | Database |
Ví dụ:
Chỉ lấy bài có id = 1
SQL:
SELECT *
FROM posts
WHERE id=1;
PHP:
$sql = "
SELECT *
FROM posts
WHERE id=1
";
Lấy bài mới nhất:
SELECT *
FROM posts
ORDER BY id DESC;
Giải thích:
DESC:
5
4
3
2
1
ASC:
1
2
3
4
5
Ví dụ lấy 10 bài:
SELECT *
FROM posts
LIMIT 10;
Thường dùng cho:
✅ Trang chủ
✅ Tin tức
✅ Pagination
Tạo trang:
index.php
Hiển thị:
Danh sách bài viết
--------------------------------
1. Học PHP
Nội dung...
--------------------------------
2. Học MySQL
Nội dung...
Yêu cầu:
✅ Kết nối MySQL
✅ SELECT dữ liệu
✅ while lặp dữ liệu
✅ Hiển thị HTML
✅ Truy vấn dữ liệu MySQL
✅ Đọc dữ liệu bằng PHP
✅ Hiển thị Database ra Website
✅ Dùng mysqli_fetch_assoc()
✅ WHERE / ORDER BY / LIMIT
📌 Bài tiếp theo:
Sửa dữ liệu trong Database bằng PHP ✏️
x0
Cập nhật: 2026-06-24T09:38:18.658+07:00
Sau khi đã kết nối thành công PHP với MySQL ở bài trước, bước tiếp theo là ghi dữ liệu vào database.
Trong thực tế, thao tác INSERT được dùng rất nhiều:
➕ Thêm bài viết
👤 Tạo tài khoản người dùng
🛒 Lưu đơn hàng
💬 Lưu bình luận
📧 Đăng ký nhận tin
INSERT INTO ten_bang (cot1, cot2)
VALUES ('gia_tri_1', 'gia_tri_2');
Ví dụ:
INSERT INTO products (name, price)
VALUES ('Bàn phím cơ', 1200000);
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
price INT
);
Bảng gồm:
| Cột | Ý nghĩa |
|---|---|
| id | Mã tự tăng |
| name | Tên sản phẩm |
| price | Giá sản phẩm |
<?php
$conn = mysqli_connect(
"localhost",
"root",
"",
"phpbasic"
);
if (!$conn) {
die("Kết nối thất bại");
}
<?php
$sql = "
INSERT INTO products(name, price)
VALUES ('Chuột không dây', 350000)
";
$result = mysqli_query($conn, $sql);
if($result){
echo "Thêm dữ liệu thành công";
}else{
echo "Lỗi";
}
Kết quả:
Thêm dữ liệu thành công
Mở:
phpMyAdmin
→ Database phpbasic
→ products
→ Browse
Sẽ thấy:
| id | name | price |
|---|---|---|
| 1 | Chuột không dây | 350000 |
<?php
$sql = "
INSERT INTO products(name, price)
VALUES
('Bàn phím cơ',1200000),
('Tai nghe',850000),
('Webcam',600000)
";
mysqli_query($conn, $sql);
Kết quả:
| id | name |
|---|---|
| 1 | Chuột không dây |
| 2 | Bàn phím cơ |
| 3 | Tai nghe |
| 4 | Webcam |
<form method="post">
Tên sản phẩm:
<input type="text" name="name">
<br><br>
Giá:
<input type="number" name="price">
<br><br>
<button type="submit">
Thêm
</button>
</form>
<?php
if($_SERVER["REQUEST_METHOD"]=="POST"){
$name = $_POST["name"];
$price = $_POST["price"];
$sql = "
INSERT INTO products(name, price)
VALUES ('$name', '$price')
";
mysqli_query($conn,$sql);
echo "Đã lưu dữ liệu";
}
Khi submit form:
Bàn phím gaming
1500000
Dữ liệu sẽ được ghi xuống MySQL.
Đoạn code sau KHÔNG an toàn:
$name = $_POST["name"];
$sql = "
INSERT INTO products(name)
VALUES ('$name')
";
Kẻ xấu có thể chèn mã SQL độc hại.
Ví dụ:
abc'); DROP TABLE products; --
Có thể gây lỗi hoặc phá dữ liệu.
Đây là cách hiện đại và an toàn.
<?php
$stmt = mysqli_prepare(
$conn,
"INSERT INTO products(name, price)
VALUES (?, ?)"
);
$name = "Chuột Gaming";
$price = 450000;
mysqli_stmt_bind_param(
$stmt,
"si",
$name,
$price
);
mysqli_stmt_execute($stmt);
echo "Đã thêm dữ liệu";
Trong đó:
s = string
i = integer
d = double
b = blob
mysqli_query($conn,$sql);
echo mysqli_insert_id($conn);
Ví dụ:
ID mới tạo: 15
Rất hữu ích khi:
📄 Tạo bài viết
🛒 Tạo đơn hàng
👤 Tạo tài khoản
<?php
$conn = mysqli_connect(
"localhost",
"root",
"",
"phpbasic"
);
if($_SERVER["REQUEST_METHOD"]=="POST"){
$name = $_POST["name"];
$price = $_POST["price"];
$stmt = mysqli_prepare(
$conn,
"INSERT INTO products(name, price)
VALUES (?, ?)"
);
mysqli_stmt_bind_param(
$stmt,
"si",
$name,
$price
);
mysqli_stmt_execute($stmt);
echo "Lưu thành công";
}
?>
<form method="post">
<input
type="text"
name="name"
placeholder="Tên sản phẩm">
<br><br>
<input
type="number"
name="price"
placeholder="Giá">
<br><br>
<button type="submit">
Lưu
</button>
</form>
✅ INSERT dùng để thêm dữ liệu vào bảng
✅ mysqli_query() có thể thực hiện câu lệnh INSERT
✅ Có thể lấy ID vừa tạo bằng:
mysqli_insert_id()
✅ Nên dùng Prepared Statement để chống SQL Injection
✅ Đây là nền tảng để xây dựng CRUD hoàn chỉnh
👉 Bài 24 — SELECT Dữ Liệu
Bạn sẽ học:
SELECT *
SELECT theo điều kiện
WHERE
ORDER BY
LIMIT
Hiển thị dữ liệu ra HTML
x0
Cập nhật: 2026-06-23T10:22:00.199+07:00
Nếu 1 trang web không lộ đuôi .php (ví dụ URL đẹp kiểu /san-pham/abc), vẫn có vài cách đoán xem nó có chạy PHP hay không.
Không có cách nào chắc 100% chỉ nhìn bên ngoài, vì PHP chạy phía server và trình duyệt chỉ nhận HTML.
01 số cách kiểm tra:
Mở CMD:
curl -I https://tenmien.com
Ví dụ thấy:
server: Apache
x-powered-by: PHP/8.2.0
=> gần như chắc chắn là PHP.
Nhưng nhiều website ẩn X-Powered-By để bảo mật.
Tìm dấu hiệu:
index.php
hoặc:
/wp-content/
(WordPress thường chạy PHP)
hoặc file:
assets/css/style.css
assets/js/main.js
thì chưa kết luận được.
PHP thường để lại dấu hiệu kiểu:
<form action="/login" method="post">
hoặc:
?page=product&id=10
nhưng framework hiện đại cũng dùng dạng này.
F12 → Network → reload trang
Xem request:
Ví dụ:
GET /index.php
hoặc:
GET /index.php?id=5
=> PHP.
Nhưng nếu thấy:
GET /san-pham/iphone
thì có thể là:
PHP Laravel
PHP CodeIgniter
Node.js
ASP.NET
Java Spring...
Nhập:
domain.com/index.php
hoặc:
domain.com/login.php
Nếu:
chuyển hướng sang trang chính
báo lỗi PHP
hiện nội dung khác
=> có khả năng dùng PHP.
Có thể dùng:
Nó dò:
Server:
Apache
Language:
PHP
Framework:
Laravel
CodeIgniter
CMS:
WordPress
F12 → Application → Cookies
Ví dụ:
PHPSESSID=abc123
🔥 Đây là dấu hiệu rất mạnh:
PHPSESSID
=> website đang dùng session PHP.
Ví dụ:
domain.com/abcxyz123
Nếu lỗi kiểu:
Fatal error
Warning: mysqli_connect()
Undefined variable
=> PHP lộ ra.
Website tốt thường tắt lỗi này.
PHP hiện đại thường giấu hết:
URL:
domain.com/bai-viet/php-co-ban
thực tế có thể là:
index.php?page=bai-viet&id=25
nhờ:
URL Rewrite Apache
Nginx rewrite
Laravel route
CodeIgniter route
Nên nhìn URL không đoán chính xác được.
Nếu là dân code PHP thì cách kiểm tra nhanh nhất:
✅ F12 → Network
✅ Response Header
✅ Cookie PHPSESSID
✅ Wappalyzer
là đủ 90% trường hợp.
✨ made by AI
Cập nhật: 2026-06-22T15:28:45.011+07:00
Sau khi đã tạo được Database ở bài trước, bước tiếp theo là kết nối PHP với MySQL để có thể đọc và ghi dữ liệu.
Đây là nền tảng cho mọi website động như:
📰 Trang tin tức
🛒 Website bán hàng
👤 Hệ thống thành viên
📚 Quản lý thư viện
🎓 Website học trực tuyến
Sau bài này bạn sẽ biết:
✅ Kết nối MySQL bằng PHP
✅ Sử dụng mysqli_connect()
✅ Kiểm tra lỗi kết nối
✅ Hiển thị thông báo thành công hoặc thất bại
Cú pháp:
mysqli_connect(
$host,
$username,
$password,
$database
);
| Tham số | Ý nghĩa |
|---|---|
| host | Máy chủ MySQL |
| username | Tài khoản MySQL |
| password | Mật khẩu |
| database | Tên Database |
Ví dụ:
<?php
$conn = mysqli_connect(
"localhost",
"root",
"",
"shop_db"
);
?>
Trong Laragon hoặc XAMPP:
Host: localhost
User: root
Password:
thường để trống mật khẩu mặc định.
Nếu kết nối sai thông tin, chương trình sẽ lỗi.
Ví dụ:
<?php
$conn = mysqli_connect(
"localhost",
"root",
"",
"shop_db"
);
if(!$conn){
die("Kết nối thất bại");
}
echo "Kết nối thành công";
Kết quả:
Kết nối thành công
MySQL cung cấp hàm:
mysqli_connect_error()
Ví dụ:
<?php
$conn = mysqli_connect(
"localhost",
"root",
"",
"shop_db"
);
if(!$conn){
die(mysqli_connect_error());
}
echo "Kết nối thành công";
Nếu sai database:
"shop_dbx"
Kết quả:
Unknown database 'shop_dbx'
Điều này giúp tìm lỗi nhanh hơn.
Thực tế không ai viết kết nối ở mọi file.
Tạo:
config/
└── database.php
Nội dung:
<?php
$conn = mysqli_connect(
"localhost",
"root",
"",
"shop_db"
);
if(!$conn){
die("Lỗi kết nối: " . mysqli_connect_error());
}
File:
index.php
<?php
require "config/database.php";
echo "Website đã kết nối MySQL";
Lợi ích:
✅ Dễ bảo trì
✅ Sửa một nơi
✅ Chuẩn cấu trúc dự án
Nếu không thiết lập charset, tiếng Việt có thể bị lỗi.
Ví dụ:
<?php
$conn = mysqli_connect(
"localhost",
"root",
"",
"shop_db"
);
mysqli_set_charset($conn, "utf8mb4");
Khuyến nghị luôn dùng:
utf8mb4
vì hỗ trợ đầy đủ Unicode và Emoji.
<?php
$conn = mysqli_connect(
"localhost",
"root",
"",
"shop_db"
);
if(!$conn){
die("Lỗi: " . mysqli_connect_error());
}
mysqli_set_charset($conn, "utf8mb4");
echo "🎉 Kết nối MySQL thành công!";
Access denied for user
Nguyên nhân:
Sai username
Sai password
Unknown database
Nguyên nhân:
Chưa tạo database
Gõ sai tên database
Can't connect to MySQL server
Nguyên nhân:
MySQL chưa chạy
Port bị đổi
Trong dự án thật nên:
database.php
chỉ chứa:
<?php
$conn = mysqli_connect(
"localhost",
"root",
"",
"shop_db"
);
mysqli_set_charset($conn, "utf8mb4");
và sử dụng:
require_once "config/database.php";
ở mọi nơi cần truy cập dữ liệu.
Sau bài này bạn đã biết:
✅ Kết nối MySQL bằng PHP
✅ Dùng mysqli_connect()
✅ Kiểm tra lỗi kết nối
✅ Hiển thị thông báo lỗi
✅ Thiết lập UTF-8 với utf8mb4
✅ Tách file kết nối để tái sử dụng
👉 Bài tiếp theo:
Bài 23 — INSERT dữ liệu vào MySQL bằng PHP
🖥️ Một màn hình CRT màu xanh lá hiển thị:
Connecting to MySQL...
Connection Success!
🐘 Logo PHP kiểu pixel art
🗄️ Database server phong cách thập niên 80
⌨️ Lập trình viên đang gõ lệnh trên màn hình DOS cổ điển
x0
Cập nhật: 2026-06-22T08:12:00.209+07:00
#laptrinhphpcoban
Sau bài này bạn sẽ biết:
✅ Database là gì?
✅ MySQL là gì?
✅ phpMyAdmin dùng để làm gì?
✅ Cách tạo Database đầu tiên
✅ Chuẩn bị cho việc kết nối PHP với MySQL ở bài tiếp theo
Database (Cơ sở dữ liệu) là nơi lưu trữ thông tin có tổ chức.
Ví dụ một website bán hàng cần lưu:
🧑 Khách hàng
📦 Sản phẩm
🛒 Đơn hàng
💳 Thanh toán
Nếu chỉ dùng biến PHP thì dữ liệu sẽ mất sau khi tắt chương trình.
Database giúp lưu dữ liệu lâu dài.
Website bán trái cây:
| 🔢 | 🍎 Sản phẩm | 💰 Giá |
|---|---|---|
| 1️⃣ | Cam Sành | 25000 |
| 2️⃣ | Xoài Cát | 45000 |
| 3️⃣ | Táo Mỹ | 60000 |
Các dữ liệu này thường được lưu trong Database thay vì viết cứng trong PHP.
MySQL là hệ quản trị cơ sở dữ liệu (Database Management System - DBMS) phổ biến nhất khi lập trình PHP.
Nó giúp:
✅ Lưu dữ liệu
✅ Tìm kiếm dữ liệu
✅ Sửa dữ liệu
✅ Xóa dữ liệu
✅ Quản lý hàng triệu bản ghi
Người dùng
↓
Website PHP
↓
MySQL Database
↓
Lưu dữ liệu
Ví dụ:
👤 Người dùng gửi form đăng ký
↓
🐘 PHP nhận dữ liệu
↓
🐬 MySQL lưu dữ liệu
↓
✅ Hoàn tất
phpMyAdmin là công cụ quản lý MySQL bằng giao diện web.
Thay vì gõ lệnh phức tạp, bạn có thể:
✅ Tạo Database
✅ Tạo Table
✅ Thêm dữ liệu
✅ Sửa dữ liệu
✅ Xóa dữ liệu
bằng vài cú click chuột.
Nếu dùng Laragon:
http://localhost/phpmyadmin
Nếu dùng XAMPP:
http://localhost/phpmyadmin
Giao diện sẽ tương tự:
phpMyAdmin
├── Database
├── Tables
├── SQL
├── Import
└── Export
Ví dụ tạo Database quản lý cửa hàng trái cây.
Chọn:
New
hoặc
Mới
Nhập tên Database:
cuahang_traicay
Chọn:
utf8mb4_unicode_ci
Nhấn:
Create
hoặc
Tạo
Bạn sẽ thấy:
cuahang_traicay
xuất hiện bên menu trái.
Table (Bảng) giống như một file Excel.
Ví dụ bảng sản phẩm:
| 🆔 id | 🍎 ten_san_pham | 💰 gia |
|---|---|---|
| 1 | Cam Sành | 25000 |
| 2 | Xoài Cát | 45000 |
| 3 | Táo Mỹ | 60000 |
Database
│
├── sanpham
├── khachhang
├── donhang
└── thanhtoan
Database giống như một chiếc tủ hồ sơ.
Table giống như các ngăn kéo bên trong.
SQL (Structured Query Language) là ngôn ngữ dùng để làm việc với Database.
Ví dụ:
Thêm dữ liệu:
INSERT INTO sanpham
(ten_san_pham, gia)
VALUES
('Cam Sành', 25000);
Lấy dữ liệu:
SELECT * FROM sanpham;
Xóa dữ liệu:
DELETE FROM sanpham
WHERE id = 1;
Đừng lo nếu chưa hiểu.
Từ bài sau chúng ta sẽ học từng bước.
Ngoài phpMyAdmin, có thể dùng SQL:
CREATE DATABASE cuahang_traicay;
Sau đó bấm Execute.
✅ Chữ thường
✅ Không dấu
✅ Dùng dấu gạch dưới
Ví dụ:
quanly_banhang
website_tintuc
shop_hoaqua
Quản Lý Bán Hàng
Database Của Tôi
CửaHàng123
Tạo Database:
quanly_sach
Tạo Database:
quanly_sinhvien
Tạo Database:
shop_dienthoai
🔹 Database là nơi lưu dữ liệu lâu dài
🔹 MySQL là hệ quản trị cơ sở dữ liệu phổ biến nhất của PHP
🔹 phpMyAdmin giúp quản lý MySQL bằng giao diện web
🔹 Database chứa nhiều Table
🔹 SQL là ngôn ngữ làm việc với Database
🔹 Đã tạo được Database đầu tiên
Chúng ta sẽ học:
✅ mysqli_connect()
✅ Kết nối PHP với MySQL
✅ Kiểm tra lỗi kết nối
✅ Chạy thử truy vấn đầu tiên
x0
Cập nhật: 2026-06-21T14:26:00.113+07:00
Sau bài trước về Upload File, chúng ta sẽ học hai công cụ cực kỳ quan trọng trong lập trình web:
✅ Session
✅ Cookie
Đây là nền tảng để xây dựng:
Đăng nhập thành viên
Giỏ hàng
Ghi nhớ tùy chọn người dùng
Theo dõi trạng thái truy cập
HTTP là giao thức không nhớ trạng thái.
Ví dụ:
Lần 1:
Trình duyệt gửi yêu cầu
Server phản hồi.
Lần 2:
Trình duyệt gửi yêu cầu mới
Server không biết đó có phải người dùng trước hay không.
Session giúp server ghi nhớ người dùng.
Muốn sử dụng Session phải gọi:
session_start();
Ví dụ:
<?php
session_start();
echo "Session đã được khởi tạo";
⚠️ Luôn đặt trước mọi HTML.
Sai:
<h1>Xin chào</h1>
<?php
session_start();
Có thể gây lỗi:
Headers already sent
Ví dụ:
<?php
session_start();
$_SESSION["username"] = "nguyenvana";
echo "Đã lưu session";
<?php
session_start();
echo $_SESSION["username"];
Kết quả:
nguyenvana
<?php
session_start();
if (isset($_SESSION["username"])) {
echo "Đã đăng nhập";
} else {
echo "Chưa đăng nhập";
}
<?php
session_start();
unset($_SESSION["username"]);
<?php
session_start();
session_destroy();
Sau đó người dùng phải đăng nhập lại.
<?php
session_start();
$_SESSION["username"] = "hocvienphp";
echo "Đăng nhập thành công";
<?php
session_start();
if (isset($_SESSION["username"])) {
echo "Xin chào ";
echo $_SESSION["username"];
} else {
echo "Bạn chưa đăng nhập";
}
<?php
session_start();
session_destroy();
echo "Đã đăng xuất";
Cookie là dữ liệu lưu trên máy người dùng.
Khác với Session:
| Session | Cookie |
|---|---|
| Lưu trên Server | Lưu trên trình duyệt |
| Bảo mật hơn | Kém bảo mật hơn |
| Hết khi Session kết thúc | Có thể tồn tại nhiều ngày |
Cú pháp:
setcookie(
"ten_cookie",
"gia_tri",
time() + 3600
);
3600 giây = 1 giờ.
Ví dụ:
<?php
setcookie(
"theme",
"dark",
time() + 3600
);
echo "Đã tạo cookie";
<?php
echo $_COOKIE["theme"];
Kết quả:
dark
Nên kiểm tra trước:
<?php
if (isset($_COOKIE["theme"])) {
echo $_COOKIE["theme"];
}
<?php
setcookie(
"theme",
"",
time() - 3600
);
Cookie sẽ bị trình duyệt xóa.
Lưu lựa chọn nền tối:
<?php
setcookie(
"theme",
"dark",
time() + 86400 * 30
);
30 ngày.
Khi truy cập lại:
<?php
if (
isset($_COOKIE["theme"])
&& $_COOKIE["theme"] === "dark"
) {
echo "Đang dùng giao diện tối";
}
✅ Đăng nhập
✅ Quyền người dùng
✅ Dữ liệu nhạy cảm
Ví dụ:
user_id
role
token
✅ Ghi nhớ giao diện
✅ Ngôn ngữ
✅ Tùy chọn hiển thị
Ví dụ:
theme
language
font_size
Mật khẩu
Số thẻ ngân hàng
Thông tin bí mật
vào Cookie.
Tạo Session:
$_SESSION["fullname"] = "Hoc Vien PHP";
và hiển thị lại.
Kiểm tra:
isset($_SESSION["fullname"])
Tạo Cookie:
language = vi
thời hạn 1 ngày.
Hiển thị giá trị Cookie nếu tồn tại.
Tạo mini hệ thống:
login.php
profile.php
logout.php
bằng Session.
Sau bài này bạn đã biết:
✅ session_start()
✅ $_SESSION
✅ unset()
✅ session_destroy()
✅ setcookie()
✅ $_COOKIE
✅ Xóa Cookie
✅ Ứng dụng Session để đăng nhập
Ở bài tiếp theo chúng ta sẽ bắt đầu bước sang thế giới Database với MySQL và phpMyAdmin.
x0
Cập nhật: 2026-06-21T04:29:05.616+07:00
Sau bài này bạn sẽ biết:
✅ Upload file từ máy người dùng lên server
✅ Sử dụng biến $_FILES
✅ Kiểm tra phần mở rộng (extension) của file
✅ Đổi tên file khi upload
✅ Upload ảnh an toàn hơn
Upload file là quá trình người dùng gửi một tập tin từ máy tính của họ lên website.
Ví dụ:
📷 Ảnh đại diện
📄 Tài liệu PDF
🎵 File âm thanh
🎬 Video
PHP hỗ trợ upload thông qua biến super global:
$_FILES
Muốn upload file phải có:
enctype="multipart/form-data"
Ví dụ:
<form method="POST" enctype="multipart/form-data">
<input type="file" name="avatar">
<button type="submit">
Upload
</button>
</form>
File PHP:
<?php
if(isset($_FILES["avatar"]))
{
echo "<pre>";
print_r($_FILES["avatar"]);
echo "</pre>";
}
?>
Kết quả:
Array
(
[name] => hinh.jpg
[type] => image/jpeg
[tmp_name] => C:\xampp\tmp\php123.tmp
[error] => 0
[size] => 152300
)
| 🔢 | 🏷️ Thuộc tính | 📝 Ý nghĩa |
|---|---|---|
| 1️⃣ | name | Tên file gốc |
| 2️⃣ | type | Loại MIME |
| 3️⃣ | tmp_name | File tạm trên server |
| 4️⃣ | error | Mã lỗi |
| 5️⃣ | size | Kích thước file |
PHP dùng hàm:
move_uploaded_file()
Ví dụ:
<?php
if(isset($_FILES["avatar"]))
{
move_uploaded_file(
$_FILES["avatar"]["tmp_name"],
"uploads/" . $_FILES["avatar"]["name"]
);
echo "Upload thành công";
}
?>
Trong project:
project/
│
├── index.php
│
└── uploads/
Thư mục:
uploads
là nơi lưu ảnh sau khi upload.
Không nên cho upload mọi loại file.
Lấy extension:
$ext = pathinfo(
$_FILES["avatar"]["name"],
PATHINFO_EXTENSION
);
echo $ext;
Ví dụ:
jpg
png
gif
<?php
$allow = [
"jpg",
"jpeg",
"png",
"gif"
];
$ext = strtolower(
pathinfo(
$_FILES["avatar"]["name"],
PATHINFO_EXTENSION
)
);
if(in_array($ext, $allow))
{
echo "Ảnh hợp lệ";
}
else
{
echo "Không phải file ảnh";
}
?>
Ví dụ chỉ cho phép tối đa 2 MB:
if($_FILES["avatar"]["size"] <= 2 * 1024 * 1024)
{
echo "Kích thước hợp lệ";
}
else
{
echo "File quá lớn";
}
Không nên lưu tên gốc.
Ví dụ:
$newName = time() . ".jpg";
Hoặc:
$newName = uniqid() . ".jpg";
Upload:
move_uploaded_file(
$_FILES["avatar"]["tmp_name"],
"uploads/" . $newName
);
<?php
if(isset($_FILES["avatar"]))
{
$allow = [
"jpg",
"jpeg",
"png",
"gif"
];
$ext = strtolower(
pathinfo(
$_FILES["avatar"]["name"],
PATHINFO_EXTENSION
)
);
if(!in_array($ext, $allow))
{
exit("File không hợp lệ");
}
$newName = uniqid() . "." . $ext;
move_uploaded_file(
$_FILES["avatar"]["tmp_name"],
"uploads/" . $newName
);
echo "Upload thành công";
}
?>
<form method="POST"
enctype="multipart/form-data">
<input type="file"
name="avatar">
<button type="submit">
Upload
</button>
</form>
Không nên tin tưởng:
$_FILES["file"]["name"]
Luôn:
✅ Kiểm tra extension
✅ Kiểm tra kích thước
✅ Đổi tên file
✅ Chỉ cho upload thư mục riêng
✅ Không cho upload file PHP
Upload một ảnh bất kỳ lên thư mục:
uploads/
Chỉ cho phép:
jpg
png
gif
Giới hạn kích thước:
2 MB
Đổi tên file bằng:
uniqid()
Trong bài này bạn đã học:
✅ $_FILES
✅ Form upload file
✅ move_uploaded_file()
✅ Kiểm tra extension
✅ Kiểm tra kích thước file
✅ Đổi tên file
➡️ Bài tiếp theo: Bài 20 — Session & Cookie
Cập nhật: 2026-06-22T16:34:48.794+07:00
Bạn muốn Google và các search engine chỉ index:
✅ https://domain.com (non-www)
❌ Không thu thập https://www.domain.com
Làm theo thứ tự này:
Trong HTML <head> thêm:
<link rel="canonical" href="https://domain.com<?php echo $_SERVER['REQUEST_URI']; ?>">
Ví dụ:
https://domain.com/bai-viet-1
sẽ báo cho bot:
Đây mới là URL chính thức.
Nếu dùng Apache .htaccess:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
Kết quả:
https://www.domain.com/a
↓
https://domain.com/a
Google sẽ dần bỏ bản www.
Vào:
Google Search Console
→ Add property
Thêm cả:
https://www.domain.com
https://domain.com
Sau đó:
gửi sitemap chỉ của non-www:
https://domain.com/sitemap.xml
Không gửi sitemap www
Nếu domain custom cho Blogger:
Vào:
Blogger
→ Settings
→ Publishing
Kiểm tra:
HTTPS Redirect: ON
Sau đó DNS:
www CNAME → ghs.google.com
thường Blogger bắt buộc có www, nên phải xử lý bằng redirect bên ngoài (Cloudflare).
Tạo Rule:
www.domain.com/*
Redirect 301:
https://domain.com/$1
Ví dụ:
www.domain.com/tin-tuc
↓
domain.com/tin-tuc
Không chặn nhầm:
Sai ❌:
Disallow: /
Đúng:
User-agent: *
Allow: /
Sitemap: https://domain.com/sitemap.xml
Google tìm:
site:www.domain.com
và:
site:domain.com
Ban đầu vẫn còn www vài tuần/tháng vì Google giữ cache.
Luồng chuẩn SEO hiện nay:
Người dùng
↓
www.domain.com
↓ 301
domain.com
↓
canonical
↓
Google index
Sau một thời gian Google sẽ gom sức mạnh SEO về non-www.
✨ [ Made by AI ] // Built with logic, code & curiosity 🧠⚙️
Cập nhật: 2026-06-21T04:29:44.905+07:00
Sau khi người dùng nhập dữ liệu vào form, bạn không nên tin tưởng dữ liệu đó ngay lập tức.
Người dùng có thể:
❌ Để trống dữ liệu
❌ Nhập khoảng trắng vô nghĩa
❌ Chèn mã HTML hoặc JavaScript độc hại
❌ Gửi dữ liệu sai định dạng
Vì vậy trước khi xử lý hoặc lưu vào database, chúng ta cần Validate (kiểm tra dữ liệu).
Sau bài này bạn sẽ biết:
✅ Kiểm tra dữ liệu bắt buộc nhập
✅ Loại bỏ khoảng trắng thừa
✅ Chống chèn mã HTML
✅ Hiển thị thông báo lỗi
✅ Tạo form an toàn hơn
Validate là quá trình:
🔎 Kiểm tra dữ liệu người dùng nhập có hợp lệ hay không.
Ví dụ:
| 📝 Dữ liệu | ✅ Hợp lệ |
|---|---|
| Nguyễn Văn A | Có |
| abc@gmail.com | Có |
| (để trống) | Không |
<script>alert(1)</script> | Không |
Ví dụ form:
<form method="post">
Họ tên:
<input type="text" name="fullname">
<button type="submit">
Gửi
</button>
</form>
Xử lý:
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($_POST["fullname"])) {
echo "Vui lòng nhập họ tên";
}
}
?>
empty()
Kiểm tra:
Chuỗi rỗng
null
false
giá trị không có dữ liệu
Ví dụ:
$name = "";
if (empty($name)) {
echo "Trống";
}
Kết quả:
Trống
Người dùng có thể nhập:
Nguyễn Văn A
hoặc
Nguyễn Văn A
với rất nhiều khoảng trắng thừa.
trim($chuoi);
Ví dụ:
$name = " Nguyễn Văn A ";
echo trim($name);
Kết quả:
Nguyễn Văn A
$name = trim($_POST["fullname"]);
Bây giờ dữ liệu sạch hơn trước khi xử lý.
Đây là hàm cực kỳ quan trọng.
Nó giúp chuyển các ký tự HTML thành dạng văn bản.
Người dùng nhập:
<script>alert('Hack')</script>
Nếu hiển thị trực tiếp:
echo $_POST["fullname"];
Trình duyệt sẽ chạy JavaScript.
⚠️ Đây là lỗ hổng XSS.
$name = htmlspecialchars($_POST["fullname"]);
echo $name;
Kết quả:
<script>alert('Hack')</script>
Script không thể chạy được.
Thông thường chúng ta kết hợp:
$name = trim($_POST["fullname"]);
$name = htmlspecialchars($name);
Hoặc viết gọn:
$name = htmlspecialchars(
trim($_POST["fullname"])
);
<?php
$message = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = trim($_POST["fullname"]);
if (empty($name)) {
$message = "Vui lòng nhập họ tên";
} else {
$name = htmlspecialchars($name);
$message = "Xin chào: " . $name;
}
}
?>
<form method="post">
Họ tên:
<input type="text" name="fullname">
<button type="submit">
Gửi
</button>
</form>
<p><?php echo $message; ?></p>
Nhập:
Nguyễn Văn A
Kết quả:
Xin chào: Nguyễn Văn A
Nhập:
<script>alert(1)</script>
Kết quả:
Xin chào: <script>alert(1)</script>
Script không chạy.
Trong thực tế ta thường tạo hàm:
function clean($data)
{
$data = trim($data);
$data = htmlspecialchars($data);
return $data;
}
Sử dụng:
$name = clean($_POST["fullname"]);
Code ngắn gọn và dễ tái sử dụng.
Tạo form:
Tên:
<input type="text" name="name">
Email:
<input type="text" name="email">
<button>Gửi</button>
Yêu cầu:
✅ Không được để trống
✅ Dùng trim()
✅ Dùng htmlspecialchars()
✅ Hiển thị dữ liệu sau khi submit
🎯 empty() → kiểm tra dữ liệu trống
🎯 trim() → xóa khoảng trắng đầu và cuối
🎯 htmlspecialchars() → chống XSS cơ bản
🎯 Luôn validate dữ liệu trước khi xử lý hoặc lưu database
🎯 Không bao giờ tin tưởng dữ liệu người dùng gửi lên
<form action="" method="post">
Tên:
<input type="text" name="name" id="" required>
Email:
<input type="email" name="email" id="" required>
<button type="submit">
Gửi
</button>
</form>
<?php
function clean1($data)
{
$data = trim($data);
$data = preg_replace('/\s+/', ' ', $data);
return htmlspecialchars($data);
}
$message = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = clean1($_POST["name"]);
$email = clean1($_POST["email"]);
if (empty($name)) {
$message = "Vui lòng nhập họ tên";
} else if (empty($email)) {
$message = "Vui lòng nhập email";
} else {
$message = "Xin chào: " . $name . " email: " . $email;
}
}
?>
<h3><?= $message; ?></h3>
💡Có thể đặt tên hàm ngắn gọn hơn:
function clean($data)
{
$data = trim($data);
$data = preg_replace('/\s+/', ' ', $data);
return htmlspecialchars($data);
}
Hoặc phiên bản một dòng:
function clean($data)
{
return htmlspecialchars(
preg_replace('/\s+/', ' ', trim($data))
);
}
Sau bài này bạn đã biết cách:
✅ Validate dữ liệu cơ bản
✅ Kiểm tra dữ liệu bắt buộc
✅ Làm sạch dữ liệu đầu vào
✅ Chống chèn mã HTML nguy hiểm
✅ Chuẩn bị cho việc Upload File và Database
👉 Bài tiếp theo: Bài 19 — Upload File bằng PHP
📂 $_FILES
🖼️ Upload ảnh
🔍 Kiểm tra phần mở rộng (extension)
🛡️ Chặn upload file nguy hiểm
Cập nhật: 2026-06-22T16:28:13.729+07:00
#laptrinhphpcoban
Sau khi học biến, điều kiện, vòng lặp, hàm và mảng, đã đến lúc tạo ra những trang web có thể nhận dữ liệu từ người dùng.
Đây chính là bước đầu tiên để xây dựng:
✅ Form đăng nhập
✅ Form liên hệ
✅ Form đăng ký thành viên
✅ Form tìm kiếm
✅ Form quản trị dữ liệu
Form là nơi người dùng nhập dữ liệu và gửi về máy chủ PHP xử lý.
Ví dụ:
<form>
<input type="text">
<button>Gửi</button>
</form>
<form method="post" action="">
<input type="text" name="username">
<button type="submit">
Gửi
</button>
</form>
Ý nghĩa:
| Thành phần | Chức năng |
|---|---|
| form | Khung chứa dữ liệu |
| method | Cách gửi dữ liệu |
| action | File xử lý |
| input | Ô nhập dữ liệu |
| button | Nút gửi |
Có 2 kiểu gửi dữ liệu phổ biến:
<form method="get">
<form method="post">
GET gửi dữ liệu lên URL.
Ví dụ:
<form method="get">
<input name="name">
<button>Gửi</button>
</form>
Nhập:
Nguyen Van A
URL sẽ thành:
localhost/form.php?name=Nguyen+Van+A
PHP nhận dữ liệu:
<?php
echo $_GET['name'];
?>
Kết quả:
Nguyen Van A
✅ Dễ kiểm tra dữ liệu
✅ Có thể bookmark
✅ Có thể chia sẻ URL
Ví dụ:
search.php?keyword=php
❌ Hiển thị dữ liệu trên URL
❌ Không phù hợp mật khẩu
❌ Giới hạn độ dài
Sai:
login.php?password=123456
POST gửi dữ liệu trong phần thân request.
Không hiển thị trên URL.
Ví dụ:
<form method="post">
<input name="username">
<button>Gửi</button>
</form>
PHP:
<?php
echo $_POST['username'];
?>
✅ Bảo mật hơn GET
✅ Gửi được dữ liệu lớn
✅ Dùng cho đăng nhập
✅ Dùng cho upload file
| 🔢 | ⚙️ GET | 📮 POST |
|---|---|---|
| 1️⃣ | Hiện trên URL | Không hiện URL |
| 2️⃣ | Dữ liệu nhỏ | Dữ liệu lớn |
| 3️⃣ | Kém bảo mật | Bảo mật hơn |
| 4️⃣ | Tìm kiếm | Đăng nhập |
| 5️⃣ | Bookmark được | Không bookmark |
action xác định file nhận dữ liệu.
Ví dụ:
<form method="post"
action="save.php">
Khi submit:
save.php
sẽ xử lý dữ liệu.
Thông dụng nhất:
<form method="post" action="">
hoặc:
<form method="post">
Dữ liệu sẽ gửi lại chính file hiện tại.
<form method="post">
<input
type="text"
name="fullname">
<button type="submit">
Gửi
</button>
</form>
<?php
if(isset($_POST['fullname']))
{
echo "Xin chào "
. $_POST['fullname'];
}
?>
Kết quả:
Xin chào Nguyễn Văn A
Kiểm tra dữ liệu có tồn tại hay không.
if(isset($_POST['fullname']))
{
echo "Đã gửi";
}
Nếu không kiểm tra:
echo $_POST['fullname'];
có thể phát sinh cảnh báo:
Undefined array key
<form method="post">
<input
type="text"
name="name">
<input
type="email"
name="email">
<button>
Gửi
</button>
</form>
PHP:
<?php
echo $_POST['name'];
echo "<br>";
echo $_POST['email'];
?>
<form method="post">
<input
type="text"
name="user">
<input
type="password"
name="pass">
<button>
Đăng nhập
</button>
</form>
<?php
if(isset($_POST['user']))
{
echo "User: "
. $_POST['user'];
}
?>
Không bao giờ tin dữ liệu người dùng.
Ví dụ:
$_POST['name']
có thể chứa:
<script>
alert(1)
</script>
Bài tiếp theo sẽ học cách:
✅ Kiểm tra dữ liệu
✅ Loại bỏ khoảng trắng
✅ Chống XSS
✅ Validate form
Tạo form gồm:
Họ tên
Tuổi
Khi nhấn Gửi:
Hiển thị:
Họ tên: ...
Email: ...
Tuổi: ...
Sau bài học này bạn đã biết:
✅ Tạo form HTML
✅ method GET
✅ method POST
✅ action
✅ $_GET
✅ $_POST
✅ isset()
Ở bài tiếp theo chúng ta sẽ học cách bảo vệ dữ liệu đầu vào bằng Validate Form để tránh lỗi và tăng tính bảo mật cho website.
x1
Cập nhật: 2026-06-22T11:37:10.974+07:00
#laptrinhphpcoban
Sau khi đã biết hàm và mảng, đây là lúc tìm hiểu cách PHP trao đổi dữ liệu giữa các phần khác nhau của chương trình.
PHP cung cấp:
✅ global
✅ $GLOBALS
✅ $_GET
✅ $_POST
✅ $_SERVER
Đây được gọi là Super Global Variables — các biến đặc biệt có thể truy cập ở mọi nơi trong chương trình.
Thông thường biến bên ngoài hàm không thể dùng trực tiếp bên trong hàm.
Ví dụ:
<?php
$name = "TSM";
function hello()
{
echo $name;
}
hello();
Kết quả:
Undefined variable $name
Muốn sử dụng biến ngoài hàm:
<?php
$name = "TSM";
function hello()
{
global $name;
echo $name;
}
hello();
Kết quả:
TSM
<?php
$a = 10;
$b = 20;
function sum()
{
global $a, $b;
echo $a + $b;
}
sum();
Kết quả:
30
PHP tự động lưu tất cả biến toàn cục vào mảng $GLOBALS.
Ví dụ:
<?php
$name = "PHP";
$year = 2025;
print_r($GLOBALS);
Kết quả sẽ chứa:
Array
(
[name] => PHP
[year] => 2025
)
<?php
$price = 100;
function showPrice()
{
echo $GLOBALS['price'];
}
showPrice();
Kết quả:
100
<?php
$count = 1;
function increase()
{
$GLOBALS['count']++;
}
increase();
echo $count;
Kết quả:
2
$_GET dùng để nhận dữ liệu từ URL.
Ví dụ:
test.php?name=TSM
Trong file:
<?php
echo $_GET['name'];
Kết quả:
TSM
URL:
test.php?name=TSM&age=43
PHP:
<?php
echo $_GET['name'];
echo "<br>";
echo $_GET['age'];
Kết quả:
TSM
43
$_POST dùng để nhận dữ liệu từ form.
Ví dụ:
<form method="post">
<input type="text" name="username">
<button>Gửi</button>
</form>
PHP:
<?php
echo $_POST['username'];
Khi nhập:
admin
Kết quả:
admin
Nên kiểm tra trước khi dùng:
<?php
if(isset($_POST['username']))
{
echo $_POST['username'];
}
Tránh lỗi:
Undefined array key
$_SERVER chứa thông tin về máy chủ và request hiện tại.
Ví dụ:
<?php
print_r($_SERVER);
PHP sẽ trả về rất nhiều thông tin.
echo $_SERVER['PHP_SELF'];
Ví dụ:
/index.php
echo $_SERVER['HTTP_HOST'];
Ví dụ:
localhost
echo $_SERVER['REQUEST_METHOD'];
Kết quả:
GET
hoặc
POST
echo $_SERVER['HTTP_USER_AGENT'];
Ví dụ:
Chrome
Edge
Firefox
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
echo "Form đã được gửi";
}
else
{
echo "Chưa gửi form";
}
Đây là cách cực kỳ phổ biến trong các website PHP.
Không nên lạm dụng:
global
$GLOBALS
Trong các dự án lớn.
Thay vào đó:
✅ Truyền tham số vào hàm
✅ Sử dụng class/object
✅ Quản lý dữ liệu rõ ràng hơn
| 🔢 | 📚 Nội dung | ✅ Ghi nhớ |
|---|---|---|
| 1️⃣ | 🌍 global | Dùng biến toàn cục trong hàm |
| 2️⃣ | 📦 $GLOBALS | Mảng chứa toàn bộ biến global |
| 3️⃣ | 🔗 $_GET | Nhận dữ liệu từ URL |
| 4️⃣ | 📝 $_POST | Nhận dữ liệu từ form |
| 5️⃣ | 🖥️ $_SERVER | Thông tin request và server |
| 6️⃣ | 🛡️ isset() | Kiểm tra dữ liệu tồn tại |
| 7️⃣ | ⚡ REQUEST_METHOD | Xác định GET hay POST |
Form hoạt động như thế nào?
Thu thập dữ liệu người dùng
method GET
method POST
action
Xử lý form bằng PHP
Bắt đầu bước đầu tiên để tạo website động thực sự bằng PHP. 🚀
Cập nhật: 2026-06-21T23:16:07.847+07:00
Trong thực tế lập trình, dữ liệu thường cần được sắp xếp trước khi hiển thị cho người dùng.
Ví dụ:
Danh sách sản phẩm theo giá tăng dần
Bảng điểm từ cao xuống thấp
Danh sách thành viên theo tên A → Z
Sắp xếp dữ liệu theo mã hoặc ID
PHP cung cấp nhiều hàm sắp xếp có sẵn giúp xử lý cực kỳ nhanh.
Sắp xếp giá trị từ nhỏ đến lớn hoặc A → Z.
<?php
$numbers = [5, 2, 8, 1, 9];
sort($numbers);
print_r($numbers);
?>
Kết quả:
Array
(
[0] => 1
[1] => 2
[2] => 5
[3] => 8
[4] => 9
)
Ví dụ chuỗi:
<?php
$fruits = ["Cam", "Táo", "Chuối"];
sort($fruits);
print_r($fruits);
?>
Kết quả:
Array
(
[0] => Cam
[1] => Chuối
[2] => Táo
)
sort() sẽ:
Sắp xếp lại giá trị
Đánh lại chỉ số từ 0
Ví dụ:
<?php
$data = [
10 => "PHP",
20 => "Java",
30 => "Python"
];
sort($data);
print_r($data);
?>
Kết quả:
Array
(
[0] => Java
[1] => PHP
[2] => Python
)
Key cũ bị mất.
Ngược lại với sort().
<?php
$numbers = [5, 2, 8, 1, 9];
rsort($numbers);
print_r($numbers);
?>
Kết quả:
Array
(
[0] => 9
[1] => 8
[2] => 5
[3] => 2
[4] => 1
)
Ví dụ bảng điểm:
<?php
$scores = [8, 10, 6, 9, 7];
rsort($scores);
print_r($scores);
?>
Kết quả:
10
9
8
7
6
Rất hữu ích với mảng kết hợp.
<?php
$students = [
"Nam" => 8,
"Lan" => 10,
"Huy" => 7
];
asort($students);
print_r($students);
?>
Kết quả:
Array
(
[Huy] => 7
[Nam] => 8
[Lan] => 10
)
Key được giữ nguyên.
Điều này rất quan trọng khi:
Danh sách sản phẩm
Danh sách người dùng
Danh sách điểm số
Thay vì sắp xếp giá trị, hàm này sắp xếp khóa.
<?php
$students = [
"Nam" => 8,
"Lan" => 10,
"Huy" => 7
];
ksort($students);
print_r($students);
?>
Kết quả:
Array
(
[Huy] => 7
[Lan] => 10
[Nam] => 8
)
Ví dụ mã sản phẩm:
<?php
$products = [
"SP003" => "Laptop",
"SP001" => "Chuột",
"SP002" => "Bàn phím"
];
ksort($products);
print_r($products);
?>
Kết quả:
SP001
SP002
SP003
| 🔢 | 🛠️ Hàm | 📋 Sắp xếp theo | 🔑 Giữ key? |
|---|---|---|---|
| 1️⃣ | sort() | Value tăng dần | ❌ Không |
| 2️⃣ | rsort() | Value giảm dần | ❌ Không |
| 3️⃣ | asort() | Value tăng dần | ✅ Có |
| 4️⃣ | ksort() | Key tăng dần | ✅ Có |
Sắp xếp bảng điểm học sinh:
<?php
$scores = [
"Nam" => 8,
"Lan" => 10,
"Huy" => 7,
"Minh" => 9
];
arsort($scores);
foreach ($scores as $name => $score) {
echo $name . " : " . $score . "<br>";
}
?>
Kết quả:
Lan : 10
Minh : 9
Nam : 8
Huy : 7
Đây chính là cách tạo bảng xếp hạng đơn giản.
✅ sort() → tăng dần theo giá trị
✅ rsort() → giảm dần theo giá trị
✅ asort() → tăng dần theo giá trị và giữ key
✅ ksort() → tăng dần theo key
✅ Các hàm sắp xếp của PHP hoạt động trực tiếp trên mảng gốc
Tạo mảng:
[15, 8, 20, 3, 12]
Sắp xếp tăng dần bằng sort().
Sắp xếp giảm dần mảng trên bằng rsort().
Tạo mảng:
[
"PHP" => 9,
"Java" => 7,
"Python" => 10
]
Sử dụng asort().
Sử dụng ksort() với:
[
"C" => 1,
"A" => 2,
"B" => 3
]
Tạo bảng xếp hạng điểm số bằng foreach kết hợp arsort().
🎉 Bài tiếp theo: Bài 16 — GLOBAL & SUPER GLOBAL, nơi chúng ta sẽ tìm hiểu cách PHP trao đổi dữ liệu giữa các file, URL, form và máy chủ.
Cập nhật: 2026-06-21T23:07:50.417+07:00
Cài đặt extension Tampermonkey trong Edge (mở đúng tab FireAnt - Biểu đồ dạng TAB)
Đây là phiên bản Tampermonkey MVP (chạy thử nghiệm đầu tiên) để:
✅ Nút⚙️bên cạnh mã cổ phiếu để nhập giá vốn (có thể nhập giá Close cây tạo đáy VNI)
✅ Lưu vào LocalStorage
✅ Hiển thị Giá vốn + % lời/lỗ ngay dưới giá hiện tại
✅ Tự cập nhật mỗi 05 giây
Cài script mới trong Tampermonkey và dán toàn bộ:
// ==UserScript==
// @name FireAnt Portfolio Overlay
// @namespace https://fireant.vn/
// @version 1.0
// @description Thêm giá vốn và % lời lỗ vào FireAnt Watchlist
// @author TSM
// @match https://fireant.vn/*
// @grant none
// ==/UserScript==
(function () {
'use strict';
const STORAGE_KEY = 'fireant_costs';
function loadCosts() {
try {
return JSON.parse(localStorage.getItem(STORAGE_KEY)) || {};
} catch (e) {
return {};
}
}
function saveCosts(data) {
localStorage.setItem(
STORAGE_KEY,
JSON.stringify(data)
);
}
function getCost(symbol) {
const data = loadCosts();
return data[symbol];
}
function setCost(symbol, cost) {
const data = loadCosts();
data[symbol] = parseFloat(cost);
saveCosts(data);
}
function removeCost(symbol) {
const data = loadCosts();
delete data[symbol];
saveCosts(data);
}
function getRows() {
return document.querySelectorAll(
'.list-row'
);
}
function processRow(row) {
const link = row.querySelector(
'a[href*="/charts/content/symbols/"]'
);
if (!link) return;
const symbol =
link.textContent.trim();
// ==========================
// Nút chỉnh giá vốn
// ==========================
let editBtn =
row.querySelector('.tm-edit-cost');
if (!editBtn) {
editBtn =
document.createElement('span');
editBtn.className =
'tm-edit-cost';
editBtn.textContent = '⚙️';
editBtn.style.cursor = 'pointer';
editBtn.style.marginLeft = '6px';
editBtn.style.fontSize = '12px';
editBtn.addEventListener(
'click',
function (e) {
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
const cost = getCost(symbol);
const oldValue =
cost === undefined
? ''
: cost;
const value =
prompt(
`Nhập giá vốn ${symbol} (để trống để reset)`,
oldValue
);
if (value === null) return;
if (String(value).trim() === '') {
removeCost(symbol);
} else {
setCost(symbol, value);
}
updateAll();
},
true
);
link.insertAdjacentElement('afterend',editBtn);
}
// ==========================
// Giá hiện tại
// ==========================
//FireAnt deploy giá trị class khác phải sửa lại
const priceNode =
row.querySelector(
'.sc-fHheEh span'
);
if (!priceNode) return;
const currentPrice =
parseFloat(
priceNode.innerText
.replace(',', '')
);
if (isNaN(currentPrice))
return;
const cost =
getCost(symbol);
let info =
row.querySelector('.tm-profit-box');
if (!info) {
info = document.createElement('div');
info.className = 'tm-profit-box';
info.style.gap = '6px';
info.style.marginLeft = '6px';
info.style.fontSize = '9px';
const priceContainer = priceNode.parentElement;
priceContainer.appendChild(info);
}
// ==========================
// Chưa nhập giá vốn
// ==========================
if (
cost === undefined || cost === null
) {
info.innerHTML = '';
return;
}
// ==========================
// Tính lời lỗ
// ==========================
const pl =
(
(
currentPrice - cost
)
/ cost
* 100
).toFixed(2);
const color =
pl >= 0
? '#00aa00'
: '#ff3333';
info.innerHTML = `
<span style="
color:#888;
white-space:nowrap;
font-weight:600;
">
💰 ${cost}
</span>
<span style="
color:${color};
font-weight:700;
white-space:nowrap;
">
📈 ${pl}%
</span>
`;
}
//END function processRow(row)
function updateAll() {
getRows().forEach(
processRow
);
}
setInterval(() => {
//chỉ update khi tab có fireant được xem
if (!document.hidden) {
updateAll();
}
}, 5000);
updateAll();
})();
// đóng và gọi function ngay lập tức
🔹 Mở Watchlist trên FireAnt
🔹 Bấm vào ⚙️:
MSB
🔹 Nhập:
13.5
🔹 Kết quả:
MSB
14.60
💰 13.50
📈 +8.15%Phiên bản 2 tôi có thể bổ sung:
✅ Số lượng cổ phiếu
✅ Lãi/lỗ bằng tiền
✅ Tổng NAV danh mục
✅ Export / Import JSON
✅ Đồng bộ nhiều watchlist
✅ Panel nổi bên phải giống màn hình CTCK
Cập nhật: 2026-06-15T17:15:29.546+07:00
#laptrinhphpcoban
PHP là gì?
PHP dùng để làm gì?
Cài Laragon / XAMPP
VS Code + Extension PHP
Chạy localhost đầu tiên
echo
Xuất HTML bằng PHP
Xuống dòng <br>
Khai báo biến
Quy tắc đặt tên
Gán dữ liệu
Biến động của PHP
string
integer
float
boolean
array
null
object
var_dump()
Nối chuỗi
Dấu nháy đơn vs kép
Escape ký tự
strlen()
strtoupper()
const
define()
Magic constants
Toán tử số học
Toán tử gán
Toán tử so sánh
Toán tử logic
Toán tử tăng giảm
Toán tử nối chuỗi
if
else
else if
toán tử 3 ngôi
switch
break
default
while
do while
for
break
continue
Duyệt mảng
key => value
function
tham số
return
default parameter
Array thường
Array kết hợp
Array đa chiều
sort()
rsort()
asort()
ksort()
global
$GLOBALS
$_GET
$_POST
$_SERVER
method GET
method POST
action
required
trim()
htmlspecialchars()
$_FILES
upload ảnh
kiểm tra extension
session_start()
lưu đăng nhập
cookie cơ bản
Database là gì?
phpMyAdmin
Tạo database
mysqli_connect()
kiểm tra lỗi
Danh sách bài viết
Thêm
Sửa
Xóa
✅ Hiểu PHP core
✅ Tự viết website cơ bản
✅ Biết CRUD MySQL
✅ Đọc được source PHP thực tế
✅ Chuẩn bị học Laravel / WordPress / Flarum
🔥 Series này có thể kéo rất mạnh:
Facebook group
TikTok code
Blogger
YouTube Shorts
Forum công nghệ
Đặc biệt keyword:
“PHP 8.2 từ zero”
vẫn còn traffic khá ổn ở Việt Nam 😄
✨ made by AI
p/S: khi nào ra PHP ver 9x thì viết lại series này.
Cập nhật: 2026-06-22T11:36:49.584+07:00
#laptrinhphpcoban
Sau bài này bạn sẽ biết:
✅ Mảng là gì
✅ Tạo mảng trong PHP
✅ Truy cập phần tử mảng
✅ Array thường (Indexed Array)
✅ Array kết hợp (Associative Array)
✅ Array đa chiều (Multidimensional Array)
Mảng (Array) là kiểu dữ liệu cho phép lưu nhiều giá trị trong cùng một biến.
Thay vì:
$mon1 = "PHP";
$mon2 = "MySQL";
$mon3 = "Laravel";
Ta có thể:
$khoahoc = ["PHP", "MySQL", "Laravel"];
👉 Gọn hơn rất nhiều.
Đây là loại mảng phổ biến nhất.
<?php
$traiCay = ["Cam", "Xoài", "Táo"];
echo $traiCay[0];
Kết quả:
Cam
PHP tự đánh số từ 0.
| 🔢 Index | 🍎 Giá trị |
|---|---|
| 0 | Cam |
| 1 | Xoài |
| 2 | Táo |
Ví dụ:
echo $traiCay[1];
Kết quả:
Xoài
<?php
$traiCay[] = "Dưa hấu";
print_r($traiCay);
Kết quả:
Array
(
[0] => Cam
[1] => Xoài
[2] => Táo
[3] => Dưa hấu
)
Cách cũ nhưng vẫn dùng được:
<?php
$so = array(10, 20, 30);
PHP hiện đại thường dùng:
$so = [10, 20, 30];
Ngắn gọn hơn.
Dùng:
count()
Ví dụ:
<?php
$traiCay = ["Cam", "Xoài", "Táo"];
echo count($traiCay);
Kết quả:
3
Thay vì dùng số làm index, ta dùng tên.
<?php
$user = [
"name" => "Tiến sĩ M",
"age" => 43,
"job" => "Developer"
];
echo $user["name"];
Kết quả:
Tiến sĩ M
Thay vì:
$user[0];
$user[1];
$user[2];
Ta có:
$user["name"];
$user["age"];
$user["job"];
👉 Dễ đọc hơn rất nhiều.
<?php
$user["age"] = 44;
echo $user["age"];
Kết quả:
44
<?php
$user["city"] = "Hồ Chí Minh";
print_r($user);
Thông tin sản phẩm:
<?php
$product = [
"id" => 1,
"name" => "Laptop",
"price" => 15000000,
"stock" => 25
];
echo $product["name"];
Kết quả:
Laptop
Mảng chứa mảng khác bên trong.
Ví dụ danh sách sinh viên:
<?php
$students = [
["An", 20],
["Bình", 21],
["Cường", 22]
];
Cấu trúc:
students
├─ [0]
│ ├─ An
│ └─ 20
├─ [1]
│ ├─ Bình
│ └─ 21
└─ [2]
├─ Cường
└─ 22
echo $students[1][0];
Kết quả:
Bình
Danh sách sản phẩm:
<?php
$products = [
[
"id" => 1,
"name" => "Laptop",
"price" => 15000000
],
[
"id" => 2,
"name" => "Chuột",
"price" => 300000
]
];
echo $products[0]["name"];
Kết quả:
Laptop
Dùng:
print_r()
Ví dụ:
print_r($products);
Hoặc:
var_dump($products);
Hiển thị chi tiết kiểu dữ liệu hơn.
Mẹo:
02 hàm print_r vs var_dump view source dễ nhìn hơn (xuống dòng)
<?php
$products = [
[
"id" => 1,
"name" => "Laptop",
"price" => 15000000
],
[
"id" => 2,
"name" => "Chuột",
"price" => 300000
],
[
"id" => 3,
"name" => "Bàn phím",
"price" => 500000
]
];
echo "<h3>Danh sách sản phẩm</h3>";
foreach ($products as $product) {
echo $product["name"] . " - ";
echo number_format($product["price"]) . " VNĐ";
echo "<br>";
}
Kết quả:
Laptop - 15,000,000 VNĐ
Chuột - 300,000 VNĐ
Bàn phím - 500,000 VNĐ
| 🔢 | 📚 Nội dung | ✅ Ghi nhớ |
|---|---|---|
| 1️⃣ | Array thường | Dùng index số 0,1,2... |
| 2️⃣ | Array kết hợp | Dùng key => value |
| 3️⃣ | Array đa chiều | Mảng chứa mảng |
| 4️⃣ | count() | Đếm phần tử |
| 5️⃣ | print_r() | Xem nhanh dữ liệu |
| 6️⃣ | var_dump() | Xem chi tiết kiểu dữ liệu |
| 7️⃣ | foreach | Duyệt mảng hiệu quả |
👉 Bài tiếp theo: Bài 15 — Sắp xếp mảng trong PHP (sort(), rsort(), asort(), ksort()) giúp dữ liệu hiển thị theo thứ tự mong muốn trước khi đưa ra giao diện web.
Cập nhật: 2026-06-21T23:08:17.540+07:00
Sau bài này bạn sẽ biết:
✅ Hàm (Function) là gì
✅ Cách tạo hàm trong PHP
✅ Truyền tham số vào hàm
✅ Trả dữ liệu bằng return
✅ Giá trị mặc định của tham số (Default Parameter)
Hàm (Function) là một khối lệnh được đặt tên để thực hiện một công việc nào đó.
Thay vì viết đi viết lại nhiều lần, ta gom chúng thành một hàm rồi gọi khi cần.
📌 Ví dụ:
Thay vì:
echo "Xin chào Tiến sĩ M";
echo "<br>";
echo "Xin chào Nam";
echo "<br>";
echo "Xin chào Lan";
echo "<br>";
Ta tạo hàm:
function xinChao()
{
echo "Xin chào!";
}
Gọi:
xinChao();
Kết quả:
Xin chào!
function tenHam()
{
// code
}
Ví dụ:
function hello()
{
echo "Hello PHP";
}
Gọi hàm:
hello();
Kết quả:
Hello PHP
Tham số giúp truyền dữ liệu từ bên ngoài vào hàm.
Ví dụ:
function xinChao($ten)
{
echo "Xin chào " . $ten;
}
Gọi:
xinChao("Tiến sĩ M");
Kết quả:
Xin chào Tiến sĩ M
function cong($a, $b)
{
echo $a + $b;
}
Gọi:
cong(10, 20);
Kết quả:
30
return dùng để trả kết quả về nơi gọi hàm.
Ví dụ:
function cong($a, $b)
{
return $a + $b;
}
Gọi:
$kq = cong(5, 7);
echo $kq;
Kết quả:
12
function cong($a, $b)
{
echo $a + $b;
}
In trực tiếp ra màn hình.
function cong($a, $b)
{
return $a + $b;
}
Trả dữ liệu về để xử lý tiếp.
Ví dụ:
$tong = cong(10, 20);
echo $tong * 2;
Kết quả:
60
Ta có thể đặt giá trị mặc định.
Ví dụ:
function xinChao($ten = "Khách")
{
echo "Xin chào " . $ten;
}
Gọi:
xinChao();
Kết quả:
Xin chào Khách
Gọi:
xinChao("Tiến sĩ M");
Kết quả:
Xin chào Tiến sĩ M
function dienTichHCN($dai, $rong)
{
return $dai * $rong;
}
echo dienTichHCN(10, 5);
Kết quả:
50
date_default_timezone_set('Asia/Ho_Chi_Minh');
function hienThiNgayGio()
{
echo date("d/m/Y H:i:s");
}
hienThiNgayGio();
Ví dụ kết quả:
10/06/2026 08:30:15
function taoButton($text)
{
return "<button>$text</button>";
}
echo taoButton("Lưu");
Kết quả:
<button>Lưu</button>
Hiển thị:
Lưu
PHP hiện đại hỗ trợ khai báo kiểu trả về.
function cong(int $a, int $b): int
{
return $a + $b;
}
Ví dụ:
echo cong(10, 5);
Kết quả:
15
Tạo các hàm sau:
function tong($a, $b)
{
return $a + $b;
}
function tinhTuoi($namSinh)
{
return date("Y") - $namSinh;
}
function vietHoa($text)
{
return mb_strtoupper($chuoi, 'UTF-8');
}
function hello()
{
echo "Hello";
}
Không có:
hello();
→ Không chạy gì cả.
Sai:
function hello
{
}
Đúng:
function hello()
{
}
Sai:
function cong($a, $b)
{
$a + $b;
}
Đúng:
function cong($a, $b)
{
return $a + $b;
}
| 🔢 | 📚 Nội dung | ✅ Ghi nhớ |
|---|---|---|
| 1️⃣ | 🛠 function | Tạo hàm mới |
| 2️⃣ | 📥 Tham số | Nhận dữ liệu từ bên ngoài |
| 3️⃣ | 🔙 return | Trả kết quả về nơi gọi |
| 4️⃣ | 🎁 Default Parameter | Giá trị mặc định |
| 5️⃣ | 🚀 Type Hint | Khai báo kiểu dữ liệu |
| 6️⃣ | ♻️ Function | Giúp tái sử dụng code |
🎯 Sau bài này bạn đã biết cách đóng gói code thành các Function để chương trình gọn gàng, dễ bảo trì và là nền tảng cực kỳ quan trọng trước khi học Mảng (Array) ở Bài 14.
Cập nhật: 2026-06-21T23:08:52.759+07:00
foreach là vòng lặp chuyên dùng để duyệt các phần tử trong mảng.
Thay vì phải đếm số phần tử như for, PHP sẽ tự lấy từng phần tử cho chúng ta.
👉 Đây là vòng lặp được sử dụng cực kỳ nhiều trong các ứng dụng PHP thực tế.
foreach ($mang as $giatri) {
// xử lý dữ liệu
}
Ví dụ:
<?php
$fruits = ["Cam", "Táo", "Xoài"];
foreach ($fruits as $fruit) {
echo $fruit . "<br>";
}
?>
📌 Kết quả:
Cam
Táo
Xoài
PHP sẽ lần lượt lấy từng phần tử trong mảng:
Cam
↓
Táo
↓
Xoài
Mỗi lần lặp:
$fruit
sẽ nhận giá trị của một phần tử.
Danh sách trái cây:
<?php
$fruits = [
"Cam",
"Táo",
"Xoài",
"Chuối",
"Dưa hấu"
];
foreach ($fruits as $fruit) {
echo "🍎 " . $fruit . "<br>";
}
?>
Kết quả:
🍎 Cam
🍎 Táo
🍎 Xoài
🍎 Chuối
🍎 Dưa hấu
Trong PHP, mỗi phần tử của mảng đều có:
Key (khóa)
Value (giá trị)
Ví dụ:
<?php
$user = [
"name" => "Nguyễn C",
"age" => 33,
"city" => "HCM"
];
foreach ($user as $key => $value) {
echo $key . " : " . $value . "<br>";
}
?>
Kết quả:
name : Minh
age : 43
city : HCM
<?php
$products = [
"Cam" => 25000,
"Táo" => 45000,
"Xoài" => 60000
];
echo "<table border='1'>";
foreach ($products as $name => $price) {
echo "<tr>";
echo "<td>$name</td>";
echo "<td>$price</td>";
echo "</tr>";
}
echo "</table>";
?>
Kết quả:
| Sản phẩm | Giá |
|---|---|
| Cam | 25000 |
| Táo | 45000 |
| Xoài | 60000 |
<?php
$users = [
[
"name" => "Nguyễn C",
"age" => 33
],
[
"name" => "Lan",
"age" => 25
]
];
foreach ($users as $user) {
echo $user['name'];
echo " - ";
echo $user['age'];
echo "<br>";
}
?>
Kết quả:
Nguyễn C - 43
Lan - 25
asSai:
foreach ($arr $item) {
}
Đúng:
foreach ($arr as $item) {
}
Sai:
$name = "Minh";
foreach ($name as $item) {
}
Lỗi:
Warning: foreach() argument must be of type array|object
| 🔢 | 🛠️ Tình huống | ✅ Nên dùng |
|---|---|---|
| 1️⃣ | Duyệt danh sách sản phẩm | ✔️ |
| 2️⃣ | Duyệt bài viết blog | ✔️ |
| 3️⃣ | Duyệt menu website | ✔️ |
| 4️⃣ | Duyệt dữ liệu MySQL | ✔️ |
| 5️⃣ | Đếm số lần lặp cố định | ❌ Dùng for |
Tạo mảng:
$colors = [
"🟥 Đỏ",
"🟦 Xanh",
"🟨 Vàng"
];
Hiển thị toàn bộ màu sắc bằng foreach.
Tạo mảng:
$student = [
"Tên" => "Nguyễn C",
"Tuổi" => 33,
"Nghề" => "Lập trình viên"
];
In ra:
Tên : Nguyễn C
Tuổi : 33
Nghề : Lập trình viên
Tạo mảng sản phẩm:
$products = [
"🍊 Cam" => 25000,
"🍎 Táo" => 45000,
"🥭 Xoài" => 60000,
"🍉 Dưa hấu" => 30000
];
Dùng foreach tạo bảng HTML hiển thị:
| STT | Tên sản phẩm | Giá |
|---|
Sau bài này bạn đã biết:
✅ Vòng lặp foreach là gì
✅ Duyệt mảng nhanh và dễ dàng
✅ Sử dụng key => value
✅ Duyệt mảng kết hợp
✅ Duyệt mảng nhiều chiều
✅ Xuất dữ liệu ra HTML
👉 Ở bài tiếp theo chúng ta sẽ học Hàm trong PHP (Function) — nền tảng để viết code gọn gàng, tái sử dụng và chuyên nghiệp hơn.
Cập nhật: 2026-06-21T23:09:21.131+07:00
Sau bài này bạn sẽ biết:
✅ Sử dụng vòng lặp for
✅ Hiểu 3 thành phần của for
✅ Dùng break
✅ Dùng continue
✅ Biết khi nào nên dùng for thay vì while
for là vòng lặp được dùng khi:
👉 Biết trước số lần lặp
Ví dụ:
Đếm từ 1 đến 100
In bảng cửu chương
Duyệt danh sách theo chỉ số
for (khởi_tạo; điều_kiện; tăng_giảm) {
// code
}
Ví dụ:
for ($i = 1; $i <= 5; $i++) {
echo $i . "<br>";
}
Kết quả:
1
2
3
4
5
for ($i = 1; $i <= 5; $i++)
| 🔢 | Thành phần | Ý nghĩa |
|---|---|---|
| 1️⃣ | $i = 1 | Khởi tạo biến |
| 2️⃣ | $i <= 5 | Điều kiện lặp |
| 3️⃣ | $i++ | Tăng biến sau mỗi vòng |
Quy trình:
$i = 1
↓
Kiểm tra điều kiện
↓
Chạy code
↓
$i++
↓
Lặp lại
for ($i = 1; $i <= 10; $i++) {
echo $i . "<br>";
}
Kết quả:
1
2
3
4
5
6
7
8
9
10
for ($i = 10; $i >= 1; $i--) {
echo $i . "<br>";
}
Kết quả:
10
9
8
7
6
5
4
3
2
1
for ($i = 2; $i <= 20; $i += 2) {
echo $i . "<br>";
}
Kết quả:
2
4
6
8
10
12
14
16
18
20
$tong = 0;
for ($i = 1; $i <= 100; $i++) {
$tong += $i;
}
echo $tong;
Kết quả:
5050
for ($i = 1; $i <= 10; $i++) {
echo "5 x $i = " . (5 * $i);
echo "<br>";
}
Kết quả:
5 x 1 = 5
5 x 2 = 10
...
5 x 10 = 50
break dùng để thoát khỏi vòng lặp ngay lập tức.
Ví dụ:
for ($i = 1; $i <= 10; $i++) {
if ($i == 5) {
break;
}
echo $i . "<br>";
}
Kết quả:
1
2
3
4
Khi gặp:
$i == 5
PHP dừng vòng lặp luôn.
continue bỏ qua vòng hiện tại.
Ví dụ:
for ($i = 1; $i <= 10; $i++) {
if ($i == 5) {
continue;
}
echo $i . "<br>";
}
Kết quả:
1
2
3
4
6
7
8
9
10
Số 5 bị bỏ qua.
Giả sử hiển thị danh sách bài viết:
for ($i = 1; $i <= 5; $i++) {
echo "<h3>Bài viết $i</h3>";
}
Kết quả:
<h3>Bài viết 1</h3>
<h3>Bài viết 2</h3>
<h3>Bài viết 3</h3>
<h3>Bài viết 4</h3>
<h3>Bài viết 5</h3>
| 🔢 | So sánh | FOR | WHILE |
|---|---|---|---|
| 1️⃣ | Biết trước số lần lặp | ✅ | ⚠️ |
| 2️⃣ | Điều kiện phức tạp | ⚠️ | ✅ |
| 3️⃣ | Dễ đọc | ✅ | ⚠️ |
| 4️⃣ | Đếm số | ✅ | ✅ |
| 5️⃣ | Đọc dữ liệu liên tục | ⚠️ | ✅ |
Khi thấy:
$i = 1;
while ($i <= 10) {
echo $i;
$i++;
}
Có thể viết gọn thành:
for ($i = 1; $i <= 10; $i++) {
echo $i;
}
Đây là cách lập trình viên PHP sử dụng nhiều nhất.
In các số từ 1 → 50
In các số lẻ từ 1 → 99
Ví dụ:
1
3
5
...
99
Tính:
1 + 2 + 3 + ... + 1000
In bảng cửu chương số 9
9 x 1 = 9
...
9 x 10 = 90
In các số từ 1 → 20 nhưng bỏ qua số 7
Gợi ý:
continue;
| 🔢 | 📚 Kiến thức | ✅ Đã học |
|---|---|---|
| 1️⃣ | Vòng lặp for | ✅ |
| 2️⃣ | Khởi tạo biến | ✅ |
| 3️⃣ | Điều kiện lặp | ✅ |
| 4️⃣ | break | ✅ |
| 5️⃣ | continue | ✅ |
| 6️⃣ | So sánh for và while | ✅ |
➡️ Bài tiếp theo: Bài 12 — FOREACH
Học cách duyệt mảng nhanh chóng và là công cụ được dùng cực nhiều trong PHP thực tế.
Cập nhật: 2026-06-21T23:09:51.594+07:00
Sau bài này bạn sẽ biết:
✅ Sử dụng while
✅ Sử dụng do...while
✅ Tạo bộ đếm tự động
✅ Duyệt dữ liệu bằng vòng lặp
✅ Hiểu sự khác nhau giữa while và do...while
Vòng lặp giúp thực hiện một đoạn code nhiều lần mà không cần viết lặp lại.
Ví dụ:
❌ Không dùng vòng lặp
echo "Xin chào<br>";
echo "Xin chào<br>";
echo "Xin chào<br>";
echo "Xin chào<br>";
echo "Xin chào<br>";
✅ Dùng vòng lặp
$i = 1;
while ($i <= 5) {
echo "Xin chào<br>";
$i++;
}
Kết quả:
Xin chào
Xin chào
Xin chào
Xin chào
Xin chào
while (điều_kiện) {
// code
}
PHP sẽ:
1️⃣ Kiểm tra điều kiện
2️⃣ Nếu đúng → chạy code
3️⃣ Quay lại kiểm tra điều kiện
4️⃣ Lặp cho đến khi điều kiện sai
$i = 1;
while ($i <= 10) {
echo $i . "<br>";
$i++;
}
Kết quả:
1
2
3
4
5
6
7
8
9
10
Sai:
$i = 1;
while ($i <= 5) {
echo $i;
}
Vì:
$i
không bao giờ thay đổi.
PHP sẽ chạy mãi mãi.
$i = 1;
while ($i <= 10) {
echo "2 x $i = " . (2 * $i) . "<br>";
$i++;
}
Kết quả:
2 x 1 = 2
2 x 2 = 4
...
2 x 10 = 20
$i = 1;
$tong = 0;
while ($i <= 100) {
$tong += $i;
$i++;
}
echo $tong;
Kết quả:
5050
Khác với while:
👉 do...while chạy ít nhất 1 lần.
Cú pháp:
do {
// code
} while (điều_kiện);
$i = 1;
do {
echo $i . "<br>";
$i++;
} while ($i <= 5);
Kết quả:
1
2
3
4
5
$i = 10;
while ($i < 5) {
echo $i;
}
Kết quả:
Không in gì
$i = 10;
do {
echo $i;
} while ($i < 5);
Kết quả:
10
Vì code bên trong được chạy trước khi kiểm tra điều kiện.
$login = false;
$lanThu = 1;
while (!$login && $lanThu <= 3) {
echo "Thử đăng nhập lần $lanThu <br>";
$lanThu++;
}
Kết quả:
Thử đăng nhập lần 1
Thử đăng nhập lần 2
Thử đăng nhập lần 3
| 🔢 | 📌 Tình huống | 🐘 Dùng WHILE |
|---|---|---|
| 1️⃣ | Đếm số | ✅ |
| 2️⃣ | Đọc file | ✅ |
| 3️⃣ | Duyệt kết quả MySQL | ✅ |
| 4️⃣ | Chạy đến khi điều kiện thỏa mãn | ✅ |
| 5️⃣ | Biết trước số lần lặp | ⚠️ Nên dùng FOR |
In các số từ 1 → 20
1
2
3
...
20
In các số chẵn từ 2 → 50
2
4
6
...
50
Tính tổng từ 1 → 1000
In ngược từ 10 → 1
10
9
8
...
1
| 🔢 | 📚 Kiến thức | ✅ Đã học |
|---|---|---|
| 1️⃣ | while | ✅ |
| 2️⃣ | do while | ✅ |
| 3️⃣ | Bộ đếm vòng lặp | ✅ |
| 4️⃣ | Lặp vô hạn | ✅ |
| 5️⃣ | Ứng dụng thực tế | ✅ |
➡️ Bài tiếp theo: Bài 11 — Vòng lặp FOR
Học cách lặp với cú pháp gọn hơn, chuyên dùng khi biết trước số lần lặp.
Cập nhật: 2026-06-21T23:10:19.248+07:00
Sau bài này bạn sẽ:
✅ Hiểu cách hoạt động của switch
✅ Biết sử dụng case
✅ Hiểu vai trò của break
✅ Sử dụng default
✅ Viết code gọn hơn thay cho nhiều if else
Khi cần kiểm tra một biến với nhiều giá trị khác nhau, thay vì viết:
if($day == 2){
echo "Thứ Hai";
}
elseif($day == 3){
echo "Thứ Ba";
}
elseif($day == 4){
echo "Thứ Tư";
}
PHP cung cấp:
switch
để code ngắn gọn và dễ đọc hơn.
switch($bien){
case gia_tri_1:
// code
break;
case gia_tri_2:
// code
break;
default:
// code
}
<?php
$day = 2;
switch($day){
case 2:
echo "Hôm nay là Thứ Hai";
break;
case 3:
echo "Hôm nay là Thứ Ba";
break;
case 4:
echo "Hôm nay là Thứ Tư";
break;
}
📌 Kết quả:
Hôm nay là Thứ Hai
break dùng để thoát khỏi switch.
Ví dụ:
<?php
$day = 2;
switch($day){
case 2:
echo "Thứ Hai";
case 3:
echo "Thứ Ba";
case 4:
echo "Thứ Tư";
}
📌 Kết quả:
Thứ HaiThứ BaThứ Tư
😱 Tại sao?
Vì PHP tiếp tục chạy các case phía dưới.
Do đó thông thường:
break;
là bắt buộc sau mỗi case.
<?php
$day = 2;
switch($day){
case 2:
echo "Thứ Hai";
break;
case 3:
echo "Thứ Ba";
break;
case 4:
echo "Thứ Tư";
break;
}
📌 Kết quả:
Thứ Hai
default tương tự như else.
Nó chạy khi không có case nào khớp.
Ví dụ:
<?php
$day = 8;
switch($day){
case 2:
echo "Thứ Hai";
break;
case 3:
echo "Thứ Ba";
break;
default:
echo "Không xác định";
}
📌 Kết quả:
Không xác định
<?php
$day = 6;
switch($day){
case 2:
echo "Thứ Hai";
break;
case 3:
echo "Thứ Ba";
break;
case 4:
echo "Thứ Tư";
break;
case 5:
echo "Thứ Năm";
break;
case 6:
echo "Thứ Sáu";
break;
case 7:
echo "Thứ Bảy";
break;
case 8:
echo "Chủ Nhật";
break;
default:
echo "Sai dữ liệu";
}
<?php
$level = "hard";
switch($level){
case "easy":
echo "Chế độ dễ";
break;
case "medium":
echo "Chế độ trung bình";
break;
case "hard":
echo "Chế độ khó";
break;
default:
echo "Không hợp lệ";
}
📌 Kết quả:
Chế độ khó
Nhiều giá trị có thể dùng chung một đoạn code.
<?php
$month = 1;
switch($month){
case 12:
case 1:
case 2:
echo "Mùa Đông";
break;
case 3:
case 4:
case 5:
echo "Mùa Xuân";
break;
default:
echo "Mùa khác";
}
📌 Kết quả:
Mùa Đông
✅ Kiểm tra nhiều giá trị cố định
✅ Menu lựa chọn
✅ Trạng thái đơn hàng
✅ Ngày trong tuần
✅ Tháng trong năm
✅ Cấp độ game
case 1:
echo "A";
➡️ Chạy luôn các case bên dưới.
switch($x){
case 1:
echo "A";
break;
}
Nếu $x = 99
➡️ Không hiển thị gì.
$status = "1";
Nên kiểm tra dữ liệu đầu vào trước khi dùng.
Cho:
$month = 5;
Dùng switch hiển thị:
Tháng 5
Cho:
$rank = "gold";
Hiển thị:
Hạng Vàng
Cho:
$score = "A";
Hiển thị:
Xuất sắc
Các mức:
A = Xuất sắc
B = Giỏi
C = Khá
D = Trung bình
Khác = Yếu
🔹 switch giúp thay thế nhiều if else
🔹 case dùng để kiểm tra giá trị
🔹 break giúp thoát khỏi switch
🔹 default hoạt động giống else
🔹 Phù hợp khi so sánh một biến với nhiều giá trị cố định
➡️ Bài tiếp theo chúng ta sẽ học Bài 10 — Vòng lặp WHILE để bắt đầu tự động lặp lại công việc trong PHP.
Cập nhật: 2026-06-21T23:10:44.983+07:00
Sau bài này bạn sẽ:
✅ Biết cách ra quyết định trong chương trình PHP
✅ Sử dụng được if
✅ Sử dụng được if...else
✅ Sử dụng được if...elseif...else
✅ Viết điều kiện ngắn bằng toán tử 3 ngôi
Trong lập trình, chương trình thường phải đưa ra quyết định.
Ví dụ:
Nếu tuổi >= 18 → Được lái xe
Nếu điểm >= 5 → Đậu
Nếu có đăng nhập → Hiển thị trang quản trị
PHP sử dụng câu lệnh if để kiểm tra điều kiện.
if (điều_kiện) {
// code thực thi
}
Ví dụ:
<?php
$age = 20;
if ($age >= 18) {
echo "Bạn đã đủ tuổi.";
}
?>
Kết quả:
Bạn đã đủ tuổi.
PHP kiểm tra:
$age >= 18
Nếu đúng (true):
echo "Bạn đã đủ tuổi.";
được thực hiện.
Nếu sai (false):
Không làm gì cả.
Khi muốn xử lý cả 2 trường hợp:
Đúng
Sai
Ta dùng:
if (...) {
}
else {
}
Ví dụ:
<?php
$age = 15;
if ($age >= 18) {
echo "Được lái xe";
} else {
echo "Chưa đủ tuổi";
}
?>
Kết quả:
Chưa đủ tuổi
Khi có nhiều điều kiện khác nhau:
if (...) {
} elseif (...) {
} else {
}
Ví dụ xếp loại học sinh:
<?php
$score = 8;
if ($score >= 9) {
echo "Xuất sắc";
} elseif ($score >= 7) {
echo "Khá";
} elseif ($score >= 5) {
echo "Trung bình";
} else {
echo "Yếu";
}
?>
Kết quả:
Khá
Điểm = 8
>= 9 ? ❌
>= 7 ? ✅
↓
Khá
Dừng
PHP sẽ dừng ngay khi gặp điều kiện đúng đầu tiên.
Ví dụ:
<?php
$age = 25;
$hasLicense = true;
if ($age >= 18 && $hasLicense) {
echo "Được phép lái xe";
}
?>
Toán tử:
| Ký hiệu | Ý nghĩa |
|---|---|
| && | Và |
| || | Hoặc |
| ! | Phủ định |
Kiểm tra đăng nhập:
<?php
$isLogin = true;
if ($isLogin) {
echo "Chào mừng Admin";
} else {
echo "Vui lòng đăng nhập";
}
?>
Viết gọn cho IF ELSE.
Cú pháp:
điều_kiện ? giá_trị_đúng : giá_trị_sai;
Ví dụ:
<?php
$age = 20;
echo ($age >= 18)
? "Đủ tuổi"
: "Chưa đủ tuổi";
?>
Kết quả:
Đủ tuổi
if ($age >= 18) {
echo "Đủ tuổi";
} else {
echo "Chưa đủ tuổi";
}
echo ($age >= 18)
? "Đủ tuổi"
: "Chưa đủ tuổi";
Sai:
if $age >= 18 {
echo "OK";
}
Đúng:
if ($age >= 18) {
echo "OK";
}
Sai:
if ($age = 18)
Đây là phép gán.
Đúng:
if ($age == 18)
hoặc:
if ($age === 18)
Sai:
if ($score >= 9) {
echo "Giỏi";
}
if ($score >= 7) {
echo "Khá";
}
Điểm 9 sẽ in cả:
Giỏi
Khá
Nên dùng:
if (...) {
} elseif (...) {
}
Trong lập trình web PHP:
✅ Kiểm tra đăng nhập
✅ Kiểm tra quyền Admin
✅ Kiểm tra dữ liệu form
✅ Kiểm tra trạng thái đơn hàng
✅ Kiểm tra tồn kho
Tất cả đều dựa rất nhiều vào:
if
else
elseif
Đây là một trong những câu lệnh quan trọng nhất của PHP.
Khai báo:
$age = 16;
Hiển thị:
Đủ tuổi
hoặc
Chưa đủ tuổi
Khai báo:
$score = 8;
Xếp loại:
Giỏi
Khá
Trung bình
Yếu
Dùng toán tử 3 ngôi để hiển thị:
Đăng nhập thành công
hoặc
Đăng nhập thất bại
switch
case
break
default
Giúp xử lý nhiều lựa chọn gọn gàng hơn if elseif else.
Cập nhật: 2026-06-21T23:11:20.801+07:00
Sau bài này bạn sẽ:
✅ Biết sử dụng các toán tử trong PHP
✅ Thực hiện phép tính với số
✅ So sánh dữ liệu
✅ Kết hợp nhiều điều kiện
✅ Tăng giảm giá trị biến
✅ Nối chuỗi bằng toán tử
Toán tử (Operator) là các ký hiệu dùng để xử lý dữ liệu.
Ví dụ:
$a = 10;
$b = 5;
echo $a + $b;
Kết quả:
15
Dấu + chính là toán tử.
Dùng để thực hiện các phép tính toán học.
| 🔢 Toán tử | 📝 Ý nghĩa | 💡 Ví dụ |
|---|---|---|
| + | Cộng | $a + $b |
| - | Trừ | $a - $b |
| * | Nhân | $a * $b |
| / | Chia | $a / $b |
| % | Chia lấy dư | $a % $b |
| ** | Lũy thừa | $a ** $b |
Ví dụ:
$a = 10;
$b = 3;
echo $a + $b;
echo "<br>";
echo $a - $b;
echo "<br>";
echo $a * $b;
echo "<br>";
echo $a / $b;
echo "<br>";
echo $a % $b;
Kết quả:
13
7
30
3.333333
1
Toán tử gán dùng để gán giá trị cho biến.
$x = 10;
Ngoài ra còn có các dạng rút gọn.
| 🔢 Toán tử | 💡 Tương đương |
|---|---|
| += | $x = $x + 5 |
| -= | $x = $x - 5 |
| *= | $x = $x * 5 |
| /= | $x = $x / 5 |
| %= | $x = $x % 5 |
Ví dụ:
$x = 10;
$x += 5;
echo $x;
Kết quả:
15
Dùng để so sánh hai giá trị.
Kết quả luôn trả về:
true
hoặc
false
| 🔢 Toán tử | 📝 Ý nghĩa |
|---|---|
| == | Bằng |
| === | Bằng cả giá trị và kiểu dữ liệu |
| != | Khác |
| <> | Khác |
| !== | Khác cả giá trị và kiểu dữ liệu |
| > | Lớn hơn |
| < | Nhỏ hơn |
| >= | Lớn hơn hoặc bằng |
| <= | Nhỏ hơn hoặc bằng |
Ví dụ:
$a = 10;
$b = "10";
var_dump($a == $b);
echo "<br>";
var_dump($a === $b);
Kết quả:
bool(true)
bool(false)
📌 == chỉ so sánh giá trị.
📌 === so sánh cả kiểu dữ liệu.
Dùng để kết hợp nhiều điều kiện.
| 🔢 Toán tử | 📝 Ý nghĩa |
|---|---|
| && | AND |
| ! | NOT |
Ví dụ:
$age = 20;
$money = 1000;
var_dump($age >= 18 && $money >= 500);
Kết quả:
bool(true)
Ví dụ OR:
$isAdmin = false;
$isEditor = true;
var_dump($isAdmin || $isEditor);
Kết quả:
bool(true)
Ví dụ NOT:
$isLogin = false;
var_dump(!$isLogin);
Kết quả:
bool(true)
PHP hỗ trợ tăng hoặc giảm giá trị biến rất nhanh.
$x = 10;
$x++;
echo $x;
Kết quả:
11
$x = 10;
$x--;
echo $x;
Kết quả:
9
$x = 10;
echo ++$x;
Kết quả:
11
$x = 10;
echo $x++;
Kết quả:
10
Sau đó:
echo $x;
Kết quả:
11
📌 Đây là lỗi rất nhiều người mới học PHP thường gặp.
PHP dùng dấu chấm . để nối chuỗi.
Ví dụ:
$firstName = "Nguyen";
$lastName = "Van A";
echo $firstName . " " . $lastName;
Kết quả:
Nguyen Van A
$text = "PHP";
$text .= " 8.2";
echo $text;
Kết quả:
PHP 8.2
$name = "Tiến sĩ M";
$age = 43;
$salary = 2000;
echo "Tên: " . $name;
echo "<br>";
echo "Tuổi: " . $age;
echo "<br>";
echo "Lương: " . $salary;
echo "<br>";
var_dump($age >= 18 && $salary > 1000);
Kết quả:
Tên: Tiến sĩ M
Tuổi: 43
Lương: 2000
bool(true)
❌ Dùng = thay cho ==
Sai:
if($age = 18)
Đúng:
if($age == 18)
❌ Quên dấu chấm khi nối chuỗi
Sai:
echo $name " PHP";
Đúng:
echo $name . " PHP";
❌ Nhầm lẫn giữa == và ===
10 == "10"
→ TRUE
10 === "10"
→ FALSE
Tính:
25 + 5
25 - 5
25 * 5
25 / 5
Tạo biến:
$age = 20;
Kiểm tra:
$age >= 18
Nối họ tên:
Nguyen
Van A
Thành:
Nguyen Van A
Viết chương trình kiểm tra:
Tuổi >= 18
Và
Có bằng lái xe
Sử dụng toán tử &&.
Sau bài này bạn đã biết:
✅ Toán tử số học
✅ Toán tử gán
✅ Toán tử so sánh
✅ Toán tử logic
✅ Toán tử tăng giảm
✅ Toán tử nối chuỗi
👉 Bài tiếp theo: Bài 08 — IF ELSE trong PHP
Cập nhật: 2026-06-21T23:11:49.735+07:00