Thông thường khi học MySQL thì bạn sẽ được học những câu truy vấn T-SQL như
select, insert, update, delete. Và mình đoán chắc bạn sẽ có thắc mắc nếu kết hợp với PHP
thì những câu truy vấn này có công dụng gì?
- Chúng ta hãy xem PHP như là một con người bình thường, nghĩa là nó có thể viết ra
các câu truy vấn và thực thi các câu truy vấn đó giống như bạn vậy. Nhưng điểm khác
biệt ở đây là bạn sẽ bắt PHP thực hiện những câu truy vấn chứ không phải tự nó nghĩ ra.
Ví dụ: Mình muốn lấy danh sách tất cả sinh viên trong trường thì sẽ viết câu truy vấn
như sau.
112 trang |
Chia sẻ: nguyenlam99 | Lượt xem: 1258 | Lượt tải: 2
Bạn đang xem trước 20 trang tài liệu Liệu học PHP và MySQL căn bản, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
âu lệnh 2;
}
- Giải thích ý nghĩa:
+ Nếu $bieuthuc đúng thì Những Câu Lệnh 1 sẽ được thực hiện và Những Câu
Lệnh 2 sẽ không được thực hiện.
+ Ngược lại thì nó sẽ không cần kiểm tra nữa và thực hiện Những Câu Lệnh 2.
Ví dụ: kiểm tra năm nay là năm chẵn hay năm lẽ, xuất ra màn hình kết quả chẵn hay
lẽ.
+ Bước 1: Nhập năm
+ Bước 2: Chia cho 2 và lấy số dư
+ Bước 3: Kiểm tra xem số dư có bằng 0 hay không? Nếu bằng không là năm
chẵn, ngược lại là năm lẽ
$nam = 2014;
$so_du = $nam % 2;
if ($so_du == 0){
echo 'Năm ' . $nam . ' Là Năm Chẵn';
}else{
echo 'Năm ' . $nam . ' Là Năm Lẻ';
}
- Giải thích
+ Bước 1: Nhập vào biến $nam giá trị 2014;
+ Bước 2: Lấy số dư khi chia năm 2014 cho 2 và gán vào biến $so_du (lúc này số
dư = 0)
+ Bước 3: Kiểm tra xem $so_du == 0 hay không? vì số dư bằng 0 nên thõa mãn
điều kiện nên nó chạy vào biểu thức trong khối if và xuất ra màn hình “Năm 2014 Là
Năm Chẵn”. Nó sẽ không đoạn code ở trong câu lệnh else.
- Giả sử ta nhập $nam =2013 ta thực hiện tương tự:
+ Bước 1: Nhập vào biến $nam giá trị 2013
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 68
+ Bước 2: Lấy số dư khi chia năm 2014 cho 2 và gán vào biến $so_du (lúc này số
dư = 1)
+ Bước 3: Kiểm tra xem $so_du == 0 hay không? vì số dư bằng 1 khác 0 nên nó
sẽ bỏ qua khối lệnh trong if và chạy vào khối lệnh trong else nên xuất ra màn hình “Năm
2013 Là Năm Lẻ”.
3.1.4 Kết hợp nhiều câu lệnh if else trong php
- Trong thực tế không phải lúc nào cũng chỉ có 2 điều kiện mà sẽ có hàng chục điều
kiện khác nhau, lúc này ta phải kết hợp nhuần nhuyễn giữa 2 lệnh if và else để xử lý.
Ví dụ: Nhập vào một màu và kiểm tra:
+ Nếu là màu xanh thì xuất ra màn hình dòng chữ “Đây Là Màu Xanh”.
+ Nếu là màu đỏ thì xuất ra dòng chữ “Đây là màu đỏ”.
+ Nếu là màu vàng thì xuất ra dòng chữ “Đây là màu vàng”.
+ Các màu còn lại thì xuất ra dòng chữ “Các màu khác”.
- Hướng dẫn:
+ Bước 1: Nhập màu
+ Bước 2: Kiểm tra giá trị của màu xem:
+ Nếu màu bằng ‘màu xanh’ thì xuất ra màn hình “Đây là màu xanh”,
+ Ngược lại nếu bằng ‘màu đỏ’ thì xuất ra màn hình “Đây là màu đỏ”,
+ Ngược lại nếu bằng ‘màu vàng’ thì xuất ra màn hình ‘Đây là màu vàng’,
+Ngược lại không cần kiểm tra gì nữa vì là trương hợp cuối cùng, không phải là
các trưởng hợp ở trên nên ta xuất ra màn hình “Các màu khác”.
- Bài giải:
$mau = 'màu xanh';
if ($mau == 'màu xanh'){
echo 'Đây là màu xanh';
}else if ($mau == 'màu đỏ'){
echo "Đây là màu đỏ";
}else if ($mau == 'màu vàng'){
echo 'Đây là màu vàng';
}else{
echo 'Các màu khác';
}
- Giải thích:
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 69
+ Bước 1: Nhập màu xanh vào biến $mau
+ Bước 2: Đến dòng lệnh kiểm tra phải màu xanh không, vì nó bằng ‘màu xanh’
nên bên trong khối lệnh if của màu xanh sẽ được chạy và xuất ra màn hình dòng chữ
“Đây là màu xanh”, đồng thời nó không chạy các dòng lệnh bên dưới nữa.
- Giả sử ta nhập biến $mau = ‘màu vàng’ thì các bước chạy sẽ như sau:
+ Bước 1: Nhập màu vàng vào biến $mau
+ Bước 2: Đến dòng lệnh kiểm tra có phải màu xanh không? Vì không đúng nên
bỏ qua khối lệnh này
+ Bước 3: Đến dòng lệnh kiểm tra phải màu đỏ không? Vì không đúng nên cũng
bỏ qua khối lệnh màu đỏ này
+ Bước 4: Đến dòng lệnh kiểm tra có phải màu vàng không, Vì đúng nên bên
trong khối màu vàng sẽ được chạy và in ra màn hình chữ “Đây là màu vàng” và đồng
thơi không chạy vào câu lệnh else ở bên dưới vì đã đúng điều kiện
- Giả sử ta nhập biến $mau = ‘màu nâu’ thì như thế nào? Tương tự trình biên dịch sẽ
kiểm tra lần lược các màu xanh, đỏ, vàng đều không đúng, ở cái else cuối cùng là trường
hợp còn lại của các trường hợp trên nên nó không cần kiểm tra và chạy thẳng vào luôn
nên màn hình sẽ in ra dòng chữ “Các màu khác”.
3.1.5 Câu lệnh if else lồng nhau
- Đây là phần khó nhất trong tất cả các vấn đề của câu lệnh if else trong php, ở bên
trên ta chỉ chạy câu lệnh if else một tầng, ở phần này ta sẽ nghiên cứu đến if else nhiều
tầng lồng nhau, có nghĩa là câu if con nằm trong câu if cha.
if ($bieu_thuc_cha)
{
// Các câu lệnh thuộc về biểu thức cha;
if ($bieu_thuc_con){
// Các câu lệnh thuộc về biểu thức con;
}
}
Ví dụ: Kiểm tra sô nhập vào có phải là số chẵn hay không? Nếu là số chẵn thì kiểm tra
tiếp số đó có lớn hơn100 hay không, nếu lớn hơn 100 thì xuất ra màn hình “Số chẵn và
lớn hơn 100″, ngược lại xuất ra màn hình “Số chẵn và nhỏ hơn 100″.
+ Bước 1: Nhập vào một số
+ Bước 2: Kiểm tra có phải số chẵn hay không, nếu là số chẵn thì qua bước 3
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 70
+ Bước 3: Kiểm tra số đó lớn hơn 100 hay không, nếu lớn hơn thì xuất ra màn
hình “Số chẵn và lớn hơn 100″, ngược lại xuất ra màn hình “Số chẵn và nhỏ hơn 100″.
- Bài giải:
$so = 80; // Nhập vào số 80
// Nếu số dư khi chia cho 2 = o, tức là số chẵn ta sẽ chạy tiếp câu lệnh bên trong
if ($so % 2 == 0) {
// Nếu số lớn hơn 100 thì chạy lệnh bên trong
if ($so > 100){
echo 'Số chẵn và lớn hơn 100';
}else if ($so < 100){ // Ngược lại nếu số nhỏ hơn 100 thì chạy lệnh bên trong
echo 'Số chẵn và nhỏ hơn 100';
}
}
- Qua phần ghi chú tôi đã giải thích cho các bạn nó xử lý như thế nào rồi nên có lẽ tôi
không giải thích gì thêm cho phần này vì nó cũng tương tự như những phần trên, chỉ khác
nhiều câu lệnh if lồng nhau. Nếu các bạn vẫn chưa hiểu thì qua phần bài tập có lời giải ở
cuối bài các bạn đọc kỹ và gõ theo rồi xem kết quả là sẽ hình dung được.
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 71
3.2 Lệnh Rẽ Nhánh Switch, Case
- Như ta đã biết, câu lệnh if else dùng để kiểm tra và rẽ nhánh cách mệnh đề của bài
toán. Nhưng không phải nó là duy nhất, trong php có một câu lệnh khác đó là lệnh rẻ
nhanh switch case.
3.2.1 Câu lệnh switch trong PHP
- Câu lệnh switch trong php cho phép ta đưa ra quyết định có nhiều cách lựa chọn để
giá trị của biểu thức truyền vào. Nếu giá trị biểu thức truyền vào trùng với các giá trị biểu
thức điều kiện thì các câu lệnh bên trong biểu thức điều kiện sẽ được thực hiện.
switch ($variable) {
case $value_1:
// chuỗi câu lênh
break;
case $value_2:
// chuỗi câu lệnh
break;
default:
// chuỗi câu lệnh
break;
}
- Trong đó lệnh switch, case và default là các từ khóa trong PHP. Các chuỗi câu lệnh
có thể là lệnh đơn (1 lệnh) hoặc lệnh ghép (kết hợp nhiều lệnh) và không cần đặt trong
cặp dấu ngoặc nhọn {}. Ở mỗi dòng lệnh lựa chọn (case) nó sẽ so sánh xem biến truyền
vào $variable có bằng với biến điều kiện $value_1, $value_2 hay không, nếu trùng với
case nào thì những câu lệnh bên trong case đó sẽ được thực hiện, đồng thời dòng lệnh
break sẽ kết thúc câu lệnh switch. Nếu không có lựa chọn (case) nào đúng thì mặc định
nó sẽ chạy vào chuỗi dòng lệnh trong default, lệnh default trong mệnh đề rẻ nhánh switch
có thể có hoặc không.
- Giá trị ở case chỉ chấp nhận các kiễu dữ liệu string, INT, boolean, null, foat hoặc là
một biểu thức có kết quả trả về một trong năm loại dữ liệu đó và toán tử quan hệ so sánh
trong switch luôn luôn là ==.
Ví dụ: Viết chương nhập vào một số, dùng lệnh rẻ nhánh switch kiểm tra số đó nếu:
+ Bằng 0 thì xuất dòng lênh “Số không”
+ Bằng 1 thì xuất dòng lệnh “Số một”
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 72
+ Bằng 2 thì xuất dòng lệnh “Số hai”
+ Bằng 3 thì xuất dòng lệnh “Số ba”
+ Bằng 4 thì xuất dòng lệnh “Số bốn”
+ Các số còn lại xuất hiện dòng lệnh “Không tìm thấy”
- Bài giải:
$number = 1;
switch ($number){
case 0 :
echo 'Số không';
break;
case 1:
echo 'Số một';
break;
case 2:
echo 'Số hai';
break;
case 3:
echo 'Số ba';
break;
case 4 :
echo 'Số bốn';
break;
default:
echo 'Không tìm thấy';
break;
}
- Giải thích:
+ Bước 1: Biểu thức truyền vào là biến $number có giá trị = 10
+ Bước 2: Ở case thứ nhất điều kiện là $number = 0 thì mới thực hiện, mà
$number = 10 nên không thỏa điều kiện
+ Bước 3: Tương tự cho các lệnh case còn lại đều không thỏa điều kiện.
+ Bước 4: Đến lệnh default, đây là lệnh được thực hiện khi các lênh case trên
không có cái nào thỏa điều kiện nên trên màn hình sẽ xuất hiện chữ “Không tìm thấy”.
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 73
- Giả sử ta nhập biên $number = 2, bài toán trên sẽ được giải thích như sau:
+ Bước 1: Nhập $number = 2
+ Bước 2: Ở case thứ nhất không thỏa điều kiện vì 2 khác 0 nên chương trình sẽ
qua Case tiếp theo.
+ Bước 3: Ở case thứ 2 vẫn không thỏa điều kiện vì 2 khác 1 nên chương trình sẽ
qua Case tiếp theo
+ Bước 4: Ở case thứ 3 này thỏa điều kiện vì 2 bằng 2, lúc này chương trình sẽ
chạy vào các câu lệnh bên trong nên xuất ra màn hình chữ ‘Số hai’, đồng thời dòng Break
dừng luôn cả chương trình rẻ nhánh này vì đã thỏa mãn. Kết thúc chương trình
3.2.2 Switch và if
- Lệnh If và lệnh Switch là 2 dạng lệnh rẻ nhánh trong PHP, tuy nhiên lệnh if vẫn linh
hoạt hơn switch và tốc độ cũng nhanh hơn. Với những bài toán ta thể hiện bằng switch
thì hoàn toàn có thể chuyển thành if, ngược lại những bài toán ta dùng lệnh if để thể hiện
thì chưa chắc đã chuyển qua lệnh switch đươc.
- Với bài toán trên ta thể hiện bằng câu lệnh if như sau:
$number = 10;
if ($number == 0){
echo 'Số không';
}else if ($number == 1){
echo 'Số một';
}else if ($number == 2){
echo 'Số hai';
}else if ($number == 3){
echo 'Số ba';
}else if ($number == 4){
echo 'Số bốn';
}else {
echo 'Không tìm thấy';
}
3.2.3 Switch lồng nhau
- Cũng như lệnh if, lệnh switch cũng có thể lồng nhau.
$number = 12;
$midle = null;
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 74
switch ($number){
case 12 : // nếu $number = 12
$midle = $number % 2; // lấy số dư
switch ($midle) {
case 0 : // nếu số dư = 0
echo 'Số chẵn';
break;
default :
echo 'Số lẽ';
break;
}
break;
default: // nếu không phải 12 thì không làm gì
break;
}
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 75
3.4 Vòng lặp for trong php
3.4.1 Vòng lặp for
- Cú pháp:
for ($bien_dieu_khien;$bieu_thuc_dieu_kien;$bieu_thuc_thay_doi_bien_dieu_khien){
// lệnh
}
- Trong đó:
+ $bien_dieu_khien: là một câu lệnh gán giá trị ban đầu cho biến điều khiển trước
khi thực hiên vòng lặp, hoặc là một biến có giá trị sẵn mà ta đã truyền vào cho nó trước
khi tạo vòng lặp này, lệnh này được thực hiện duy nhất một lần.
+ $bieu_thuc_dieu_kien: là một biểu thức quan hệ xác định điều kiện thoát khỏi
vòng lặp.
+ $bieu_thuc_thay_doi_bien_dieu_khien: Xác định biến điều khiển sẽ bị thay đổi
như thế nào sau mỗi lần lặp được lặp lại (thường là tăng hoặc giảm giá trị của biến điều
khiển).
- Ba biểu thức trên được cách nhau bởi dấu chấm phẩy, vòng lặp sẽ lặp khi biểu thức
điều kiện đúng, khi biểu thức điều kiện sai thì vòng lặp sẽ dừng và thoát, và ta sử dụng
các toán tử quan hệ và toán tử logic trong các biểu thức điều kiện để điều khiển vòng lặp.
- Xét ví dụ dưới đây:
for ($i = 0; $i < 10; $i++){
echo $i . ' - ';
}
$i = 0 là biến điều khiển có giá trị khởi tạo bằng 0
$i < 10 là biểu thức điều kiện dừng vòng lặp, có ý nghĩa nếu $i < 10 thì vòng lặp
vẫn tiếp tục, ngược lại nếu $i >= 10 thì biểu thức sai nên vòng lặp sẽ thoát
$i++ là biểu thức thay đổi biến điều khiển, sau mỗi vòng lặp $i sẽ tăng lên 1
- Bước lặp 1: $i = 0, biểu thức điều kiện sẽ thành (0 true => vòng lặp được
thực hiện và xuất ra màn hình chuỗi “0 -”. Sau khi thực hiện hết các lệnh bên trong vòng
lặp thì biểu thức thay đổi điều kiện được thực hiện nên biến $i sẽ được tăng lên 1 nên lúc
này $i = 1.
- Bước lặp 2: $i = 1, biểu thức điều kiện sẽ thành (1 true => vòng lặp được
thực hiện và xuất ra màn hình chuỗi “1 – “. Kết hợp với chuỗi ở vòng lặp 1 lúc này màn
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 76
hình sẽ xuất hiện chuỗi “0 - 1 -”. Sau khi các lệnh bên trong vòng lặp thực hiện xong biểu
thức thay đổi điều kiện thực hiện nên biến $i sẽ tăng lên 1 nên lúc này $i = 2.
- Tương tự cho các bước lặp 3, 4, 5, 6, 7, 8, 9.
- Bước lặp 10: $i = 10, biểu thức điều kiện sẽ thành (10 false => vòng lặp kết
thúc. Lúc này biến $i sẽ giữ nguyên và không tăng lên nữa nên giữ nguyên giá trị 10.
- Kết thúc: Màn hình xuất ra chuỗi “0 – 1 – 2 – 3 – 4 – 5 – 6 – 7 – 8 – 9 – ”.
- Với ví dụ trên thì ta có thể viết lại như sau và kết quả trả về là giống nhau, chỉ khác
nhau ở chỗ biến $i được gán giá trị ở ngoài vòng lặp.
$i = 0;
for ($i; $i < 10; $i++){
echo $i . ' - ';
}
- Ở ví dụ trên thì biểu thức thay biến điều khiển là tăng dần, ở ví dụ dưới đây biểu thức
điều khiển sẽ giảm dần và kết quả sẽ in ngược lại “9 - 8 - 7 - 6 - 5 - 4 - 3 - 2 - 1 - 0 -”.
for ($i = 9; $i <= 0; $i--){
echo $i . ' - ';
}
- Trong thân vòng lặp ta có thể thêm những biểu thức bằng cách dùng dấu phảy để
ngăn cách chúng.
for ($i = 9, $count = 10; $i <= $count; $i--){
echo $i . ' - ';
}
3.4.2 Vòng lặp for lồng nhau
- Giống như câu điều kiện if, vòng lặp for trong php có thể lồng nhau để xử lý bài
toán. Ở mỗi vòng lặp cha thì vòng lặp con sẽ được thực hiện (vòng lặp con lặp cho đến
hết), điều này tuân thủ theo quy tắc phải thực hiện hết nội dung dòng lệnh bên trong vòng
lặp mới thực hiện vòng kế tiếp.
for ($i = 1; $i < 10; $i++){
for ($j = 9; $j >= $i; $j--){
echo $j;
}
echo '';
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 77
}
/* Bài toán này xuất ra màn hình một tam giác:
987654321
98765432
9876543
987654
98765
9876
987
98
9 */
- Tổng số lần lặp chính là bằng tích số lần lặp của 2 vòng lặp cộng thêm số lần lặp của
vòng lặp cha. Ví dụ vòng lặp 1 lặp 10 lần, vòng lặp 2 lặp 10 lần thì tổng số vòng lặp sẽ là
10 x 10 + 10 = 110 lần. Vì thế chi phí để vòng lặp for lặp lồng nhau rất cao.
3.4.3 Vòng lặp for kết hợp với mảng
- Từ ví dụ trên ta nhận thấy rằng vòng lặp for trong php lặp một cách trình tự tăng
hoặc giảm đều, điều này giống với các chỉ mục trong mảng. Vậy ta nhận xét rằng có thể
dùng vòng lặp để truy xuất từng phần tử của mảng.
Ví dụ: Cho một mảng các sinh viên:
$sinhvien = array(
'Nguyễn A',
'Nguyễn B',
'Nguyễn C',
'Nguyễn D',
'Nguyễn E',
'Nguyễn F'
);
- Hãy xuất các sinh viên trong mảng ra màn hình ?
Cách 1: Dựa vào chỉ mục xuất ra từng phần tử
echo $sinhvien[0];
echo $sinhvien[1];
echo $sinhvien[2];
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 78
echo $sinhvien[3];
echo $sinhvien[4];
echo $sinhvien[5];
Cách 2: Dùng vòng lặp for
for ($i = 0; $i < 6; $i++){
echo $sinhvien[$i];
}
- Nhìn vào bài giải các bạn có biết tại sao chỉ mục lại bắt đầu bằng 0 ? Tại vì trong
mảng phần tử đầu tiên có ví trí số 0, và phần tử cuối cùng có vị trí (n-1). Trong đó n là
tổng số phần tử.
- Với cách giải thứ 2 ta có thể biến đổi một chút là dùng hàm count() để đếm tổng số
phần tử và lặp, như vậy dù trong mảng sinh viên có bao nhiêu phần tử đi nữa thì vẫn
không ảnh hưởng gì đến code. Nếu ta không làm vậy thì giả sử ta xóa danh sách sinh viên
còn xuống 3 sinh viên thì với cách 2 sẽ thông báo lỗi ngay, còn cách dưới đây sẽ không
có lỗi.
- Cách 2 chỉnh sửa lại:
for ($i = 0; $i < count($sinhvien); $i++){
echo $sinhvien[$i];
}
- Xét về độ tối ưu thì cách này vẫn chưa tối ưu vì hàm count ta để ngay trong thân
vòng lặp, như vậy mỗi lần lặp nó phải đếm tổng số phẩn tử của mảng. mảng có 10 phần
tư thì nó đếm 10 lần, 20 phần tử thì nó đếm 2 lần. Trong khi thực tế ta chỉ cần đếm 1 lần.
vì thế cách sau sẽ tối ưu hơn.
$count = count($sinhvien);
for ($i = 0; $i < $count; $i++){
echo $sinhvien[$i];
}
- Đối với mảng 2 chiều chúng ta phải dùng vòng lặp lồng 2 cấp để xử lý, vấn đề này sẽ
được đề cập trong bài xử lý mảng trong php.
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 79
3.5 Vòng Lặp While Và Do While
3.5.1 Cấu trúc vòng lặp while
- Cú pháp:
while ($condition) {
// dòng lệnh
}
- Trong đó $condition là điều kiện để dừng vòng lặp. Nếu $condition có giá trị false thì
vòng lặp kết thúc, ngược lại vòng lặp sẽ tiếp tục lặp. Vòng lặp while sẽ lặp vô hạn nếu
biểu thức điều kiện bạn truyền vào luôn luôn đúng.
Ví dụ: Dùng vòng lặp while trong php liệt kê các số từ 1 tới 10. Để giải bài toán này
ta có thể dùng vòng lặp for trong php để giải một cách dễ dàng.
for ($i = 1; $i <= 10; $i++){
echo $i . ' - ';
}
- Nhưng đề bài bắt buộc dùng vòng lặp while, vì thế các bạn xem bài giải sau:
$i = 1; // Biến dùng để lặp
while ($i <= 10){ // Nếu $i <= 10 thì mới lặp
echo $i . ' - '; // Xuất ra màn hình
$i++; // Tăng biến $i lên 1
}
- Giải thích:
$i = 1 là biến dùng để lặp.
while ($i <= 10) là dòng bắt đầu vòng lặp, trong đó điều kiện lặp là $i <= 10.
echo $i . ‘ - ‘ xuất ra màn hình biến $i và ký tự -.
$i++ Tăng biến $i lên 1 đơn vị, ví dụ hiện tại $i = 1 thì sau khi vòng lặp chạy thì
biến $i = 2, dòng này rất quan trọng vì nếu không có dòng này biến $i sẽ luôn luôn bằng
1 sau mỗi vòng lặp, như thế điều kiện vòng lặp sẽ thành ($i (1
đúng => vòng lặp sẽ bị lặp vô hạn.
+ Lần lặp 1: Biến $i = 1, kiểm tra điều kiện thấy (1 true nên bên trong
vòng lặp sẽ thực hiện và xuất ra màn hình “1 – “, đồng thời dòng $i++ sẽ tăng $i lên 1 =>
$i = 2 và quay trở lại vòng lặp để lặp vòng tiếp theo.
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 80
+ Lần lặp 2: Biến $i = 2, kiểm tra điều kiện thấy (2 true nên bên trong
vòng lặp sẽ thực hiện và xuất ra màn hình “2 - “, đồng thời dòng $i++ sẽ tăng $i lên 1 =>
$i = 3 và quay trở lại vòng lặp để lặp vòng tiếp theo.
+ Tương tự lần lặp 3, 4, 5, 6, 7, 8, 9: Sau vòng lặp thứ 9 biến $i sẽ có giá trị $i =
10.
+ Lần lặp 10: Biến $i = 10, kiểm tra điều kiện thấy (10 true nên bên
trong vòng lặp sẽ thực hiện và xuất ra màn hình “10 – “, đồng thời dòng $i++ sẽ tăng
biến $i lên 1 => $i = 11 và quay trở lại vòng lặp để lặp vòng tiếp theo.
+ Lần lặp 11: Biến $i = 11, kiểm tra điều kiện thấy (11 false. Không
thỏa mãn điều kiện vì thế vòng lặp kết thúc (các dòng lệnh bên trong cũng không thực
hiện nên không xuất hiện màn hình chuỗi “11 – “).
+ Kết thúc: Kết hợp các kết quả lại với nhau thì màn hình sẽ in ra dòng “1 – 2 – 3
– 4 – 5 – 6 – 7 – 8 – 9 – 10 – “.
- Với vòng lặp for thì lặp theo một quy luật tăng, giảm đều thì đối với while không
những lặp theo quy luật mà bạn có thể lặp theo một biểu thức.
Ví dụ:
$i = 0;
$j = 10;
while ($i 5){
$i++;
$j -= 2;
}
- Vòng lặp này sẽ thực hiện 3 lần.
+ Lần 1: $i = 0, $j = 10, kiểm tra điều kiện thấy ( 0 5 ) => true nên
vòng lặp thực hiện tăng $i lên và giảm $j xuống 2. Lúc này $i = 1, $j = 8.
+ Lần 2: $i = 1, $j = 8, kiểm ta điều kiện thấy ( 1 5 ) => true nên
vòng lặp thực hiện tăng $i lên 1 và giảm $j xuống 2. Lúc này $i = 2, $j = 6.
+ Lần 3: $i = 2, $j = 6, kiểm tra điều kiện thấy ( 2 5 ) => true nên
vòng lặp thực hiện tăng $i lên 1 và giảm $j xuốn 2. Lúc này $i = 3, $j = 4.
+ Lần 4: $i = 3, $j = 4, kiểm tra điều kiện thấy (3 5) => false, điều
kiện sai nên vòng lặp kết thúc (vòng 4 không được thực hiện).
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 81
3.5.2 Cấu trúc vòng lặp do while
- Vòng lặp while sẽ kiểm tra điều kiện trước rồi thực hiện câu lệnh bên trong vòng lặp,
còn vòng lặp do while thì ngược lại sẽ thực hiện câu lệnh bên trong vòng lặp trước rồi
mới kiểm tra điều kiện. Nếu điều kiện đúng thì sẽ thực hiện tiếp vòng lặp kế tiếp, nếu
điều kiện sai thì sẽ dừng vòng lặp. Vòng lặp do while trong php luôn luôn thực hiện ít
nhất một lần lặp vì nó thực hiện trước rồi mới kiểm tra điều kiện.
do {
// dòng lệnh
} while ($condition);
* Đừng quên đặt dấu chấm phẩy ; sau mệnh đề while nhé.
Ví dụ:
$i = 1;
do{
echo $i;
$i++;
}while ($i <= 10);
- Chương trình này thực hiện xuất ra màn hình các số từ 1 tới 10. Giải thích tương tự
như while, ở mỗi bước lặp sẽ xuất ra màn hình biến $i, sau đó tăng $i lên 1, và cuối cùng
kiểm tra điều kiện nếu ($i <= 10) đúng thì sẽ lặp vòng tiếp theo, ngược lại sẽ dừng vòng
lặp.
Ví dụ:
$i = 1;
do{
echo $i;
$i++;
}while ($i < 1);
- Vòng lặp này sẽ lặp 1 lần tại vì nó thực hiện do xong rồi mới kiểm tra điều kiện
while. Đây là lý do tại sau tôi nói vòng lặp while luôn thực hiện ít nhất 1 lần.
- Note: Cũng như lưu ý ở vòng lặp while, vòng lặp do while trong php rất dễ bị lặp vô
hạn, vì thế hãy cẩn thận khi sử dụng nó.
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 82
3.5.3 Một bài toán có thể giải ở cả ba vòng lặp không?
- Câu trả lời là có thể có và có thể không. Như với ví dụ ở trên thì với vòng lặp for ta
không thể thực hiện được.
$i = 0;
$j = 10;
while ($i 5){
$i++;
$j -= 2;
}
Ví dụ: In ra màn hình các số từ 100 đến 200;
+ Dùng vòng lặp for:
for ($i = 100; $i <= 200; $i++){
echo $i;
}
+ Dùng vòng lặp while:
$i = 100;
while ($i <= 200){
echo $i;
$i++; // Tăng $i lên 1
}
+ Dòng vòng lặp do while:
$i = 100;
do {
echo $i;
$i++;
} while ($i <= 200);
3.5.4 Khi nào thì sử dụng vòng lặp for, while, do while?
- Vấn đề này tùy vào kinh nghiệm của từng người. nhưng có một điểm chung để ta có
thể xác định được là:
+ Những bài toán lặp theo một trình tự nhất định, các bước lặp cách đều nhau
(1,2,3,4) và phải biết được tổng số lần lặp thì ta dùng vòng lặp for.
+ Ngược lại những bài toán khác thì ta dùng vòng lặp while hoặc do while
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 83
3.5.5 Vòng lặp while, do while lồng nhau
- Cũng như vòng lặp for và mệnh đề if, vòng lặp while và vòng lặp do while có thể
lồng nhau để giải quyết bài toán của chúng ta.
$i = 1;
while ($i < 10){
$j = $i;
while ($j < 10){
echo $j;
$j++;
}
echo '
';
$i++;
}
- Vòng lặp này sẽ xuất ra màn hình một hình tam giác với các con số:
123456789
23456789
3456789
456789
56789
6789
789
89
9
- Tổng số lần lặp chính là bằng tích số lần lặp của 2 vòng lặp cộng thêm số lần lặp của
vòng lặp cha. Ví dụ vòng lặp 1 lặp 10 lần, vòng lặp 2 lặp 10 lần thì tổng số vòng lặp sẽ là
10 x 10 + 10 = 110 lần. Vì thế chi phí để lặp lồng nhau rất cao.
3.5.6 Vòng lặp while, do while trong việc truy xuất mảng
- Tương tự như vòng lặp for, vòng lặp while và do while có thể dùng để truy xuất các
phần tử trong mảng chỉ mục.
// Cho Danh Sách Năm
$nam = array(
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 84
1990,
1991,
1992,
1993,
1994,
1995
);
// Xuất theo cách thông thường
echo $nam[0];
echo $nam[1];
echo $nam[2];
echo $nam[3];
echo $nam[4];
echo $nam[5];
// Dùng while
$i = 0;
while ($i <= 5){
echo $nam[$i];
$i++; // Tăng biến $i
}
// Dùng do .. while
$i = 0;
do {
echo $nam[$i];
$i++;
}while ($i <=5);
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 85
3.6 Break, Continue, Goto, Die, Exit
3.6.1 Câu lệnh break
- Lệnh break thường được dùng để thoát khỏi vòng lặp cho dù vòng lặp vẫn chưa kết
thúc.
Ví dụ:
for ($i = 1; $i <= 100; $i++){
echo $i . ' ';
if ($i == 20)
{
break;
}
}
- Trong ví dụ này thì vòng lặp được lặp từ 1 cho tới 100, nhưng nó không chạy hết 100
lần bởi vì khi nó chạy tới lần thứ 20 (tức là biến $i = 20) thì câu lệnh kiểm tra if đúng nên
lệnh break bên trong câu if được thực hiện và sẽ dừng vòng lặp.
- Không chỉ ở vòng lặp for mà các vòng lặp như while và do while, vòng lặp foreach ta
đều có thể dùng lệnh break để kết thúc.
3.6.2 Câu lệnh continue
- Dịch ra tiếng anh cũng đủ hiểu phần nào câu lệnh này, lệnh continue sẽ bỏ qua những
đoạn code bên dưới nó và nhảy qua vòng lặp kế tiếp (không thoát hẳn vòng lặp như lệnh
break).
Ví dụ:
for ($i = 1; $i <= 10; $i++){
if ($i == 5) {
continue;
}
echo $i . ' ';
}
- Bài này vòng lặp for lặp từ 1 tới 10 và in ra các số đó. nhưng lạ thay là kết quả thiếu
mất số 5 tại vì khi $i = 5 (vòng lặp thứ 5) thì câu lệnh continue đã nhảy chương trình qua
vòng lặp mới nên lệnh echo $i không thực hiện được.
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 86
- Tương tự ta có thể sử dụng lệnh này cho tất cả các vòng lặp for, while, do while và
foreach.
3.6.3 Câu lệnh goto
- Lệnh goto dùng để nhảy đến một dòng code nào đó.
Ví dụ:
$a = 12;
$b = 13;
$c = $a + $b;
echo $a;
goto label_end;
echo $b;
label_end;
- Trong ví dụ này nếu bình thường thì nó sẽ xuất ra màn hình cả $a và $b nhưng bài
này nó chỉ xuất ra màn hình mỗi $a vì dòng goto label_end sẽ nhảy chương trình đến cái
nhãn label_end nên dòng echo $b; không được thực hiện. label_end được gọi là nhãn (có
thể đặt tên bất kỳ).
- Người ta khuyên rằng không nên sử dụng lệnh goto bởi vì nó khó nhìn, lộn xộn khó
bảo trì nâng cấp.
3.6.4 Lệnh die và exit
- Với 2 lệnh break và continue chỉ ảnh hương trong vòng lặp thì lệnh die và exit lại
ảnh hưởng tới cả chương trình, nếu bạn dùng 2 lệnh này thì chương trình sẽ dừng ngay
lập tức và những đoạn code bên dưới die và exit sẽ không được thực hiện.
Ví dụ:
echo '123';
die(); // hoặc exit;
echo '456';
- Trong ví dụ này kết quả xuất ra màn hình là 123, vởi vì dòng code echo ’456′ không
được thực hiện.
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 87
3.7 Hàm PHP. Cách Khai Báo Và Sử Dụng Hàm
3.7.1 Hàm là gì?
- Hàm là một chương trình thực hiện một tác vụ cụ thể, chúng thực chất là những đoạn
chương trình nhỏ giúp giải quyết một vấn đề lớn. Hàm là một phương pháp lập trình
hướng thủ tục trong ngôn ngữ PHP và các ngôn ngữ bậc cao khác, hiểu được nó các bạn
mới có thể tiếp tục học những kiến thức như lập trình đối tượng, vì thế tôi hy vọng các
bạn cố nắm vững nó nhé.
3.7.2 Cách sử dụng hàm trong PHP
- Hàm trong PHP dùng để thực hiện một khối lệnh liên tiếp có điểm đầu và điểm cuối.
Một hàm được xác định thực hiện một công việc cụ thể nào đó, giả sử tôi viết một hàm
kiểm tra số chẵn hay số lẻ thì mục đích của hàm đó là kiểm tra một số là số chẵn hay lẻ.
Điều đặc biệt hàm có thể gọi ở nhiều nơi, nhiều chương trình khác nhau.
- Giả sử bạn cần viết một chương trình cho người dùng đăng nhập vào hệ thống và bạn
sẽ sử dụng nó ở hai ứng dụng backend và frontend. Nhưng sau một thời gian bạn muốn
sửa lại một số thông tin lúc kiểm tra thì bạn sẽ phải vào hai chương trình đó và sửa lại,
điều này thật tệ hại vì chương trình sẽ bị dư thừa, khó quản lý và bảo trì. Nhưng nếu bạn
sử dụng hàm thì chỉ cần sửa trong hàm đó là được.
3.7.3 Cấu trúc của một hàm Trong PHP
- Cú pháp tổng quát khai báo hàm trong PHP là:
function func_name($vars){
// các đoạn code
return $val;
}
- Trong đó:
+ func_name là tên của hàm.
+ $vars là các biến sẽ truyền vào trong hàm.
+ return $val là hàm sẽ trả về giá trị $val. Nếu hàm không có trả về giá trị nào thì
ta không có dòng return này.
Ví dụ:
// Số cần kiểm tra
$number = 12;
// gọi đến hàm kiem_tra_so_chan và truyền biến cần kiểm tra vào
// vì hàm kiem_tra_so_chan trả về true/false nên ta có thể đặt nó trong câu điều
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 88
// kiện if như thế này
if (kiem_tra_so_chan($number)){
echo 'Số chẵn';
}else{
echo 'Số lẽ';
}
// Hàm kiểm tra số chẵn sẽ trả về true nếu $number là số chẵn và ngược lại.
// biến $number gọi là biến truyền vào hàm, đó chính là biến cần kiểm tra
function kiem_tra_so_chan($number){
if ($number % 2 == 0)
return true;
else return false;
}
- Hàm kiem_tra_so_chan có nhiệm vụ kiểm tra một số là số chẵn hay số lẻ, nếu số
chẵn thì trả về true, ngược lại trả về false. Muốn kiểm tra số nào thì ta truyền biến đó vào
và đó chính là biến $number. Trong chương trình chính sẽ gọi đến hàm
kiem_tra_so_chan và kiểm tra hàm này trả về true hoặc false, nếu true thì xuất ra màn
hình "số chẵn", ngược lại xuất ra màn hình 'số lẻ'.
- Hàm kiem_tra_so_chan gọi là hàm có kết quả trả về vì trong thân hàm có return. Nếu
bạn muốn hàm kiem_tra_so_chan không trả về giá trị mà xuất ra màn hình luôn, tức là
trong chương trình chính chỉ cần gọi tới và truyền biến vào là xong. Ta làm như sau:
// Số cần kiểm tra
$number = 12;
// gọi đến hàm kiem_tra_so_chan và truyền biến cần kiểm tra vào
kiem_tra_so_chan($number);
// Hàm này có nhiệm vụ xuất ra màn hinh số chẵn nếu biến truyền vào ($number)
// là Số chẵn, và ngược lại sẽ xuất ra màn hình là Số lẽ
function kiem_tra_so_chan($number){
if ($number % 2 == 0) {
echo 'Số chẵn';
}else{
echo 'Số lẽ';
}
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 89
}
- Đọc đến đây các bạn có thắc mắc là tại sao hàm trong php lại để ở dưới cùng mà các
dòng lệnh ở trên vẫn hiểu, vì theo nguyên tắc trình biên dịch dịch từ trên xuống và từ trái
qua phải. Đó là vì hàm trong php có thể để bất cứ đâu trên 1 file thì các bạn có thể gọi
đến thoải mái trong file đó.
- Truyền nhiều biến vào hàm trong php
- Các biến truyền vào hàm trong php có thể là các kiểu bất kỳ (tham khảo trong bài các
kiểu dữ liệu trong php). Và số biến truyền vào là không giới hạn, như ví dụ trên thì chỉ có
1 biến truyền vào là $number, nhưng thực tế bạn có thể truyền nhiều biến vào bằng cách
mỗi biến cách nhau bởi dấu phẩy.
Ví dụ:
function tinhtong($a, $b){
return $a + $b;
}
- Hàm này sẽ tính tổng của 2 biến truyền vào, các biến cách nhau bởi dấu phẩy. Như
vậy trong chương trình chính mình sẽ làm như sau:
$so1 = 12;
$so2 = 13;
echo tinhtong($so1, $so2);
function tinhtong($a, $b){
return $a + $b;
}
- Tôi cố ý đặt tên là $so1 và $so2 để nó không trùng với tên biến trong hàm tính tổng,
mục đích là để các bạn không hiểu nhầm rằng các biến truyền vào hàm phải cùng tên với
các biến ở chương trình chính.
- Gán giá trị mặc định cho biến truyền vào
- Nếu một hàm trong php bạn khai báo có 2 biến truyền vào mà lúc sử dụng bạn chỉ
truyền có 1 biến vào thì hệ thống sẽ báo lỗi ngay. Trong thực tế bạn muốn có những hàm
không ràng buộc phải bắt buộc truyền đủ biến vào, vì thế nó cũng cấp cho chúng ta một
chức năng là truyền giá trị mặc định cho biến trong các hàm, mời các bạn tham khảo ví
dụ sau:
$so1 = 12;
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 90
$so2 = 13; // chỉ truyền 2 đối số vào
echo tinhtong($so1, $so2);
// $c có một giá trị mặc định
// hàm này tính tổng của 3 số
function tinhtong($a, $b, $c = false){
$tong = $a + b;
if ($c != false){ // nếu $c được truyền vào (vì false là giá trị mặc định)
$tong = $tong + $c; // thì thực hiện cộng thêm $c
}
return $tong;
}
- Bạn thấy hàm tính tổng có 3 đối số truyền vào, trong đó có một đối số $c mình gán =
false, đây chính la giá trị mặc định của đối số truyền vào $c. Hàm tinhtong có nhiệm vụ
tính tổng cả 3 số, nếu $c không truyền vào thì chỉ tính tổng của 2 số thôi.
- Tham số thực và tham số hình thức
- Các biến ta định nghĩa trong hàm gọi là tham số hình thức, còn biến mà ta truyền vào
ở chương trình chính gọi là tham số thực.
// Chuong trinh chinh
$so = 12;
$flag = kiem_tra_so_nguyen_to($so);
// ham kiem tra so nguyen to
function kiem_tra_so_nguyen_to($number){
// code
}
- Tham số $number trong hàm kiem_tra_so_nguyen_to gọi là tham số hình thức, biến
$so trong chương trình chính gọi là tham số thực.
3.7.4 Biến toàn cục và biến cục bộ
- Định nghĩa này không có gì lạ đối với các ngôn ngữ như c, c++, đối với PHP thì cách
dùng nó hơi khác so với các ngôn ngữ này. Biến toàn cục chính là các biến ta khai báo ở
chương trình chính, còn biến cục bộ là biến ta khai báo ở các hàm.
Ví dụ:
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 91
// Biến toàn cục
$bien_toan_cuc = 12;
function kiem_tra(){
// Biến cục bộ
$bien_cuc_bo = 13;
// Lấy biến toàn cục
global $bien_toan_cuc;
// Lấy số dư biến cục bộ chia cho biến toàn cục và
// kiểm trả về true nếu số dư = 0, ngược lại trả về false
if ($bien_cuc_bo % $bien_toan_cuc){
return true;
}
else{
return false;
}
}
- Nhìn các ghi chú các bạn cũng hiểu rồi đúng không nào. Trong php để lấy giá trị biến
toàn cục ta dùng lệnh global $tenbien để lấy. Trong các Framwork thì điều này ít sử dụng
nhưng với các CMS như Wordpress thì rất hay sử dụng lệnh này để gọi biến toàn cục.
3.7.5 Biến tĩnh
- Biến tĩnh là các biến cố định bên trong các hàm, không giống như các biến toàn cục
chúng không được biết đến bên ngoài hàm tức là chỉ biết đến bên trong hàm nhưng giá trị
của chúng sẽ lưu lại sau mỗi lần gọi hàm. Để khai báo là một biến tĩnh ta dùng từ khóa
static $tenbien;.
Ví dụ:
// ham kiem tra
function kiem_tra(){
// bien tinh
static $a = 0;
$a++;
echo $a;
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 92
}
kiem_tra();
kiem_tra();
- Chạy đoạn code này màn hình sẽ xuất hiện giá trị 1 và 2 bởi vì lần gọi hàm thứ nhất
biến $a được tăng lên 1 và xuất ra màn hình 1. Vì $a là biến tĩnh nên nó được lưu lại
trong vùng nhớ. Qua lần gọi hàm thứ 2 biến $a được tăng lên 1 nữa là 2 nên xuất ra màn
hình là 2, và đương nhiên giá trị 2 được lưu lại trong vùng nhớ cho các lần gọi tiếp theo.
3.7.6 Các cách gọi hàm trong PHP
- Chúng ta có hai cách gọi hàm thông dụng.
3.7.6.1 Truyền bằng giá trị
- Mặc định tất cả các đối số truyền vào hàm đều là truyền bằng giá trị. Điều này có
nghĩa là khi các đối số được truyền đến hàm được gọi, giá trị được truyền thông qua các
biến tạm (tham số hình thức). mọi thao tác chỉ thực hiện trên biến tạm này nên nó không
hề tác động đến biến chính của mình. Điều này có nghĩa là nếu truyền bằng giá trị thì
trong hàm nếu ta tác động đến giá trị biến truyền vào thì sau khi thoát khỏi hàm giá trị đó
không thay đổi.
Ví dụ:
// Biến
$a = 1;
// Hàm tăng giá trị tham số truyền vào lên 1
function tang_len_1($a){
return $a + 1;
}
// Xuất giá trị trả về của hàm
echo tang_len_1($a);
// Xuất giá trị của biến
echo $a;
- Kết quả xuất ra màn hình sẽ là 2 và 1. Như thế biến $a vẫn giữ nguyên giá trị bằng 1
sau khi hàm kết thúc. Còn trong hàm thì biến $a có giá trị là 2.
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 93
3.7.6.2 Truyền bằng tham chiếu
- Khi các đối số được truyền bằng giá trị thì giá trị của các đối số của hàm đang gọi
không bị thay đổi. Tuy nhiên đôi khi bạn muốn những giá trị đó thay đổi theo thì lúc này
bạn phải truyền biến vào hàm dạng tham chiếu.
Ví dụ:
// Biến
$a = 1;
// Hàm tăng giá trị tham số truyền vào lên 1
function tang_len_1(&$a){
$a = $a + 1;
return $a;
}
// Xuất giá trị trả về của hàm
echo tang_len_1($a);
// Xuất giá trị của biến
echo $a;
- Kết quả xuất ra màn hình là 2 và 2. như vậy biến $a đã bị thay đổi.
- Sự khác biệt ở đoạn code này so với đoạn code trên là biến $a ở hàm tang_len_1 có
dấu &, đây chính là cú pháp trong PHP báo cho trình biên dịch biết đó là một biến ở dạng
tham chiếu.
3.7.7 Các quy tắc và phạm vi của hàm
- Một hàm có thể gọi tới một hàm, tức là trong phần thân của hàm A có thể gọi đến
hàm B, và trong thân hàm B có thể gọi đến hàm C. Đây chính là hàm gọi hàm.
Ví dụ:
// Danh sách các hàm
function A(){
B();
}
function B(){
C();
}
function C(){
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 94
echo 'C';
}
// Chương trình chính gọi đến hàm A
A(); // Kết quả xuất ra màn hình là 'C'
- Bạn có thấy sự thú vị không. tôi thì thấy hơi bị căng vì phải suy nghĩ từng dòng code
thế này :D. Bạn cứ chạy code theo quy tắc từ trên xuống và từ trái qua phải, febug từng
dòng là sẽ ra được kêt quả. Nếu bạn làm quen thì sau này bạn sẽ quản lý được code của
mình đó.
- Thường thì người ta viết các hàm vào một file php riêng, và chương trình chính vào
một file PHP riêng, và trong chương trình chính muốn sử dụng hàm nào thì gọi hàm đó
vào.
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 95
3.8 Giải Thuật Đệ Quy
- Đệ quy là một vấn đề nan giải đối với những bạn mới học lập trình web vì nó được
sử dụng trong các ứng dụng như đệ quy menu đa cấp, chuyên mục đa cấp nhưng thực sự
người nắm được giải thuật này không nhiều, vì thế trong loạt series php căn bản này ta sẽ
tìm hiểu thêm về giải thuật này nhé.
3.8.1 Giải thuật đệ quy là gì ?
- Đệ quy liên quan đến rất nhiều trong toán học, vì thế ta quay lại toán học một chút,
một tính chất trong toán học được gọi là đệ quy nếu trong đó một lớp các đối tượng có
các tính chất giống nhau và có mối liên hệ với nhau, kết quả của bước 1 là một thành
phần của bước 2, bước 2 là thành phần bước 3, .
Ví dụ: Ba của tôi là ông A, Ba của Ba tôi là ông B, cứ như vậy đệ quy n lần sẽ tìm
được nguồn gốc của tôi (sad hơi căng), và đây có thể gọi là một chương trình đệ quy
nhằm tìm ra nguồn gốc của tôi. Giải thuật đệ quy cũng có thể gọi là phương pháp chia để
trị (chia nhỏ từng phần ra rồi kết hợp lại sẽ dễ dàng hơn).
- Muốn dùng được đệ quy bạn phải biết viết hàm vì mỗi lần đệ quy là hàm gọi lại
chính nó. Một chương trình đệ quy phải có điều kiện dừng, vì nếu không có thì chương
trình sẽ gọi vô hạn (lặp vô hạn). Ví dụ tính tổng từ 1 tới n thì điều kiện dừng là khi tới n
rồi thì không được tính nữa. còn nếu tính từ n trở về 1 thì điều kiện dừng là n = 1.
3.8.2 Đệ quy tuyến tính
- Đây là loại đệ quy mà trong hàm đệ quy chỉ gọi duy nhất 1 lần đến chính nó.
Ví dụ: Cho n = 100, tính tổng các số từ 1 tới 100.
- Bài này nếu dùng vòng lặp thì đơn giản, ta lặp từ 1 đến 100 và mỗi vòng lặp cộng
dồn lại sẽ ra tổng. Bài giải cho vòng lặp như sau:
function tinhtong($n){
$tong = 0;
for ($i = 1; $i <= $n; $i++){
$tong += $i; // mỗi vòng lặp cộng lại với nhau
}
return $tong;
}
- Còn với giải thuật đệ quy thì ý tưởng là ở mỗi lần đệ quy ta sẽ lấy số đó cộng với
hàm chính nó và biến truyền vào là số đó trừ đi 1. Điều kiện dừng là nếu số đó = 1 thì
dừng vòng lặp và trả kết quả về. Phân tích kỹ hơn tức là mỗi bước đệ quy chính là một
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 96
lần lặp, cộng dồn tổng các lần đệ quy chính là cộng dồn tổng các lần lặp nên kết quả nó
sẽ thương đương với bài giải bằng vòng lặp trên.
function tinhtong($n){
if ($n == 1){ return $n; }
return $n + tinhtong($n-1);
}
echo tinhtong(100);
- Trong giải thuật đệ quy này thì trong hàm gọi lại chính nó chỉ 1 lần (tức là chỉ có 1
đoạn code tinhtong($n-1)). Ở mỗi bước đệ quy sẽ lấy giá trị $n truyền vào cộng với giá
trị của tinhtong($n-1), cứ lặp đệ quy như vậy cho tới khi biến $n truyền vào hàm = 1 thì
dừng đệ quy, bài toán được mô phỏng như sau:
+ Biến $n truyền vào = 100; giá trị return = 100 + đệ quy lần 2 với tham số như
sau: tinhtong(100-1). Cứ như vậy mỗi lần đệ quy quy sẽ bằng biến truyền vào + lần đệ
quy tiếp.
+ Luồng cộng như sau: 100 + ( 100-1 = 99 ) + (99 – 1 = 98) + . + (2-1 = 1)
100 + 99 + 98 + . + 1
3.8.3 Đệ quy nhị phân
- Đệ quy nhị phân là loại đệ quy mà thân hạm gọi lại chính nó 2 lần.
Ví dụ: Xuất ra màn hình phần tử thứ 100 của dãy Fibonacci. (Dãy Fibonacci là dãy bắt
đầu từ 1 tới n trong đó phần tử thứ $i trong dãy sẽ bằng tổng 2 phần tử trước nó cộng lại.)
Ví dụ viết dãy từ Fibonacci của 8 phần tử đầu tiên thì ta viết như sau: 1 – 1 – 2 – 3 – 5 –
8 – 13 – 21.
- Trong dãy Fibonacci phần tử thứ 1 và thứ 2 có giá trị bằng 1. Đây cũng chính là điêu
kiện dừng của dãy.
// Hàm tính giá trị của phần tử thứ $n của dãy Fibonacci
function Fibo($n){
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 97
if ($n <= 2){
return 1;
}else {
return (Fibo($n - 2) + Fibo($n - 1));
}
}
// Truyền 100 vào để test
echo Fibo(100);
3.8.4 Đệ quy phi tuyến
- Là loại đệ quy mà trong hàm có dùng vòng lặp để gọi lại chính nó.
Ví dụ: Tính phần tử thứ 8 của dãy được tính theo công thức sau:
- Ý nghĩa của dãy như sau:
+ Nếu n nhập vào mà bé hơn 6 thì trả về chính nó
+ Nếu n nhập vào mà lớn hơn hoặc bằng 6 thì trả về kết quả bằng tổng các số từ 1
tới n-1, với mỗi số lại tính theo quy luật trên. Có nghĩa rằng ví dụ tôi có hàm phep_tinh
và nhập giá trị 6 vào thì dãy được tính như sau: pheptinh(5) + pheptinh(4) + pheptinh(3)
+ pheptinh(2) + pheptinh(1)
Bài giải:
function pheptinh($n){
// Nếu $n < 6 thì trả về chính nó
if ($n < 6){
return $n;
}else{
// Ngược lại tính tổng từ 1 tới $n - 1, và mỗi phần tử lại gọi làm hàm chính nó
$tong = 0;
for ($i = 1; $i < $n; $i++){
$tong += pheptinh($n - $i);
}
return $tong;
}
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 98
}
echo pheptinh(6);
3.8.5 Đệ quy hổ tương
- Nghe cái tên thôi cũng hiểu được phần nào. Đệ quy hổ tương là đệ quy một hàm A
gọi sang một hàm B, Trong hàm B lại gọi sang hàm A. Như vậy là chúng gọi lẫn nhau
nên người ta gọi là hổ tương.
- Cũng như các loại đệ quy trên kia, nếu cả 2 hàm A, B đều không có điều kiện dừng
thì sẽ bị lặp vô hạn, điều này rất nguy hiểm nên các bạn phải chú ý.
Ví dụ: Tính giá trị của dãy sau
- Ta thấy 2 hàm đệ quy có gọi lẫn nhau và mỗi hàm đều có điều kiện dừng. Đến đây hy
vọng tôi không cần giải thích ý nghĩa của 2 hàm này nữa. Dựa vào cấu trúc của 2 hàm
này tôi có bài giải như sau:
// Hàm đệ quy U
function U($n){
if ($n < 5){ // điều kiện dừng
return $n;
}else{
return U($n - 1) + G($n - 2);
}
}// Hàm đệ quy G
function G($n){
if ($n <= 8){ // điều kiện dừng
return $n - 3;
}else{
return U($n - 1) + G($n - 2);
}
}
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 99
// Gọi Hàm
echo G(12);
3.8.6 Khử đệ quy
- Giải thuật đệ quy rất hay nhưng chi phí tính toán cho nó thì rất mà cao, vì thế người
ta hay tìm những giải thuật khác để thay thế cho nó. Tuy nhiên trên thực tế chưa có một
giải thuật nào chắc chắn cho điều này, có nghĩa là không phải bài nào cũng chuyển được.
Và phần này là một quá trình nên tôi không có thời gian và cũng như là không đủ trình độ
để giải hết các bài đệ quy được. Như ví dụ ở phần đệ quy tuyến tính các bạn thấy tôi đã
dùng vòng lặp for để giải cho bài toán tính tổng. đó cũng là một cách dùng vòng lặp để
khử đệ quy.
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 100
Chương 4. Cơ sở dữ liệu – MySQL
4.1 Giới thiệu về MySQL
- Mysql là hệ quản trị dữ liệu miễn phí, được tích hợp sử dụng chung với apache, PHP.
Chính yếu tố phát triển trong cộng đồng mã nguồn mở nên mysql đã qua rất nhiều sự hỗ
trợ của những lập trình viên yêu thích mã nguồn mở. Mysql cũng có cùng một cách truy
xuất và mã lệnh tương tự với ngôn ngữ SQL. Nhưng Mysql không bao quát toàn bộ
những câu truy vấn cao cấp như SQL. Về bản chất Mysql chỉ đáp ứng việc truy xuất đơn
giản trong quá trình vận hành của website nhưng hầu hết có thể giải quyết các bài toán
trong PHP.
4.1.1 Những định nghĩa cơ bản
4.1.1.1 Định nghĩa cơ sở dữ liệu, bảng, cột
- Cơ sở dữ liệu: là tên của cơ sở dữ liệu chúng ta muốn sử dụng
- Bảng: Là 1 bảng giá trị nằm trong cơ sở dữ liệu.
- Cột là 1 giá trị nằm trong bảng. Dùng để lưu trữ các trường dữ liệu.
- Thuộc tính
Ví dụ:
- Như vậy ta có thể hiểu như sau:
+ 1 cơ sở dữ liệu có thể bao gồm nhiều bảng.
+ 1 bảng có thể bao gồm nhiều cột
+ 1 cột có thể có hoặc không có những thuộc tính.
4.1.1.2 Định nghĩa 1 số thuật ngữ:
- NULL : Giá trị cho phép rỗng.
- AUTO_INCREMENT : Cho phép giá trị tăng dần (tự động).
- UNSIGNED : Phải là số nguyên dương
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 101
- PRIMARY KEY : Cho phép nó là khóa chính trong bảng.
4.1.1.3 Loại dữ liệu trong Mysql:
- Ở đây chúng tả chỉ giới thiệu 1 số loại thông dụng: 1 số dữ liệu khác có thể tham
khảo trên trang chủ của mysql.
4.1.2 Những cú pháp cơ bản
4.1.2.1 Cú pháp tạo 1 cơ sở dữ liệu
CREATE DATABASE tên_cơ_sở_dữ_liệu;
4.1.2.2 Cú pháp tạo 1 bảng trong cơ sở dữ liệu
CREATE TABLE user ( ,,..)
Ví dụ:
create table user(user_id INT(15) UNSIGNED NOT NULL AUTO_INCREMENT,
username VARCHAR(255) NOT NULL, password CHAR(50) NOT NULL, email
VARCHAR(200) NOT NULL, PRIMARY KEY (user_id));
4.1.2.3 Hiển thị có bao nhiều bảng
show tables;
4.1.2.4 Hiển thị có bao nhiêu cột trong bảng
show columns from table;
4.1.2.5 Thêm 1 cột vào bảng
ALTER TABLE tên_bảng ADD AFTER
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 102
Ví dụ:
alter table user add sex varchar(200) NOT NULL after email;
4.1.2.6 Thêm giá trị vào bảng:
INSERT INTO Tên_bảng(tên_cột) VALUES(Giá_trị_tương_ứng);
Hoặc
INSERT INTO Tên_bảng SET tên_cột_1 = giá_trị_1, , tên_cột_n = giá_trị_n;
Ví dụ:
insert into user(username,password,email,sex,home)
values("Lanna","12345","lanna@yahoo.com","F","www.abc.com");
4.1.2.7 Truy xuất dữ liệu:
SELECT tên_cột FROM Tên_bảng;
Ví dụ:
select user_id,username from user;
4.1.2.8 Truy xuất dữ liệu với điều kiện:
SELECT tên_cột FROM Tên_bảng WHERE điều kiện;
Ví dụ:
select user_id,username from user where user_id=2;
4.1.2.9 Truy cập dữ liệu và sắp xếp theo trình tự
SELECT tên_cột FROM Tên_bảng WHERE điều kiện (có thể có where hoặc không)
ORDER BY Theo quy ước sắp xếp.
- Trong đó quy ước sắp xếp bao gồm hai thông số là ASC (từ trên xuống dưới), DESC
(từ dưới lên trên).
Ví dụ:
select user_id,username from user order by username ASC ;
4.1.2.10 Truy cập dữ liệu có giới hạn :
SELECT tên_cột FROM Tên_bảng WHERE điều kiện (có thể có where hoặc không)
LIMIT vị trí bắt đầu, số record muốn lấy ra
Ví dụ:
select user_id,username from user order by username ASC limit 0,10 ;
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 103
4.1.2.11 Cập nhật dữ liệu trong bảng:
Update tên_bảng set tên_cột=Giá trị mới WHERE (điều kiện).
- Nếu không có ràng buộc điều kiện, chúng sẽ cập nhật toàn bộ giá trị mới của các
record trong bảng.
Ví dụ:
update user set email="admin@qhonline.info" where user_id=1 ;
4.1.2.12 Xóa dữ liệu trong bảng:
DELETE FROM tên_bảng WHERE (điều kiện).
- Nếu không có ràng buộc điều kiện, chúng sẽ xó toàn bộ giá trị của các record trong
bảng.
Ví dụ
delete from user where user_id=1 ;
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 104
4.2 Mối liên hệ giữa PHP và MySQL
- Thông thường khi học MySQL thì bạn sẽ được học những câu truy vấn T-SQL như
select, insert, update, delete. Và mình đoán chắc bạn sẽ có thắc mắc nếu kết hợp với PHP
thì những câu truy vấn này có công dụng gì?
- Chúng ta hãy xem PHP như là một con người bình thường, nghĩa là nó có thể viết ra
các câu truy vấn và thực thi các câu truy vấn đó giống như bạn vậy. Nhưng điểm khác
biệt ở đây là bạn sẽ bắt PHP thực hiện những câu truy vấn chứ không phải tự nó nghĩ ra.
Ví dụ: Mình muốn lấy danh sách tất cả sinh viên trong trường thì sẽ viết câu truy vấn
như sau.
SELECT * FROM SinhVien;
- Kết quả ta thực thi câu truy vấn này trong PHP MYADMIN là danh sách các sinh
viên. Vậy câu hỏi đặt ra là nếu trong PHP thì phải làm thế nào?
- Như ta biết MySQL là một hệ quản trị CSDL nên nó có tính an toàn về bảo mật,
nghĩa là nó có chức năng quản lý User, phân quyền User. Vì vậy trước khi vào PHP
MYADMIN là bạn phải đăng nhập đấy.
- Như vậy với PHP thì cũng phải có bước đăng nhập, sau đó sẽ là bước định nghĩa câu
truy vấn và cuối cùng là thực thi và lấy kết quả.
// Kết nối
$connect = @mysql_pconnect('localhost', 'user', 'password') or die ('Can\'t connect to
database');
@mysql_select_db('database', $connect) or die('Can\'t select database');
// Tạo câu truy vấn và thực thi
$result = mysql_query('SELECT * FROM SinhVien');
// Xử lý kết quả trả về
while ($row = mysql_fetch_assoc($result)){
var_dump($row);
}
// Ngắt kết nối
mysql_close($conn);
- Tóm lại PHP sẽ có nhiệm vụ kết nối MySQL và yêu cầu MySQL thực thi các câu
truy vấn và trả kết quả về cho PHP để từ đó PHP lấy kết quả để xử lý.
Khóa lập trình PHP Onlile
HD: Trịnh Thanh Tâm Email: contact.tamsoft@gmail.com Page 105
4.3 Các hàm cơ bản sử dụng MySQL trong PHP
4.3.1 Kết nối cơ sở dữ liệu:
mysql_connect("hostname","user","pass")
4.3.2 Lựa chọn cơ sở dữ liệu:
mysql_select_db("tên_CSDL")
Ví dụ:
$conn=mysql_connect("localhost","root","root") or die(" khong the ket noi");
mysql_select_db("demo");
4.3.3 Thực thi câu lệnh truy vấn:
mysql_query("Câu truy vấn ở đây");
4.3.4 Đếm số dòng dữ liệu trong bảng:
mysql_num_rows();
4.3.5 Lấy dữ liệu từ bảng đưa vào mảng:
mysql_fetch_array();
4.3.6 Lấy dữ liệu từ bảng đưa vào biến:
mysql_fetch_assoc();
4.3.7 Đóng kết nối cơ sở dữ liệu:
mysql_close();
Các file đính kèm theo tài liệu này:
- tai_lieu_lap_trinh_php_va_mysql_a_z_657.pdf