Liệu học PHP và MySQL căn bản

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.

pdf112 trang | Chia sẻ: nguyenlam99 | Lượt xem: 1144 | Lượt tải: 2download
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:

  • pdftai_lieu_lap_trinh_php_va_mysql_a_z_657.pdf
Tài liệu liên quan