EzCode # Bài 1 — Cài đặt môi trường và file PHP đầu tiên
Bài 1 — Cài đặt môi trường và file PHP đầu tiên
Học xong bài này bạn sẽ:
- Cài được XAMPP và chạy được một file PHP trên
localhost- Viết được lệnh
echovà hiểu hai cách viết<?php echo ?>với<?= ?>- Bật được chế độ hiện lỗi và đọc được thông báo lỗi PHP đầu tiên
Cần học trước: Không cần gì cả. Đây là bài mở đầu.
1. Vấn đề đặt ra
Bạn đã quen với HTML. Bạn tạo file trangchu.html, nhấp đúp vào nó, trình duyệt mở ra và hiện đúng những gì bạn viết. Đơn giản.
Bây giờ hãy thử điều này: tạo một file tên thu.php, viết vào đó dòng sau, rồi nhấp đúp mở nó.
<?php echo "Xin chào"; ?>
Sẽ có một trong hai chuyện xảy ra:
- Trình duyệt hiện ra nguyên văn dòng chữ
<?php echo "Xin chào"; ?>, hoặc - Trình duyệt hỏi bạn muốn tải file về máy hay mở bằng phần mềm nào.
Cả hai đều không phải điều bạn muốn. Vì sao?
Vì HTML và PHP chạy ở hai nơi khác nhau.
HTML chạy ở trình duyệt. Bạn gửi file HTML cho trình duyệt, nó tự đọc và vẽ ra màn hình.
PHP chạy ở máy chủ. Trình duyệt không hiểu PHP và cũng không cần hiểu. Quy trình đúng là:
- Trình duyệt hỏi máy chủ: "cho tôi trang
thu.php". - Máy chủ tìm thấy file, thấy đuôi
.phpnên đưa cho bộ xử lý PHP. - Bộ xử lý PHP chạy từng dòng lệnh trong file, kết quả là một đoạn HTML.
- Máy chủ gửi đoạn HTML đó về cho trình duyệt.
- Trình duyệt nhận được HTML thuần, không hề biết PHP đã từng tồn tại.
Nhấp đúp vào file .php là bạn đã bỏ qua hoàn toàn bước 2 và 3. Không có máy chủ nào chạy PHP cả, nên trình duyệt nhận được nguyên văn mã nguồn.
Vậy việc đầu tiên phải làm là: dựng một máy chủ ngay trên máy tính của bạn.
2. Kiến thức mới
2.1. XAMPP là gì
Để chạy được EzCode, bạn cần ba thứ:
| Thành phần | Vai trò |
|---|---|
| Apache | Máy chủ web. Nó nhận yêu cầu từ trình duyệt và trả trang về |
| PHP | Bộ xử lý chạy code PHP của bạn |
| MariaDB (hoặc MySQL) | Hệ quản trị cơ sở dữ liệu, nơi lưu khóa học và người dùng |
Cài từng cái một rất mất công. XAMPP là một gói cài sẵn cả ba, chỉ cần bấm vài lần chuột. Tên nó viết tắt cho X (mọi hệ điều hành), Apache, MariaDB, PHP, Perl.
2.2. Cài XAMPP
- Vào
https://www.apachefriends.orgvà tải bản cho Windows. - Chọn bản có PHP 8.0 trở lên. Project EzCode dùng cú pháp chỉ có từ PHP 8, cài bản cũ hơn sẽ lỗi ở Bài 9.
- Chạy file cài đặt. Cứ bấm Next, giữ nguyên thư mục mặc định là
C:\xampp. - Cài xong, mở XAMPP Control Panel.
Trong Control Panel, bấm nút Start ở hai dòng:
- Dòng Apache — máy chủ web
- Dòng MySQL — cơ sở dữ liệu
Khi chạy đúng, tên hai dòng đó sẽ chuyển sang nền xanh lá.
Nếu Apache không chịu chạy: thường là có phần mềm khác đang chiếm cổng 80, hay gặp nhất là Skype hoặc IIS của Windows. Bạn có thể tắt phần mềm đó, hoặc bấm nút
Configbên cạnh Apache, chọnhttpd.conf, tìm dòngListen 80đổi thànhListen 8080. Nếu đổi cổng thì mọi địa chỉ trong giáo trình này bạn phải thêm:8080, ví dụhttp://localhost:8080/.
2.3. Thư mục htdocs và địa chỉ localhost
Apache chỉ phục vụ file nằm trong một thư mục duy nhất: C:\xampp\htdocs. Đây gọi là thư mục gốc web (web root).
File nằm ngoài htdocs thì Apache không thấy. Đây là lý do phổ biến nhất khiến người mới bị lỗi "Not Found".
Địa chỉ để truy cập là http://localhost/.
localhostnghĩa là "chính máy tính này". Nó tương đương địa chỉ IP127.0.0.1.http://localhost/trỏ thẳng vàoC:\xampp\htdocs.
Quy tắc đổi từ đường dẫn sang địa chỉ rất đơn giản:
| Đường dẫn trên ổ đĩa | Địa chỉ trên trình duyệt |
|---|---|
C:\xampp\htdocs\thu.php |
http://localhost/thu.php |
C:\xampp\htdocs\EZCode_khoahoc\index.php |
http://localhost/EZCode_khoahoc/index.php |
C:\xampp\htdocs\EZCode_khoahoc\hoc\bai01.php |
http://localhost/EZCode_khoahoc/hoc/bai01.php |
Bạn chỉ cần thay C:\xampp\htdocs bằng http://localhost và đổi dấu \ thành /.
2.4. Đặt project vào đúng chỗ
Chép toàn bộ thư mục project EzCode vào htdocs, sao cho đường dẫn cuối cùng là:
C:\xampp\htdocs\EZCode_khoahoc\
Bên trong phải nhìn thấy index.php, Models, Controllers, Views, public, ezcode.sql.
Vì sao tên thư mục phải đúng là
EZCode_khoahoc? Vì trong fileControllers/PaymentController.phpcó một đường dẫn viết cứng chứa đúng tên này. Đặt tên khác thì chức năng thanh toán ở Bài 21 sẽ hỏng. Đây là một trong 17 lỗi bạn sẽ sửa ở Bài 22 (lỗi số 12), nhưng bây giờ cứ đặt đúng tên cho đỡ rắc rối.
2.5. phpMyAdmin
XAMPP cài kèm một công cụ quản lý cơ sở dữ liệu chạy trên trình duyệt, tên là phpMyAdmin. Địa chỉ của nó là:
http://localhost/phpmyadmin
Bạn chưa dùng đến nó ở bài này. Bài 7 sẽ dùng để nạp dữ liệu cho EzCode. Bây giờ chỉ cần mở thử xem có vào được không — nếu vào được nghĩa là MySQL đang chạy đúng.
2.6. Viết file PHP đầu tiên
Tạo thư mục hoc bên trong project:
C:\xampp\htdocs\EZCode_khoahoc\hoc\
Thư mục này là chỗ bạn tập viết ở sáu bài đầu, tách riêng để không lẫn vào code thật của project.
Tạo file hoc/bai01.php với nội dung:
<?php
echo "Xin chào, đây là dòng PHP đầu tiên của tôi!";
?>
Mở trình duyệt và vào http://localhost/EZCode_khoahoc/hoc/bai01.php. Bạn phải thấy đúng dòng chữ đó.
Có ba điều cần nhớ ở đoạn code trên:
Thứ nhất, thẻ mở <?php và thẻ đóng ?>. Mọi code PHP phải nằm giữa hai thẻ này. Ra ngoài là PHP không đọc, coi như HTML thường.
Thứ hai, lệnh echo. Nó in nội dung ra trang. Đây là lệnh bạn dùng nhiều nhất.
Thứ ba, dấu chấm phẩy ;. Mỗi câu lệnh PHP phải kết thúc bằng dấu chấm phẩy. Quên nó là lỗi cú pháp, và đây là sai lầm phổ biến nhất của người mới học.
2.7. Trộn PHP với HTML
Sức mạnh thật của PHP là trộn được với HTML. Bạn có thể mở và đóng thẻ <?php ?> nhiều lần trong cùng một file:
<h1>Danh sách khóa học</h1>
<p>Hôm nay là ngày <?php echo "29"; ?> tháng <?php echo "8"; ?></p>
Trình duyệt sẽ nhận được HTML thuần:
<h1>Danh sách khóa học</h1>
<p>Hôm nay là ngày 29 tháng 8</p>
2.8. Cú pháp rút gọn <?= ?>
Viết <?php echo ... ; ?> mãi cũng dài. PHP cho phép viết tắt:
<?= "29" ?>
Hai cách sau hoàn toàn tương đương:
| Cách viết đầy đủ | Cách viết rút gọn |
|---|---|
<?php echo $ten; ?> |
<?= $ten ?> |
<?php echo "Xin chào"; ?> |
<?= "Xin chào" ?> |
Chú ý ở cách rút gọn: không có chữ echo, và không cần dấu chấm phẩy trước ?>.
Điều này rất quan trọng với EzCode. Toàn bộ 22 file trong thư mục
Views/của project đều dùng cú pháp rút gọn. Nếu bạn không quen với<?= ?>, bạn sẽ không đọc nổi bất kỳ file View nào. Hãy tập viết nó ngay từ bây giờ.
2.9. Ghi chú trong code
PHP có hai kiểu ghi chú, cả hai đều bị bỏ qua khi chạy:
<?php
// Đây là ghi chú một dòng
/*
Đây là ghi chú
nhiều dòng
*/
echo "Chỉ dòng này được chạy";
?>
Tác giả EzCode viết ghi chú bằng tiếng Việt khắp project. Khi gõ lại code, bạn hãy giữ nguyên các ghi chú đó — chúng là một phần của việc đọc hiểu.
2.10. Bật chế độ hiện lỗi
Đây là phần quan trọng nhất của bài này.
Mặc định, một số cấu hình PHP sẽ giấu lỗi đi và chỉ trả về trang trắng. Với người mới, trang trắng là cơn ác mộng: bạn không biết mình sai ở đâu, sai dòng nào.
Hai dòng lệnh sau bắt PHP hiện mọi lỗi ra màn hình:
error_reporting(E_ALL);
ini_set('display_errors', 1);
error_reporting(E_ALL)— báo cáo mọi loại lỗi.E_ALLlà hằng số nghĩa là "tất cả".ini_set('display_errors', 1)— hiện các lỗi đó ra trang thay vì giấu đi.
Hãy đặt hai dòng này ở đầu mọi file bạn viết trong thư mục hoc/.
Lưu ý về sau này: khi website chạy thật ngoài internet, bạn phải tắt hai dòng này đi. Thông báo lỗi của PHP thường lộ đường dẫn thư mục và cấu trúc code, kẻ xấu rất thích những thông tin đó. Nhưng khi đang học và đang phát triển thì bật là bắt buộc.
2.11. Hai lỗi hay gặp nhất
Lỗi thứ nhất: quên dấu chấm phẩy.
<?php
echo "Xin chào"
echo "Tạm biệt";
?>
Thông báo bạn nhận được sẽ giống như:
Parse error: syntax error, unexpected token "echo", expecting "," or ";" in C:\xampp\htdocs\EZCode_khoahoc\hoc\bai01.php on line 3
Cách đọc thông báo này:
Parse error— lỗi cú pháp. PHP chưa chạy được dòng nào cả vì nó không hiểu file.unexpected token "echo"— nó gặp chữechoở chỗ không nên có.expecting "," or ";"— nó đang mong đợi dấu phẩy hoặc chấm phẩy.on line 3— ở dòng 3.
Mẹo quan trọng: với Parse error, lỗi thật thường nằm ở dòng ngay phía trên dòng được báo. Ở ví dụ trên, báo dòng 3 nhưng chỗ thiếu dấu chấm phẩy là dòng 2. Lý do là PHP đọc hết dòng 2, không thấy dấu kết thúc, nên nó đọc tiếp sang dòng 3 rồi mới phát hiện có gì đó sai.
Lỗi thứ hai: quên đóng dấu nháy.
<?php
echo "Xin chào;
?>
Thông báo:
Parse error: syntax error, unexpected end of file, expecting variable or "{" in ...
unexpected end of file nghĩa là PHP đọc tới hết file mà vẫn còn một dấu nháy đang mở. Hãy rà lại xem có chuỗi nào chưa đóng nháy không.
3. Áp dụng vào EzCode
Bây giờ hãy mở file index.php ở gốc project EzCode và nhìn vào ba dòng đầu tiên sau thẻ <?php.
📁
index.php— đọc trước
// Bật error reporting để debug
error_reporting(E_ALL);
ini_set('display_errors', 1);
Đây chính xác là hai dòng bạn vừa học ở mục 2.10, cộng thêm một dòng ghi chú tiếng Việt của tác giả.
Điều đáng chú ý: index.php là cửa vào duy nhất của toàn bộ website EzCode. Mọi trang bạn mở — trang chủ, danh sách khóa học, trang đăng nhập, dashboard giảng viên — đều đi qua file này trước. Bài 9 sẽ giải thích cơ chế đó.
Vì mọi request đều chạy qua index.php, nên đặt hai dòng bật hiện lỗi ở đây là đủ cho cả website. Tác giả không cần lặp lại chúng trong từng Controller hay từng View.
Bạn chưa cần hiểu ba dòng tiếp theo của file (session_start() và include_once). Bài 5 sẽ dạy session_start(), Bài 6 dạy include_once, Bài 9 dạy phần còn lại.
4. Chạy thử
Làm theo đúng thứ tự sau:
Bước 1. Mở XAMPP Control Panel, bấm Start ở dòng Apache và dòng MySQL. Cả hai phải chuyển nền xanh.
Bước 2. Kiểm tra Apache sống chưa: mở http://localhost/. Bạn phải thấy trang chào mừng của XAMPP.
Bước 3. Kiểm tra MySQL sống chưa: mở http://localhost/phpmyadmin. Bạn phải thấy giao diện quản lý cơ sở dữ liệu.
Bước 4. Xác nhận project nằm đúng chỗ. Mở File Explorer tới C:\xampp\htdocs\EZCode_khoahoc và kiểm tra có file index.php trong đó.
Bước 5. Tạo thư mục hoc bên trong project và tạo file hoc/bai01.php:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
echo "<h1>Xin chào, đây là dòng PHP đầu tiên của tôi!</h1>";
echo "<p>Phiên bản PHP đang chạy: " . phpversion() . "</p>";
?>
Bước 6. Mở http://localhost/EZCode_khoahoc/hoc/bai01.php.
Kết quả đúng: bạn thấy dòng chữ lớn và bên dưới là phiên bản PHP, ví dụ 8.2.12. Nếu số phiên bản nhỏ hơn 8, hãy cài lại XAMPP bản mới hơn trước khi đi tiếp.
Nếu trình duyệt tải file về máy thay vì hiển thị: Apache chưa chạy, hoặc bạn đang mở bằng đường dẫn file:///C:/... chứ không phải http://localhost/.... Hãy nhìn kỹ thanh địa chỉ.
Nếu thấy "Object not found" hoặc lỗi 404: file không nằm trong htdocs, hoặc bạn gõ sai tên thư mục. Nhớ rằng EZCode_khoahoc viết hoa chữ E, C và chữ K thường.
5. Bài tập
Bài tập 1
Tạo file hoc/bai01_bt1.php in ra họ tên và năm sinh của bạn trên hai dòng riêng biệt. Dùng thẻ <br> để xuống dòng.
Bài tập 2
Tạo file hoc/bai01_bt2.php in ra cùng một câu bằng cả hai cách: một lần dùng <?php echo ?> và một lần dùng <?= ?>. Đặt cả hai bên trong một trang HTML hoàn chỉnh có thẻ <h1> và <p>.
Mục đích: bạn phải tự tay gõ cả hai cú pháp để nhớ sự khác nhau, vì từ Bài 10 trở đi giáo trình sẽ dùng cách rút gọn liên tục.
Bài tập 3
Mở lại file hoc/bai01_bt1.php, cố tình xóa một dấu chấm phẩy, rồi tải lại trang.
Chép lại nguyên văn thông báo lỗi bạn nhận được, sau đó trả lời hai câu:
- Thông báo báo lỗi ở dòng số mấy?
- Dấu chấm phẩy bạn vừa xóa nằm ở dòng số mấy? Hai số đó có bằng nhau không, và vì sao?
6. Đáp án
Đáp án bài tập 1
📄 hoc/bai01_bt1.php
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
echo "Họ và tên: Nguyễn Văn A";
echo "<br>";
echo "Năm sinh: 2004";
?>
Bạn cũng có thể viết gọn hơn bằng cách nối chuỗi. Dấu chấm . dùng để nối hai chuỗi lại với nhau — Bài 2 sẽ nói kỹ hơn:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
echo "Họ và tên: Nguyễn Văn A" . "<br>" . "Năm sinh: 2004";
?>
Đáp án bài tập 2
📄 hoc/bai01_bt2.php
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
?>
<!DOCTYPE html>
<html lang="vi">
<head>
<meta charset="UTF-8">
<title>Bài tập 2</title>
</head>
<body>
<h1>Cách viết đầy đủ: <?php echo "Tôi đang học PHP"; ?></h1>
<p>Cách viết rút gọn: <?= "Tôi đang học PHP" ?></p>
</body>
</html>
Hãy để ý ba điểm:
- Khối
<?php ... ?>ở đầu file kết thúc trước khi HTML bắt đầu. Đây là cách bố trí bạn sẽ gặp lại trongViews/layout_teacher_sidebar.phpở Bài 17. - Trong thẻ
<h1>cóechovà có dấu;. - Trong thẻ
<p>không cóechovà không có dấu;.
Nếu bạn mở mã nguồn trang bằng phím Ctrl + U, bạn sẽ thấy trình duyệt chỉ nhận được HTML thuần, không còn dấu vết PHP nào. Đó chính là quy trình 5 bước ở mục 1.
Đáp án bài tập 3
Sau khi xóa dấu chấm phẩy ở cuối dòng echo "Họ và tên: Nguyễn Văn A", thông báo lỗi sẽ có dạng:
Parse error: syntax error, unexpected token "echo", expecting "," or ";" in C:\xampp\htdocs\EZCode_khoahoc\hoc\bai01_bt1.php on line 6
Câu 1: Thông báo báo lỗi ở dòng 6.
Câu 2: Dấu chấm phẩy bị xóa nằm ở dòng 5. Hai số không bằng nhau, lệch đúng một dòng.
Lý do: PHP đọc xong dòng 5 nhưng không thấy dấu chấm phẩy kết thúc, nên nó cho rằng câu lệnh vẫn đang tiếp diễn và đọc tiếp xuống dòng 6. Tới khi gặp chữ echo ở dòng 6, nó mới biết có gì đó sai, và báo lỗi tại vị trí phát hiện chứ không phải vị trí gây lỗi.
Đây là bài học quan trọng nhất của cả Bài 1: khi gặp Parse error, luôn kiểm tra dòng được báo và dòng ngay phía trên nó. Bạn sẽ dùng mẹo này rất nhiều trong 21 bài còn lại.
➡️ Bài tiếp theo: Bài 2 — Cú pháp PHP căn bản
⬅️ Về mục lục
All Rights Reserved