Lập trình Web với PHP - Phần 1

vào lúc 20:15
PHP (PHP:Hypertext Preprocessor) là một ngôn ngữ lập trình kịch bản hay một loại mã lệnh chủ yếu được dùng để phát triển các ứng dụng viết cho máy chủ, mã nguồn mở, dùng cho mục đích tổng quát. Nó rất thích hợp với web và có thể dễ dàng nhúng vào trang HTML. PHP là một ngôn ngữ lập trình kiểu Script, chạy trên Server và trả về mã HTML cho trình duyệt. Do được tối ưu hóa cho các ứng dụng web, tốc độ nhanh, nhỏ gọn, cú pháp giống C và Java, dễ học và thời gian xây dựng sản phẩm tương đối ngắn hơn so với các ngôn ngữ khác nên PHP đã nhanh chóng trở thành một ngôn ngữ lập trình web phổ biến nhất thế giới.

I. Một số cú pháp lập trình PHP cơ bản

a)      Cú pháp khi sử dụng PHP.
Để viết code PHP trước tiên bạn cần xác định nơi viết mã PHP.
§  <?php PHP CODE ?>
§  <? PHP CODE ?>
§  <% PHP CODE %> // ASP Style, không nên dùng
§  <script language="php"> PHP CODE </script> // Nên dùng khi viết trang web bằng Frontpage
b)     Hướng dẫn sử dụng echo() và print() trong PHP.
Để in ra một dòng văn bản hay giá trị của một biến... chúng ta dùng đến echo hoặc print.
<?php
echo "Dòng 1 với echo và một dấu xuống dòng <br/>";
print "Dòng 2 với print";
?>
Ở ví dụ trên, ký tự xuống dòng chính là thẻ <br/>. Mặc dù thẻ này đặt trong dấu nháy nhưng php vẫn hiểu và dịch nó thành ký tự xuống dòng.
Để in ra một chuỗi ký tự thì chuỗi ký tự đó phải nằm trong dấu nháy kép (" ").
c)      Chú thích.
Mỗi ngôn ngữ lập trình đều có những cách chú thích khác nhau. Chú thích giúp người lập trình dễ dàng hiểu được code khi đọc.
Có 3 cách chú thích trong PHP:
§  // (Kiểu của C++): chuỗi nằm phía sau // đến cuối dòng sẽ đựơc chú thích.
§  /* */ (Kiểu của C): chuỗi nằm giữa dấu /* và */ sẽ được chú thích.
§  # (Kiểu của Perl): chuỗi nằm phía sau đến cuối dòng sẽ được chú thích.
d)     Kiểu dữ liệu.
PHP hỗ trợ 8 kiểu dữ liệu chính:
§  4 kiểu dữ liệu vô hướng: boolean, integer, float (double), string.
§  2 kiểu dữ liệu tổ hợp: array, object.
§  2 kiểu dữ liệu đặt biệc: resource, NULL.
Kiểu Boolean
Kiểu boolean mang 1 trong 2 giá trị TRUE (đúng) hoặc FALSE (sai).
Ví dụ:
<?php
$a = TRUE;$b = FALSE;
//phép toán == kiểm tra xem 2 biểu thức có giá trị bằng nhau hay không
$c = (1==2); //vì 1 khác 2 nên $c mang giá trị FALSE
$d = ("abc" == "def"); //$d mang giá trị TRUE
                   ?>
"Ép" kiểu sang boolean: một số giá trị được chuyển đổi thành FALSE trong các biểu thức boolean nếu như giá trị đó là:
§  số nguyên 0,số thực 0.0,
§  chuỗi rỗng "", hoặc chuỗi "0",
§  mảng rỗng (không chứa phần tử nào) Array(),
§  đối tượng không chứa phần tử nào (chỉ đúng với PHP4),
§  giá trị NULL
Các giá trị còn lại sẽ được chuyển đổi thành TRUE. Kiểu Integer. Kiểu integer mang các giá trị số nguyên ..., -2, -1, 0, 1, 2, ...Trên hầu hết các hệ thống, kiểu số nguyên có kích thước 32 bit, mang giá trị từ -2147483647 cho đến 2147483648.
Ví dụ:
<?php
$a = 1234;$b = -123;
$c = 0123; //giá trị 123 ở hệ cơ số 8, tương đương với 83 ở hệ cơ số 10
$d = 0x1F; //giá trị 1F ở hệ cơ số 16, tương đương với 31 ở hệ cơ số 10  
 ?>
Kiểu Float (Double)
Kiểu float (hoặc double) là kiểu số thực, có thể mang bất cứ giá trị số thực nào. Trên hầu hết các hệ thống, kiểu số thực có kích thước 64 bit.
Ví dụ:
<?php
$a = 1.234;$b = 1.2e3; $c = 7E-10; $d = -1.23;    ?>
Kiểu String
Kiểu string lưu giữ 1 chuỗi ký tự, mỗi ký tự có kích thước 1 byte. Nội dung string được đặt giữa 2 dấu nháy, nháy đơn (') hoặc nháy kép (").
Ví dụ:
<?php
$a = 'Đây là 1 chuỗi được đặt giữa dấu nháy đơn';
$b = "Đây là 1 chuỗi được đặt giữa dấu nháy kép";
$c = 'Đây là 1 chuỗi được đặt giữa dấu nháy đơn với "vài dấu nháy kép ở giữa"';
$d = "Đây là 1 chuỗi được đặt giữa dấu nháy kép với 'vài dấu nháy đơn ở giữa'";    ?>
Nếu bạn muốn sử dụng dấu nháy đơn ở trong 1 chuỗi được bọc bởi dấu nháy đơn, hoặc sử dụng dấu nháy kép đặt giữa chuỗi được bọc bởi dấu nháy kép thì bạn để thêm ký tự \ (gọi là ký tự escape) ở phía trước.
Ví dụ:
<?php
$a = 'Dấu \'nháy đơn\' ở giữa chuỗi'; //$a mang giá trị: Dấu 'nháy đơn' ở giữa chuỗi
$b = "Dấu \"nháy kép\" ở giữa chuỗi"; //$b mang giá trị: Dấu "nháy kép" ở giữa chuỗi
$c = "Dùng ký tự \\ ở giữa câu \\ thì sao?"; //$c mang giá trị: Dùng ký tự \ ở giữa câu \ thì sao?  
 ?>
Khi sử dụng dấu nháy đôi để bọc chuỗi, ngoài \', \" và \\, PHP có thể nhận dạng thêm một số chuỗi ký tự escape đặt biệc nữa:
§  \n: ký tự xuống hàng LF (ký tự có mã 10 trong bảng mã ASCII)
§  \r: ký tự về đầu dòng CR (ký tự có mã 13 trong bảng mã ASCII)
§  \t: ký tự tab (ký tự có mã 9 trong bảng mã ASCII)
§  \$: ký tự $
§  \ooo: (với o là 1 chữ số từ 0 đến 7) biểu thị 1 ký tự có mã ASCII ooo trong hệ cơ số 8.
§  \xhh: (với h là 1 chữ số từ 0 đến 9 hoặc 1 chữ cái từ A tời F) biểu thị 1 ký tự có mã ASCII hh trong hệ cơ số 16.
Ngoài ra, nếu bạn để 1 biến vào giữa 1 chuỗi được bọc với dấu nháy kép, giá trị của biến sẽ được thay thế vào trong chuỗi.
Ví dụ:

<?php
$a = 1;$b = 2;$c = 3;
$d = "$a $b $c"; //$d sẽ mang giá trị là chuỗi "1 2 3" 
 ?>

Kiểu Array
Array là một mảng gòm nhiều phần tử. Array được tạo qua lệnh Array.
Ví dụ:
<?php
$a = Array(1,2,3);
Lúc này $a sẽ là 1 mảng gồm 3 phần tử số nguyên là 1, 2 và 3
Các phần tử trong mảng $a được tạo ở trên sẽ được đánh số thứ tự từ 0, 1 cho đến 2. Để truy cập tới từng phần tử của $a
echo $a[0]; //in ra giá trị 1
echo $a[2]; //in ra giá trị 3
$a[1] = 5; //giờ đây $a = Array(1,5,3)  
 ?>
Mảng còn có thể được tạo thành bởi các cặp (khoá, giá trị).
Ví dụ:

 <?php
$a = Array("khoá 1" => "giá trị 1","khoá 2" => "giá trị 2","khoá 3" => "giá trị 3");
echo $a["khoá 1"]; //in ra: giá trị 1
$b = Array("a" => "Nguyễn","b" => "Bá","c" => "Thành");
echo $b["a"]; //in ra: Nguyễn
//giờ đây $b = Array("a" => "Nguyen", "b" => "Ba", "c" => "Thanh")  
 ?>

Kiểu Object
Kiểu object (đối tượng) lưu giữ 1 bản thể (instance) của 1 lớp (class). Ta sẽ tìm kiểu kỹ thêm về kiểu object trong phần Lập trình hướng đối tượng với PHP.
Kiểu Resource
Kiểu resource (tài nguyên) được sử dụng bởi các hàm đặt biệc của PHP (ví dụ hàm mysql_connect sẽ trả về kiểu resource). Ta sẽ tìm hiểu kỹ hơn về kiểu resource trong các bài viết khác.
Kiểu NULL
Đây là 1 giá trị đặt biệc, báo cho PHP biết rằng 1 biến nào đó chưa/không mang giá trị nào cả.
Ví dụ:
<?php
$a = 1; //$a mang giá trị 1
$a = NULL; //bây giờ $a không mang giá trị nào cả
$a = 2; //giờ đây $a mang giá trị 2
//hàm unset sẽ làm cho 1 biến có giá trị là NULL
unset($a); //giữa $a lại là NULL  
 ?>
e)      Biến
Có lẽ hơi muộn khi tới tận bây giờ ta mới tìm hiểu tới biến trong PHP. Một biến trong PHP được bắt đầu bằng ký tự $ và đi theo ngay sau đó là tên của biến.
Ví dụ:
$a: biến có tên là a
$abc123: biến có tên là abc123
§ Biến trong PHP phân biệt chữ hoa và chữ thường. Tức $Abc và $abc là 2 biến hoàn toàn khác nhau.
§ Tên biến chỉ được bao gồm các ký tự chữ cái (a..z hoặc A...Z), chữ số (0...9) và ký tự gạch dưới (_); nhưng tên biến không được bắt đầu bằng ký tự gạch dưới hoặc chữ số. Các tên biến sau là không hợp lệ!
$_abc Không hợp lệ! bắt đầu bằng ký tự gạch dưới
$1abc Không hợp lệ! bắt đầu bằng chữ số
$nguyễn Không hợp lệ! tên biến có ký tự đặt biệc (ễ)
Tầm vực (scope) của biến là ngữ cảnh mà ở trong đó biến được định nghĩa.
Ví dụ:
<?php
$a = 1; //tầm vực của biến $a bắt đầu từ đây
include 'b.php'; trải dài tới bên trong file b.php  //tới cuối file vẫn còn hợp lệ   
?>
Tuy nhiên khi gặp 1 hàm do người dùng định nghĩa, bên trong hàm, biến cục bộ sẽ được dung thay vì biến toàn cục.
Ví dụ:
<?php
$a = 1; //biến toàn cục
//hàm do tự tạo
function test() {echo $a;} //end test
 ?>
Ở ví dụ trên, câu lệnh echo $a sẽ không in ra giá trị nào hết vì câu lệnh này nằm bên trong hàm test nên $a ở đây được hiểu là biến cục bộ $a của hàm (mà hàm này ta chưa khai báo biến cục bộ nào cả). Để truy cập tới các biến toàn cục ở bên trong 1 hàm do người dùng định nghĩa, ta có thể dùng 1 trong 2 cách sau:
Cách 1:
<?php
$a = 1; //biến toàn cục
//hàm do tự tạo
function test() {
//từ khoá global báo cho php biết là bên trong hàm test
//bây giờ ta sẽ dùng biến toàn cục $a
global $a;
echo $a; //in ra giá trị: 1
//end tes
t?>
Cách 2:
<?php
$a = 1; //biến toàn cục
//hàm do tự tạo
function test() {
echo $GLOBALS['a']; //in ra giá trị: 1
//end test
?>
f)       Biểu thức
Biểu thức là nền tảng quan trọng của PHP. Hầu như mọi thứ bạn ghi trong file php đều là biểu thức. Nói một cách đơn giản, bất cứ cái gì mang 1 giá trị nào đó đều có thể là 1 biểu thức. Ta xét câu lệnh đơn giản sau:
$a = 5;//Ở đây 5 là một biểu thức, kết quả của biểu thức này là giá trị 5, và kết quả này được gán cho biến $a.
$b = $a;//Ở đây $a lại là 1 biểu thức, giá trị của $a được gán cho biến $b.
Biểu thức trong PHP có thể phức tạp hơn thế.
Ví dụ:
$a = 1;$b = 2;$c = 3;
$d = $a + $b + $c;
g)      Toán tử
Toán tử kết hợp các giá trị hoặc biểu thức lại với nhau và tạo ra một giá trị mới. Ví dụ trong biểu thức 1+2 thì + là toán tử kết hợp hai giá trị 1 và 2 lại với nhau tạo ra giá trị mới là 3.
Các toán tử trong PHP được chia thành 3 nhóm:
§ Các toán tử áp dụng trên 1 giá trị, ví dụ như toán tử ++ hoặc --
§ Các toán tử kết hợp 2 hoặc nhiều giá trị, ví dụ như toán tử +, -, *, /
§ Toán tử ?: dùng để chọn 1 trong 2 giá trị tuỳ thuộc vào 1 điều kiện cho trước
Thứ tự ưu tiên của toán tử
Các toán tử khác nhau có thể có độ ưu tiên khác nhau. Trong cùng 1 biểu thức có nhiều toán tử, toán tử nào có độ ưu tiên cao hơn sẽ được thực hiện trước (trừ khi bạn nhóm các biểu thức lại bằng dấu ngoặc ( và ) ). Nếu trong biểu thức có 2 toán tử có cùng độ ưu tiên thì qui tắc liên kết của từng toán tử sẽ qui định thứ tự thực hiện của các toán tử đó.
Sau đây là bảng liệt kê các toán tử cùng thứ tự ưu tiên của chúng (toán tử có độ ưu tiên cao hơn được liệt kê bên trên, các toán tử có độ ưu tiên thấp hơn được lệt kê bên dưới).
Qui tắc liên kết Toán tử Ghi chú new Tạo 1 đối tượng từ 1 class, toán tử này chỉ áp dụng trên 1 toán hạng nên không có qui tắc liên kết Bên phải trước [ Toán tử truy cập 1 phần tử trong mảng ++ -- Tăng/Giảm 1 đơn vị, toán tử này chỉ áp dụng trên 1 toán hạng nên không có qui tắc liên kết ! ~ - (int) (float) (string) (array) (object) @ Các toán tử này chỉ áp dụng trên 1 toán hạng nên không có qui tắc liên kết Bên trái trước * / % Bên trái trước + - . Bên trái trước << >> == != === !=== Toán tử so sánh, chỉ áp dụng trên 2 toán hạng nên không có qui tắc liên kết Bên trái trước & Bên trái trước ^ Bên trái trước | Bên trái trước && Bên trái trước || Bên trái trước ? : Bên phải trước = += -= *= /= .= %= &= |= ^= <<= >>= Bên trái trước and Bên trái trước xor Bên trái trước or Bên trái trước ,
h)     Các câu lệnh điều khiển
Câu lệnh if
Cú pháp đơn giản nhất của câu lệnh if có dạng như sau:if ( biểu thức ) câu lệnh;
Câu lệnh if trên được diễn giải như sau: nếu biểu thức trả về giá trị TRUE (hoặc tương đương với TRUE sau khi chuyển đổi) thì câu lệnh sẽ được thực thi; ngược lại (khi biểu thức trả về giá trị FALSE) thì bỏ qua không thực thi câu lệnh nữa.
Cú pháp nâng cao của câu lệnh if có dạng như sau:
if ( biểu thức )  câu lệnh 1;
else  câu lệnh 2;
Câu lệnh if trên được diễn giải như sau: nếu biểu thức trả về giá trị TRUE thì câu lệnh 1 sẽ được thi hành, ngược lại thì câu lệnh 2 sẽ được thi hành. Các lệnh if có thể được lồng vào nhau để tạo ra câu lệnh if phức tạp hơn:
if ( biểu thức 1 )
if ( biểu thức 2 )  câu lệnh 1;
else  câu lệnh 2;
else  câu lệnh 3;
Nếu biểu thức 1 trả về giá trị FALSE thì câu lệnh 3 sẽ được thực hiện, ngược lại xét tiếp biểu thức 2: nếu biểu thức 2 trả về giá trị TRUE thì thực hiện câu lệnh 1, ngược lại nếu biểu thức 2 trả về giá trị FALSE thì thực hiện câu lệnh 2.
Ngoài ra PHP còn cung cấp từ khoá elseif, chính là ghép giữa từ khoá else và if.
Câu lệnh while
Câu lệnh while dùng để tạo 1 vòng lặp, cú pháp của câu lệnh này như sau:  while ( biểu thức )câu lệnh;
Được diễn giải như sau: trong khi biểu thức còn trả về giá trị TRUE thì tiếp tục thực hiện câu lệnh, sau khi thực hiện câu lệnh thì kiểm tra lại biểu thức, nếu vẫn còn trả về giá trị TRUE thì lại tiếp tục thực hiện câu lệnh...cứ tiếp tục như vậy cho tới khi nào biểu thức trả về giá trị FALSE thì ngưng. Một ví dụ in ra các số từ 1 tới 10 với câu lệnh while:
<?php
$i = 1;
while ( $i <= 10 )
{echo $i, "\n";$i++;} //end while
?>
Ghi chú: Câu lệnh $i++ tương đương với $i = $i+1; câu lệnh này sẽ tăng giá trị của $i lên 1 qua mỗi lần lặp.
Câu lệnh do-while
Câu lệnh do-while cũng tương tự như câu lệnh white, chỉ khác một điểm là câu lệnh được thực hiện trước rồi biểu thức mới được kiểm tra sau, nếu biểu thức còn trả về giá trị TRUE thì tiếu tục thực hiện câu lệnh. Cú pháp của câu lệnh do-while như sau:
do {câu lệnh;}
while ( biểu thức );
Một ví dụ in ra các số từ 1 tới 10 với câu lệnh do-while:
<?php
$i = 1;
do {echo $i, "\n";$i++;}
while ( $i < 10 );   ?>
Câu lệnh for
Câu lệnh for cũng dùng để tạo vòng lặp. Đây là một trong những câu lệnh phức tạp nhất của PHP, cú pháp của nó như sau: for ( biểu thức 1; biểu thức 2; biểu thức 3 )câu lệnh;
Được diễn giải như sau:
§ Đầu tiên biểu thức 1 được thực hiện,
§ Tiếp theo biểu thức 2 được kiểm tra
o Nếu trả về TRUE thì câu lệnh được thực hiện và sau đó thực hiện biểu thức 3.
o Nếu trả về FALSE thì kết thúc câu lệnh for.
§ Kiểm tra lại biểu thức 2 và lặp lại quá trình như trên.
Một ví dụ in ra các số từ 1 tới 10 với câu lệnh for:
 <?php
for ( $i = 0; $i < 10; $i++ )
{echo $i, "\n";} //end for
?>
Câu lệnh foreach
Câu lệnh foreach chỉ làm việc với array. Câu lệnh foreach có 2 dạng cú pháp như sau:
foreach ( $array as $value ) câu lệnh; foreach ( $array as $key => $value ) câu lệnh;
Ta sẽ hiểu rõ hơn 2 dạng cú pháp này qua 2 ví dụ sau:
Ví dụ 1:
<?php
$a = array('a' => 1, 'b' => '2', 'c' => '3');
foreach ( $a as $value )
{echo $value, "\n";} //end foreach
?>
Chương trình trên sẽ in ra 3 số 1, 2 và 3.
Ví dụ 2:
<?php
$a = array('a' => 1, 'b' => '2', 'c' => '3');
foreach ( $a as $key => $value )
{echo $key, "=", $value, "\n";} //end foreach
?>
Chương trình trên sẽ in ra 3 chuỗi a=1, b=2 và c=3.
Câu lệnh switch
Câu lệnh switch hoạt động như là 1 loạt câu lệnh if ghép lại với nhau.
 switch ( $a )
{
case "abc";echo "Giá trị của a là abc";break;
case "def";echo "Giá trị của a là def";break;
case "123";echo "Giá trị của a là 123";break;
default:echo "Giá trị khác";
} //end switch
Câu lệnh break
Câu lệnh break sẽ dừng việc thực thi của các vòng lặp for, foreach, while, do-while và switch. Ở phần trước ta đã thấy câu lệnh break được sử dụng trong câu lệnh switch.
Một ví dụ sử dụng câu lệnh break trong vòng lặp for:
for ( $i=1; $i<=10; $i++ )
{echo $i; if ( $i == 5 ) break; }
Vòng lặp for ở trên thay vì in ra 10 số từ 1 đến 10, vòng lặp chỉ in ra 5 số từ 1 đến 5 mà thôi vì khi $i đạt giá trị 5, vòng lặp sẽ kết thúc do câu lệnh break. Cách dùng câu lệnh break trong các vòng lặp foreach, while và do-while cũng tương tự.
Câu lệnh continue
Câu lệnh continue áp dụng lên các vòng lặp, lệnh continue sẽ bỏ qua lần lặp hiện thời và tiếp tục thực hiện các lần lặp tiếp theo. Để hiểu rõ hơn ta hãy xem ví dụ sau:
for ( $i=1; $i<=5; $i++ )
{if ( $i == 2 ) continue; echo $i; }
Khi $i đạt giá trị 2, câu lệnh echo $i; sẽ được bỏ qua không thì hành nữa do câu lệnh continue. Và như vậy, đoạn lệnh trên khi chạy sẽ in ra các giá trị 1,3,4,5 (không có giá trị 2). Cách dùng của câu lệnh continue trong các vòng lặp foreach, while, do-while cũng tương tự.
i)        Hàm
Hàm do người dùng định nghĩa
Trong lập trình, có một số đoạn mã được dùng nhiều lần ở nhiều nơi khác nhau trong chương trình. Sẽ rất phiền và khó sửa lỗi nếu như ta phải viết lặp đi lặp lại 1 đoạn mã đó ở nhiều nơi. PHP cung cấp một giải pháp đó là hàm do người dùng định nghĩa. Ta có thể đưa đoạn mã đó vào trong 1 hàm, và ở chỗ nào cần dùng đoạn mã đó ta chỉ cần gọi hàm, khi cần sửa đổi, ta chỉ cần sửa đổi 1 chỗ duy nhất là nội dung của hàm chứ không cần phải sửa ở nhiều nơi trong chương trình.
Cú pháp để tạo 1 hàm do người dùng định nghĩa như sau:
function tên Hàm($tham_số1, $tham_số2, ..., $tham _sốn)
{//thân hàm  echo "Testing"; return $kết_quả_trả_về; } //end
Khi cần sử dụng hàm ở chỗ nào, ta chỉ cần dùng cú pháp tênHàm(các tham số cần thiết);
Ví dụ:
<?php
function testing()
{ echo "Testing gunction";
echo 1;echo 2;echo 3;
//end testing
testing(); testing(); testing();    ?>
Lưu ý: Tên hàm cũng như tên biến chỉ bao gồm các ký tự chữ cái (a..z, A..Z), chữ số (0..9) và ký tự gạch dưới (_), ngoài ra tên hàm không được bắt đầu bằng chữ số, nhưng được phép bắt đầu bằng ký tự gạch dưới (tên hàm khác với tên biến chỗ này). Tên hàm trong PHP phân biệt chữ hoa và chữ thường, tức là testing và Testing là 2 tên hàm khác nhau.
Tham số của hàm
Hàm có thể nhận vào các tham số,
Ví dụ:
<?php
function testing($a)
{echo "Tham số là $a"; } //end testing
testing(123); testing("abc");    ?>
Ở ví dụ trên, lời gọi hàm testing(123); sẽ in ra dòng Tham số là 123 và lời gọi hàm testing("abc"); sẽ in ra dòng Tham số là abc. Ta có thể gán giá trị mặc định cho tham số của hàm:
<?php
function testing($a="mặc định")
{echo "Tham số là $a"; } //end testing
testing();   ?>
Khi tham số tương ứng của hàm không được truyền, tham số đó sẽ nhận giá trị mặc định. Đoạn chương trình ví dụ ở trên khi chạy sẽ in ra dòng Tham số là mặc định. Giá trị trả về từ hàm
Hàm còn thể trả về 1 giá trị cho nơi gọi:
<?php
function binh_phuong($a)
{$ketqua = $a * $a; return $ketqua; } //end testing
echo binh_phuong(2);   ?>
Đoạn chương trình trên khi chạy sẽ in ra số 4. Câu lệnh return biểu_thức; sẽ kết thúc hàm và trả về giá trị của biểu_thức cho nơi gọi.
Hãy like nếu bài viết có ích →
Kết bạn với gisgpsrs trên Facebook để nhận bài viết mới nóng hổi

Không có nhận xét nào:

Đăng nhận xét