Thứ Tư, 16 tháng 4, 2014

Php tutorial


LINK DOWNLOAD MIỄN PHÍ TÀI LIỆU "Php tutorial ": http://123doc.vn/document/559542-php-tutorial.htm


Tungvn40@yahoo.com
Tungvn40@yahoo.com

Php Tutorial


1. Php là gì?
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.
VD:
<html>
<head>
<title>Example</title>
</head>
<body>
<?php echo "Hi, I'm a PHP script!"; ?>
</body>
</html>

Mã PHP đc đt trong kiu tag đc bit cho phép ta có th vào hoc ra khi ch đ PHP

2. Cài đt nh th nào?
Cài PHP trên nn Window vi IIS version 3 hoc 4:
- Copy php.ini - dist vào th mc Window. i tên thành php.ini
- Sa file php.ini nh sau:
- t li đng dn mc : 'extension_dir' chuyn ti v trí cài đt php hoc ni đ các file
php_*.ini. VD : c:\php
- t đng dn chính xác đn file: browscap.ini trong th mc Window.
- Chy MMC , chn Web site hoc th mc ca ng dng
- m mc Property ca th mc , chn vào Home Directory, Virtual Directory hay Directory.
- Vào mc: Configuration->App Mappings ->Add->Executable : c:\php\php.exe %s %s. Chú ý
phi có %s %s .
- Trong ô Extension, đánh đuôi file bn mun gn vi mã php. Thng là .php hoc .phtml
- t ch đ sercurity thích hp. Nu dùng h thng NTFS, cn đt cho phép thc hin vi th
mc có php.exe

II.Ngôn ng PHP:

1. Có 4 cách đ dùng PHP;
1. <? echo ("this is the simplest, an SGML processing instruction\n"); ?>

2. <?php echo("if you want to serve XML documents, do like this\n"); ?>

3. <script language="php">
echo ("some editors (like FrontPage) don't
like processing instructions");
</script>

4. <% echo ("You may optionally use ASP-style tags"); %>
<%= $variable; # This is a shortcut for "<%echo " %>

Cách 1 ch có th s dng nu nhng tag ngn đc cho phép s dng. Có th sa
short_open_tag trong cu hình ca php hoc biên dch file php vi la chn cho phép dùng các
tag ngn.
Tng t nh vy, cách th 4 ch có tác dng nu asp_tag đc đt trong file cáu hình ca PHP
PHP cho phép h tr các kiu chú thích ca c C, C++ và Unix shell.
VD:
<?php
CM Soft 70 NCT F2 Q10
PDF processed with CutePDF evaluation edition www.CutePDF.com
CM Soft 70 NCT F2 Q10
PDF processed with CutePDF evaluation edition www.CutePDF.comPDF processed with CutePDF evaluation edition www.CutePDF.com
Tungvn40@yahoo.com
Tungvn40@yahoo.com

echo "This is a test"; // This is a one-line c++ style comment
/* This is a multi line comment
yet another line of comment */
echo "Another Test"; # This is shell-style style comment
?>
2. Các kiu d liu:
2.1S nguyên : c khai báo và s dng giá tr giing vi C:
VD: $a = 1234; # decimal number
$a = -123; # a negative number
$a = 0123; # octal number (equivalent to 83 decimal)
$a = 0x12; # hexadecimal number (equivalent to 18 decimal)

2.2 S thc:
VD :$a = 1.234; $a = 1.2e3;
Chú ý: Khi s dng các s thc đ tính toán , có th s làm mt giá tr ca nó. Vì vy, nên s
dng các hàm toán hc trong th vin chun đ tính toán.
2.3 Xâu :
Có 2 cách đ xác đnh 1 xâu: t gia 2 du ngoc kép (") hoc gia 2 du ngoc đn (').
Chú ý: Các bin giá tr s không đc khai trin trong xâu gia 2 du ngoc đn.
2.4 : Mng :
Mng thc cht là gm 2 bng : bng ch s và bng liên kt.
a. Mng 1 chiu : Có th dùng hàm : list() hoc array() hoc lit kê các giá tr ca tng phn i
trong mng đ to mng . Có th thêm các giá tr vào mng đ to thành 1 mng. > Dùng ging
trong C
Có th dùng các hàm asort(), arsort(), ksort(), rsort(), sort(), uasort(), usort(), and uksort() đ sp
xp mng. Tu thuc vào vic bn đnh sp xp theo kiu gì.
b. Mng nhiu chiu: Tng t C. bn có th dùng nh VD sau:
$a[1] = $f; # one dimensional examples
$a["foo"] = $f;

$a[1][0] = $f; # two dimensional
$a["foo"][2] = $f; # (you can mix numeric and associative indices)
$a[3]["bar"] = $f; # (you can mix numeric and associative indices)
PHP3 không th tham chiu tr tip t mt mng nhiu chièu khi  bên trong 1 xâu:
VD :
$a[3]['bar'] = 'Bob';
echo "This won't work: $a[3][bar]";
Kt qu tr ra s là: This won't work: Array[bar].
Nhng vi VD sau s chy đúng:
$a[3]['bar'] = 'Bob';
echo "This will work: " . $a[3][bar];
Vi PHP4, vn đ s đc gi quyt bng cách cho mng vào gia 2 du ngoc móc { }
VD : $a[3]['bar'] = 'Bob';
echo "This will work: {$a[3][bar]}";
PHP không yêu cu phi khai báo trc kiu d liu cho các bin, Kiu d liu ca bin s ph
thuc vào kiu d liu mà bn gán cho nó,
VD :
$foo = "0"; // $foo là kí t ASCII 48
$foo++; // $foo is xâu "1" (ASCII 49)
$foo += 1; // $foo là s nguyên (2)
$foo = $foo + 1.3; // $foo là s thc (3.3)
$foo = 5 + "10 Little Piggies"; // $foo là s nguyên (15)

3. Bin - giá tr:
PHP quy đnh mt bin đc biu din bt đu bng du $, sau đó là mt ch cái hoc du gch
di.
CM Soft 70 NCT F2 Q10
CM Soft 70 NCT F2 Q10
Tungvn40@yahoo.com
Tungvn40@yahoo.com


3.1 Mt s bin đã đc to sn :
argv : Mng tham s truyn cho script. Khi đon script chy bng dòng lnh, tham s này s
đc dùng ging nh C đ truy nhp các tham s trên dòng lnh.
argc : s các tham s đoc truyn. Dùgn vi argv;

PHP_SELF : tên ca đon mã script đang thc hin. Nu PHP đang đc chy t dòng lnh thì
tham s này không có giá trj.

HTTP_COOKIE_VARS: mt mng các giá tr đc truyn ti script hin ti bng HTTP cookie.
Ch có tác dng nu "track_vars" trong cu hình đc đt hoc ch dn <?php_track_vars?>

HTTP_GET_VARS: Mng các giá tr truyn ti script thông qua phng thc HTTP GET. Ch có
tác dng nu "track_vars" trong cu hình đc đt hoc ch dn <?php_track_vars?>

HTTP_POST_VARS:

3.2 Phm vi giá tr:
PHP coi 1 bin có mt gii hn.  xác đnh mt bin toàn cc (global) có tác dng trong mt
hàm , ta cn khai báo li. Nu không giá tr ca bin s đc coi nh là cc b trong hàm.
VD :
$a = 1;
$b = 2;

Function Sum () {
global $a, $b;

$b = $a + $b;
}

Sum ();
echo $b;

Khi có khai báo global  trên, $a và $b đc cho bit đó là nhng bin toàn cc. Nu không có
khai báo global, $a và $b ch đc coi là các bin bên trong hàm Sum(). iu này khác vi C
Mt cách khác đ dùng bin toàn cc trong 1 hàm là ta dung mng $GLOBAL ca PHP
VD  trên s có th vit nh sau:
$a = 1;
$b = 2;

Function Sum () {
$GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];
}

Sum ();
echo $b;

Mt chú ý khác là khai báo static. Vi khai báo này bên trong mt hàm vi 1 bin cc b, giá tr
ca bin cc b đó s không b mt đi khi ra khi hàm.
VD :
Function Test () {
static $a = 0;
echo $a;
$a++;
}
Vi khai báo nh trên , $a s không mt đi giá tr sau khi thc hin li gi hàm Test() mà $a s
CM Soft 70 NCT F2 Q10
CM Soft 70 NCT F2 Q10
Tungvn40@yahoo.com
Tungvn40@yahoo.com

đc tng lên 1 sau mi ln gi hàm Test().

3.3 Tên bin:
Mt bin có th gn vi 1 cái tên .
VD:
$a = "hello";
$$a = "world";
==> $hello = "world"


echo "$a ${$a}";
<==> echo "$a $hello";

Kt qu ra s là : hello world

Chú ý : bn có th gp phi trng hp không rõ ràng khi s dng cách này vi mng . VD :
$$a[1] s hiu là bn mun dùng $a[1] nh 1 bin hay dùng $$a nh 1 bin vi [1] là ch s?
 tránh trng hp này , cn có su phân bit rõ bng du { }. VD :${$a[1]} hoc ${$a}[1].

3.4 Các giá tr bên ngoài phm vi PHP
HTML Form : khi 1 form gn vi 1 file php qua phng thc POST
VD:
<form action="foo.php3" method="post">
Name: <input type="text" name="name"><br>
<input type="submit">
</form>

PHP s to 1 bin $name bao gm mi giá tr trong trung Name ca Form.
PHP có th hiu đc mt mng mt chiu gm các giá tr trong 1 form. Vì vy, bn có th nhóm
nhng giá tr liên quan li vi nhau hoc s dng đc tính này đ nhn các giá tr t 1 đu vào
tu chn.(multi select input)
Khi tính cht track_vars đc đt trong cu hình hoc có ch dn <?php_track_vars?> . các giá
tr đc submit đc ly ra qua phng thc GET và POST có th ly t 2 mng toàn cc
$HTTP_POST_VARS và $HTTP_GET_VARS

IMAGE SUBMIT:
Khi dùng 1 image đ thc hin submit, có th dùng tag nh sau:
<input type=image ="sub">

Khi ngi dùng click chut trên nh, form tng ng s đc gi ti server kèm theo 2 giá tr
thêm vào : sub_x và sub_y. Nhng bin này s lu gi to đ mà ngi dùng đã click chut trên
nh. Ngi lp trình có kinh nghim s thy rng trên thc t, trình duyt gi các giá tr có chu k
thi gian nhng PHP đã to cm giãc gn nh vic gi các giá tr đó là liên tc.

HTTP Cookies :
PHP h tr HTTP cookies theo đnh dng ca Netscape. Cookies file lu gi thông tin ca các
trình duyt t xa và qua đó có th theo dõi hay nhn bit ngi s dng. Có th dùng Cookies
bng hàm SetCookie(). Hàm này cn đc gi trc khi thông tin đc gi ti trình duyt. Bt
k cookie nào gi ti bn t máy khách (client) s t đng chuyn thành d liu ca phng
thc GET và POST.
Nu bn mun có nhiu giá tr trong 1 cookie, ch cn thêm vào du [ ] vi tên ca cookie.
VD :
SetCookie ("MyCookie[]", "Testing", time()+3600);
Chú ý rng cookie s thay th cho cookie cùng tên, tr trg hp khác đng dn hoc min.

BIN MÔI TRNG:
CM Soft 70 NCT F2 Q10
CM Soft 70 NCT F2 Q10
Tungvn40@yahoo.com
Tungvn40@yahoo.com

PHP t đng to bin cho các bin môi trng nh 1 bin bình thng ca PHP
VD :
echo $HOME; /* Shows the HOME environment variable, if set. */

Vì thông tin ti qua các phng thc GET, POST , Cookie cng t đông to các bin PHP, thnh
thong bn nên đc 1 bin t môi trng đ chc chn rng bn có đúng version. Hàm getenv()
và putenv() giúp bn đc và ghi vi các bin môi trng.

DU CHM TRONG TÊN BIN:
Bình thng, PHP không thay đi tên bin khi bin đó đc truyn vào đon script. Tuy nhiên,
nên chú ý rng dáu chm (.) không phi là mt ký hiu hp l trong tên bin đi vi PHP. Vì vy,
PHP s t đng thay th các du chm bng du gch di.(_)

4. CONSTANTS
PHP đnh ngha sn mt vài hng s:
_FILE_ : tên ca script file đang đc thc hin.
_LINE_ : s dòng ca mã script đang đc thc hin trong script file hin ti.
_PHP_VERSION_ : version ca PHP
_PHP_Ó : tên h điu hành mà PHP đang chy
TRUE
FALSE
E_ERROR : báo hiu có li
E_PARSE : báo li sai khi biên dch
E_NOTICE : Mt vài s kin có th là li hoc không.
E_ALL :

Có th đnh ngha mt hng s bng hàm define()
VD :
<?php
define("CONSTANT", "Hello world.");
echo CONSTANT; // outputs "Hello world."
?>

5. BIU THC
Biu thc là mt phn quan trng trong PHP. Phn ln mi th ban vit đu đc coi nh 1 biu
thc. iu này có ngha là mi th đu có 1 giá tr.
Mt dng c bn nht ca biu thc bao gmcác bin và hng s.
PHP h tr 3 kiu giá tr c bn nht: s nguyên, s thc, và xâu. Ngoài ra còn có mng và đi
tng. Mi kiu giá tr này có th gán cho các bin hay làm giá tr tr ra ca các hàm.
Bn có th thao tác vi các bin trong PHP ging nh vi trong C.
VD
$b = $a = 5; /* assign the value five into the variable $a and $b */
$c = $a++; /* post-increment, assign original value of $a
(5) to $c */
$e = $d = ++$b; /* pre-increment, assign the incremented value of
$b (6) to $d and $e */

/* at this point, both $d and $e are equal to 6 */

$f = double($d++); /* assign twice the value of $d before
the increment, 2*6 = 12 to $f */
$g = double(++$e); /* assign twice the value of $e after
the increment, 2*7 = 14 to $g */
$h = $g += 10; /* first, $g is incremented by 10 and ends with the
value of 24. the value of the assignment (24) is
then assigned into $h, and $h ends with the value
CM Soft 70 NCT F2 Q10
CM Soft 70 NCT F2 Q10
Tungvn40@yahoo.com
Tungvn40@yahoo.com

of 24 as well. */

6.CÁC CU TRÚC LNH:
6.1 If else else if:
if (điu kin) { do something; }
elseif ( điu kin ) { do something;}
else { do something;}

6.2 Vòng lp :
while ( DK) { }
do { } white ( DK );
for (bieuthuc1; bieuthuc2; bieu thuc3) { }
PHP 4 only :
foreach(array_expression as $value) statement
foreach(array_expression as $key => $value) statement
6.3 break và continue:
break : thoát ra khi vòng lp hin thi
continue : b qua vòng lp hin ti, tip tc vòng tip theo.

6.4 switch
switch (tên bin) {
case trng hp 1: break;
case trng hp 2: break;
case trng hp 3: break;
default :
}

7 HÀM:
Dùng ging vi C++. Ngoi tr bn không cn phi khai báo kiu cho tham s ca hàm:
7.1 Tham tr :
VD:
function takes_array($input) {
echo "$input[0] + $input[1] = ", $input[0]+$input[1];
}

7.2 Tham bin:
function add_some_extra(&$string) {
$string .= 'and something extra.';
}

7.3 Tham s có giá tr mc đnh:
function makecoffee ($type = "cappucino") {
return "Making a cup of $type.\n";
}
Chú ý : khi s dng hàm có đi s có giá tr mc đnh, các bin này s phi nm v phía phi
nhát trong danh sách đi s.
VD : Sai
function makeyogurt ($type = "acidophilus", $flavour) {
return "Making a bowl of $type $flavour.\n";
}
úng ;
function makeyogurt ($flavour, $type = "acidophilus") {
return "Making a bowl of $type $flavour.\n";
}

7.4 Giá tr tr li ca hàm:
CM Soft 70 NCT F2 Q10
CM Soft 70 NCT F2 Q10
Tungvn40@yahoo.com
Tungvn40@yahoo.com

Có th là bt k giá tr nào, Tuy vây, không th tr li nhiu giá tr riêng l nhng có th tr li mt
mng các giá tr.
VD
function small_numbers() {
return array (0, 1, 2);
}

 tr li mt tham tr, bn cn có du &  c khai báo ca hàm cng nh  giá tr tr li.
VD :
function &returns_reference() {
return &$someref;
}

$newref = &returns_reference();

7.5 Hàm bin:
PHP cho phép s dng hàm giá tr Ngha là khi mt bin đc goi có kèm theo du ngoc đn ,
PHP s tìm hàm có cùng tên vi giá tr bin đó và thc hin

VD
<?php
function foo() {
echo "In foo()<br>\n";
}

function bar( $arg = '' ) {
echo "In bar(); argument was '$arg'.<br>\n";
}

$func = 'foo';
$func();
$func = 'bar';
$func( 'test' );
?>

8. CÁC TOÁN T:
PHP có các toán t cho các phép s hc : + - * / %
Các toán t logic : and or xor ! && ||
Toán t thao tác vi bit : & | ^ ~ << >>
Toán t so sánh : ==, != ,< ,> ,<=, >=, ==== (bng va cùng kiu - PHP4 only), !== (khác hoc
khác kiu - PHP4 only)
Toán t điu khin li : @ - khi đng trc 1 biu thc thì các li ca biu thc s b b qua và
lu trong $php_errormsg
VD:
<?php
/* Intentional SQL error (extra quote): */
$res = @mysql_query ("select name, code from 'namelist") or
die ("Query failed: error was '$php_errormsg'");
?>
Toán t thc thi : ` `- PHP s thc hin ni dung nm gia 2 du ` nh 1 lnh shell. Tr ra giá tr
là kt qu thc hin lnh
VD :
$output = `ls -al`; //lit kê các file bng lnh Linux
echo "<pre>$output</pre>";

9 LP VÀ I TNG:
CM Soft 70 NCT F2 Q10
CM Soft 70 NCT F2 Q10
Tungvn40@yahoo.com
Tungvn40@yahoo.com

Class: là tp hp các bin và hàm làm vic vi các bin này. Mt lp có đnh dng nh sau:
<?php
class Cart {
var $items; // Items in our shopping cart

// Add $num articles of $artnr to the cart

function add_item ($artnr, $num) {
$this->items[$artnr] += $num;
}

// Take $num articles of $artnr out of the cart
function remove_item ($artnr, $num) {
if ($this->items[$artnr] > $num) {
$this->items[$artnr] -= $num;
return true;
} else {
return false;
}
}
}
?>

Lp Cart  đây là mt kiu d liu, vì vy bn có th to mt bin có kiu này vi toán t new
VD:
$cart = new Cart;
$cart->add_item("10", 1);

Lp có th đc m rng bng nhng lp khác. Lp mi thu đc có tt c nhng bin và hàm
ca cá lp thành phn. Thc hin vic tha k này bng t khoá "extends". Chú ý : k tha
nhiu lp 1 lúc không đc chp nhn.
VD :
class Named_Cart extends Cart {
var $owner;

function set_owner ($name) {
$this->owner = $name;
}
}

Các hàm khi to ca lp đc gi t đng khi bn gi toán t new.
Tuy nhiên, các hàmkhi to ca lp cha s không đc gi khi hàm khi to ca lp con đc
gi. Hàm khi to có th có đi s hoc không,

10. THAM CHIU:
Tham chiu trong PHP có ngha là ly cùng 1 giá tr bng nhiu tên bin khác nhau. Khác vi con
tr trong C, tham chiu là mt bng các bí danh. Chú ý : trong PHP, tên bin và nôi dung ca
bin là khác nhau. Vì vy, cùng 1 ni dugn có th có nhiu tên khác nhau.
Tham chiu PHP cho phép bn to 2 bin có cùng nôi dung.
VD :
$a = & $b; > $a, $b tr ti cùng 1 giá tr.
Tham chiu truen giá tr bng tham chiu. Thc hin vic này bng cách to mt hàm cc b
và truyn giá tr đc tham chiu
VD:
function foo (&$var) {
$var++;
CM Soft 70 NCT F2 Q10
CM Soft 70 NCT F2 Q10
Tungvn40@yahoo.com
Tungvn40@yahoo.com

}

$a=5;
foo ($a);
> Kt qu : $a = 6;
Giá tr tr li ca mt hàm bng tham chiu rt tin khi bn mun s dng hàm đ tìm 1 giá tr
trong 1 phm vi nào đó.
VD :
function &find_var ($param) {
code
return $found_var;
}

$foo =& find_var ($bar);

Khi bn mun loi b mi liên kt gia tên bin và giá tr ca bin, s dng hàm unset()
VD :
$a = 1;
$b =& $a;
unset ($a);

11. THAO TÁC VI NH:
PHP không b gii hn vi mã HTML đc tr li cho trình duyt. Vì vy, có th dùng PHP đ to
và thao tác vi các file nh có đnh dng khác nhau, bao gm :gif, png, jpg, wbmp, and xpm. PHP
có th đa các file nh trc tip đn các trình duyt. Bn s cn biên dch PHP vi th vin GD
bao gm các hàm thao tác vi nh. GD và PHP có th s cn có thêm 1 s th vin khác, tu
thuc vào đnh dng ca file nh cn dùng.
VD : To nh GIF vi PHP
<?php
Header("Content-type: image/gif");
$string=implode($argv," ");
$im = imagecreatefromgif("images/button1.gif");
$orange = ImageColorAllocate($im, 220, 210, 60);
$px = (imagesx($im)-7.5*strlen($string))/2;
ImageString($im,3,$px,9,$string,$orange);
ImageGif($im);
ImageDestroy($im);
?>

gi s VD trên trong file button.php . KHi đó, đ s dng ta dùng tag : <img


12. PHP và MySQL:
 connect ti 1 CSDL trên MySQL server rt đn gin. Bn ch cn dùng hàm
mysql_connect(host, user, password) đ m 1 kt ni ti MYSQL server vi kt qu là giá tr tr
v ca hàm (Gi s là bin $db).
Sau đó, dùng hàm mysql_select_db(database_name, link_id) đ chn CSDL bn mun kt ni.
 thc hin mt câu lnh truy vn, dùng hàm mysql_query(query, link_ID). Giá tr tr li ca
hàm là kt qu ca câu truy vn. Nu b qua link_ID thì kt ni cui cùng ti MySQL server s
đc thc hin.
Bn có th xem ví d sau s hiu rõ hn.
<html>
<body>
<?php
$db = mysql_connect("localhost", "root");

CM Soft 70 NCT F2 Q10
CM Soft 70 NCT F2 Q10
Tungvn40@yahoo.com
Tungvn40@yahoo.com

mysql_select_db("mydb",$db);

$result = mysql_query("SELECT * FROM employees",$db);

printf("First Name: %s<br>\n", mysql_result($result,0,"first"));

printf("Last Name: %s<br>\n", mysql_result($result,0,"last"));

printf("Address: %s<br>\n", mysql_result($result,0,"address"));

printf("Position: %s<br>\n", mysql_result($result,0,"position"));

?>

</body>
</html>


Ngoài cách dùng hàm mysql_result() đ ly kt qu thc hin , bn có th dùng các hàm khác :
mysql_fetch_row(), mysql_fetch_array(), and mysql_fetch_object().
* mysql_fetch_row($result) : tr v mt mng các d liu ly t 1 dòng trong CSDL. Nu đã 
cui CSDL, giá tr tr v là false. Bn phi dùng ch s ca các trng trong CSDL nu mun ly
d liu,
VD :
<html>
<body>
<?php
$db = mysql_connect("localhost", "root");
mysql_select_db("mydb",$db);
$result = mysql_query("SELECT * FROM employees",$db);

echo "<table border=1>\n";
echo "<tr><td>Name</td><td>Position</tr>\n";
while ($myrow = mysql_fetch_row($result)) {
printf("<tr><td>%s %s</td><td>%s</td></tr>\n", $myrow[1], $myrow[2], $myrow[3]);
}
echo "</table>\n";
?>
</body>
</html>

* mysql_fetch_array (int result [, int result_type]) : tr v mt mng cha d liu ly t 1 dòng
trong CSDL. Tng t nh mysql_fetch_row() nhng bn có th ly trc tip tên trng đ ly
d liu.
VD : Cùng mt CSDL nh trên, bn có th thy s khác bit
<html>
<body>
<?php
$db = mysql_connect("localhost", "root");
mysql_select_db("mydb",$db);
$result = mysql_query("SELECT * FROM employees",$db);
if ($myrow = mysql_fetch_array($result)) {
do {
printf("<a href=\"%s?id=%s\">%s %s</a><br>\n", $PHP_SELF, $myrow["id"], $myrow["first"],
$myrow["last"]);
} while ($myrow = mysql_fetch_array($result));
CM Soft 70 NCT F2 Q10
CM Soft 70 NCT F2 Q10

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

Đăng nhận xét