Tài liệu tham khảo Ngôn ngữ Lập trình PHP

pdf 115 trang hoanguyen 5431
Bạn đang xem 20 trang mẫu của tài liệu "Tài liệu tham khảo Ngôn ngữ Lập trình PHP", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdftai_lieu_tham_khao_ngon_ngu_lap_trinh_php.pdf

Nội dung text: Tài liệu tham khảo Ngôn ngữ Lập trình PHP

  1. Ban chỉ Banđạo cntt chỉ của đạo cơ công quan đảng nghệ thông tin của cơ quanPHP & MySQL đảng TàI liệu tham khảo Ngôn ngữ lập trình pHP Hà nội, 2003 1
  2. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Phần I : Giới thiệu ngôn ngữ lập trình PHP ch−ơng i : Ngôn ngữ lập trình pHP I. Giới thiệu PHP và môi tr−ờng lập trình web. 1. PHP là gì ? Cái tên PHP ban đầu đ−ợc viết tắt bởi cụm từ Personal Home Page, và đ−ợc phát triển từ năm 1994 bởi Rasmus Lerdorf. Lúc đầu chỉ là một bộ đặc tả Perl, đ−ợc sử dụng để l−u dấu vết ng−ời dùng trên các trang web. Sau đó, Rasmus Lerdorf đã phát triển PHP nh− là một máy đặc tả (Scripting engine). Vào giữa năm 1997, PHP đã đ−ợc phát triển nhanh chóng trong sự yêu thích của nhiều ng−ời. PHP đã không còn là một dự án cá nhân của Rasmus Lerdorf và đã trở thành một công nghệ web quan trọng. Zeev Suraski và Andi Gutmans đã hoàn thiện việc phân tích cú pháp cho ngôn ngữ để rồi tháng 6 năm 1998, PHP3 đã ra đời (phiên bản này có phần mở rộng là *.php3). Cho đến tận thời điểm đó, PHP ch−a một lần đ−ợc phát triển chính thức, một yêu cầu viết lại bộ đặc tả đ−ợc đ−a ra, ngay sau đó PHP4 ra đời (phiên bản này có phần mở rộng không phải là *.php4 mà là *.php). PHP4 nhanh hơn so với PHP3 rất nhiều. PHP bây giờ đ−ợc gọi là PHP Hypertext PreProcesor. 2. Tại sao phải sử dụng PHP Nh− chúng ta đã biết, có rất nhiều trang web đ−ợc xây dựng bởi ngôn ngữ HTML (HyperText Markup Language). Đây chỉ là những trang web tĩnh, nghĩa là chúng chỉ chứa đựng một nội dung cụ thể với những dòng văn bản đơn thuần, hình ảnh ,và có thể đ−ợc sự hỗ trợ bởi ngôn ngữ JavaScript, hoặc Java Apple. Những trang web nh− vậy ng−ời ta th−ờng gọi là client- side. Tuy nhiên, Internet và Intranets đã đ−ợc sử dụng cho các ứng dụng cần tới cơ sở dữ liệu. Các trang ứng dụng nh− vậy đ−ợc gọi là trang web động, bởi vì nội dung của chúng luôn thay đổi tùy thuộc vào dữ liệu và ng−ời sử dụng. PHP là ngôn ngữ làm đ−ợc những điều nh− vậy. Bằng cách chạy ch−ơng trình PHP trên máy chủ Web server, bạn có thể tạo ra các ứng dụng 2
  3. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL có sự t−ơng tác với cơ sở dữ liệu để tạo ra những trang web và đây đ−ợc gọi là trang web động. Chúng ta hãy xem xét cách hoạt động của trang web đ−ợc viết bằng ngôn ngữ HTML và PHP nh− thế nào. Web server Với các trang HTML : + Đọc yờu cầu từ browser + Tỡm file.htm trờn server Khi có yêu cầu tới một trang web từ + Gửi lại cả file.htm cho browser phía ng−ời sử dụng (browser). Web server thực hiệu ba b−ớc sau : + Đọc yêu cầu từ phía browser, + Tìm trang web trên server. Request + Gửi trang web đó trở lại cho browser (nếu tìm thấy) qua mạng Internet hoặc Intranet . Trang html Với các trang PHP : Khác với các trang HTML, khi một trang PHP đ−ợc yêu cầu, web server phân tích và thi hành các đoạn mã PHP để tạo ra trang HTML. Web server + Đọc yờu cầu từ browser Điều đó đ−ợc thể hiện bằng bốn b−ớc sau : + Tỡm trang web(file.php) trờn server + Đọc yêu cầu tử phía browser. + Thực hiện cỏc đoạn mó PHP + Gửi trả lại nội dung cho browser + Tìm trang web trên server. + Thực hiện các đoạn mã PHP trên trang web đó để sửa đổi nội dung của trang. + Gửi trở lại nội dung cho browser (đây là trang HTML có thể hiển thị đ−ợc bởi trình duyệt Internet Explorer hoặc trình duyệt nào đó). Kết xuất Tóm lại, sự khác nhau giữa HTML và PHP là HTML không đ−ợc thực hiện trên máy Request chủ Web server còn các trang *.php viết bằng các đoạn mã PHP đ−ợc thực hiện trên máy chủ Web server do đó nó linh động và mềm dẻo hơn . 3
  4. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL 3. Những điểm mạnh của PHP -PHP thực hiện với tốc độ rất nhanh và hiệu quả .Một Server bình th−ờng có thể đáp ứng đ−ợc hàng triệu truy cập tới trong một ngày. PHP hỗ trợ kết nối tới rất nhiều hệ CSDL khác nhau: PostgreSQL,mSQL,Oracle, dbm, filePro ,Hyperware, informix,InterBase, Sybase, Ngoài ra còn hỗ trợ kết nối với ODBC thông qua đó có thể kết nối với nhiều ngôn ngữ khác mà ODBC hỗ trợ. -PHP cung cấp một hệ thống th− viện phong phú : Do PHP ngay từ đầu đ−ợc thiết kế nhằm mục đích xây dựng và phát triển các ứng dụng trên web nên PHP cung cấp rất nhiều hàm xây dựng sẵn giúp thực hiện các công việc rất dễ dàng : gửi, nhận mail ,làm việc với các cookie, và nhiều thứ khác nữa . -PHP là một ngôn ngữ rất dễ dùng, dễ học và đơn giản hơn nhiều so với các ngôn ngữ khác nh− Perl, Java. Nếu bạn đã biết ngôn ngữ C thì mọi việc sẽ hoàn toàn thuận lợi . -PHP có thể sử dụng đ−ợc trên nhiều hệ điều hành, chúng ta có thể viết chúng trên Unix, Lunix và các phiên bản của Windows. Và có thể đem mã PHP này chạy trên các hệ điều hành khác mà không phải sửa đổi lại mã. -PHP là ngôn ngữ mã nguồn mở. II. Biến, hằng số và kiểu dữ liệu trong PHP. 1. Kiểu dữ liêu . PHP có ba kiểu dữ liệu cơ bản : interger, double và string. Ngoài ra còn có các kiểu dữ liệu khác (nh−ng không phải các kiểu dữ liệu cơ bản) nh− arrays (các kiểu dữ liệu mảng), objects (các kiểu dữ liệu đối t−ợng). Interger là kiểu chiếm 4 byte bộ nhớ ,giá trị của nó trong khoảng –2 tỷ tới + 2 tỷ. Kiểu Double là kiểu số thực ,phạm vi biểu diễn ± (10-308 ữ 10308). Kiểu string dùng để chứa các giá trị bao gồm các ký tự và con số . Ví dụ : 2 // đây là kiểu interger 1.0 // đây là kiểu double “2” // đây là kiểu string 4
  5. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL “2 hours” // đây là một kiểu string khác 2. Hằng số Hằng số là những giá trị không đổi. Chúng ta th−ờng dùng hằng số để l−u các giá trị không đổi trong suốt ch−ơng trình nh− : nhiệt độ (00C), các giá trị thời gian chỉ sự chuyển giao giữa sáng ,ch−a ,chiều ,tối a. Khai báo hằng số : Ta dùng hàm define() để khai báo hằng số : define(“COMPANY”, “Phop’s Bicycles”); define(“YELLOW”, “#FFFF00”); define(“VERSION”, 4); define(“NL”, “ \n”); Trong ví dụ trên chúng ta đã dùng hàm define() để khai báo hằng số NL. Hằng số này là một thẻ ngắt dòng trong HTML. Chúng ta sẽ sử dụng các hằng số trong PHP nh− sau : echo (“Employment at ”. COMPANY. NL); Cách viết trên cũng giống nh− các viết sau: echo (“Employment at Phop’s Bicycles \n”); Chú ý : hằng số phải ở ngoài hai dấu “ và ”. Trờng hợp sau là không có hiệu lực : echo (“Employment at COMPANY NL”);. Khi thực hiện nó sẽ cho kết quả là : “Employment at COMPANY NL”. Hàm defined() : hàm này dùng để kiểm tra xem một hằng số nào đó đã đ−ợc khai báo ch−a. Ví dụ : if ( defined (“YELLOW”)) { echo (“ \n”); } 5
  6. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL b. Các hằng số đã đ−ợc định nghĩa trong PHP (Built-in Constants): Để hỗ trợ cho ng−ời lập trình, PHP cung cấp sẵn các hằng số nh− : các biến môi trờng, các biến của Web server Apache Ngời lập trình có thể sử dụng hàm phpinfo() để xem các giá trị này. + Hằng số nguyên : đây là những giá trị có kiểu integer. Ví dụ : 10 + Hằng số thực: đây là những giá trị có kiểu double. Ví dụ : 10.00 + Hắng ký tự : đây là một xâu ký tự đặt trong dấu ngoặc đơn hoặc kép. Ví dụ : “Ngôn ngữ lập trình PHP”. 6
  7. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL 3. Biến và giá trị logic. + Cũng giống với C/C++, PHP không có khái niệm TRUE và FALSE. Các giá trị TRUE đ−ợc hiểu là những giá trị bằng 1 và giá trị FALSE là những giá trị bằng 0 hoặc xâu rỗng . + Khi sử dụng biến chúng ta không cần khai báo kiểu . Ví dụ : $a = 1; // $a là một biến kiểu integer. $a = 1.2; // bây giờ $a là một biến kiểu double. $a = “A” ; // bây giờ $a lại là một biến kiểu string. + Nếu nh− thực hiện phép toán giữa biến có kiểu số và kiểu string, PHP sẽ coi chuỗi là một dãy số nh− sau : $str = “222B Baker Street”; Ta thấy biến $str có giá trị kiểu string, và nếu cộng số 3 với giá trị này thì : $x = 3 + $str ; // $x = 225 khi đó biến $x nhận đ−ợc giá trị 255 vì PHP đã cộng 3 với ba số đầu. Nhng nếu ta in giá trị của biến $str thì echo ($str); // print : “222B Baker Street” Chú ý rằng các phép toán giữa số và chuỗi chỉ đúng khi ký tự đầu của chuỗi là số . + Ta cũng có thể làm thay đổi kiểu giá trị của một biến bằng cách ép kiểu $a = 11.2; // biến $a có kiểu double $a = (int) $a; // bây giờ $a có kiểu integer ,giá trị là 11 $a = (double) $a; // bây giờ $a lại có kiểu double, giá trị là 11.0 $b = (string) $a ; // biến $b có kiểu string ,giá trị là “11” Cũng phải biết rằng PHP tự động chuyển đổi kiểu rất tốt. Nếu thật sự cần thiết chúng ta mới phải dùng cách trên. 7
  8. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL + Các hàm làm việc với biến gettype() : hàm này trả lại kiểu của một biến nào đó. Giá trị trả về có thể là : “integer” “double” “string” “array” “object” “class” “unknown type” ví dụ : if (gettype($user_input) == “integer”) { $age = $user_input; } settype() : hàm này ép kiểu cho một biến nào đó. Nếu thành công hàm trả về giá trị 1 (true) ,ng−ợc lại là 0 (false). ví du : $a = 7.5; settype($a, “integer”); if (settype($a, “array”)){ echo (“Conversion succeeded. ”); }else{ echo (“Conversion error. ”); } isset() và unset() : Hàm isset() kiểm tra một biến đã đ−ợc gán giá trị hay ch−a, hàm unset() sẽ giải phóng bộ nhớ cho một biến nào đó . ví dụ : 8
  9. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL $id = “323bb”; if (isset($id)) { echo (“Dữ liệu đã đ−ợc gán”); }else{ echo (“Dữ liệu ch−a đ−ợc gán”); } unset($id); if(!isset($id)) { echo (“Dữ liệu đã đ−ợc giải phóng”); } empty() : Cũng giống hàm isset(), hàm empty() sẽ trả về giá trị 1 (true) nếu một biến là rỗng và ng−ợc lại 0 (false). Đối với biến có kiểu số giá trị bằng 0 đ−ợc coi là rỗng, biến kiểu string đ−ợc coi là rỗng nếu xâu là xâu rỗng. ví dụ: echo empty($new) ; // true $new = 1; echo empty($new); // false $new = “”; echo empty($new); // true $new = 0; echo empty($new); // true $new = “So 323”; echo empty($new); // false unset($new); echo empty($new); // true 9
  10. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL III. Các toán tử + Bảng các phép toán số học Phép toán ý nghĩa Ví dụ Giải thích + Phép cộng 7 + 2 Thực hiện phép cộng giữa 7 và 2 : 9 - Phép trừ 7 – 2 Thực hiện phép trừ giữa 7 và 2 : 5 * Phép nhân 7 * 2 Thực hiện phép nhân giữa 7 và 2 : 14 / Phép chia 7 / 2 Thực hiện phép chia giữa 7 và 2 : 3.5 % Chia d 7 % 2 Thực hiện phép chia d giữa 7 và 2 : 1 Ta có thể viết các phép toán ngắn gọn nh− bảng sau : Khi viết T−ơng đ−ơng với $h += $i $h = $h + $i $h -= $i $h = $h - $i $h *= $i $h = $h * $i $h /= $i $h = $h / $i $h %= $i $h = $h % $i + Phép gán : ví dụ : $x = 1; $y = $x + 1; $length = $area / $width; 10
  11. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL + Bảng các phép toán quan hệ Phép ý nghĩa Ví dụ Giải thich toán == So sánh bằng $h == Kiểm tra $h và $i có bằng nhau So sánh lớn hơn $h $i Kiểm tra $h có lớn hơn $i không >= bằng $h Kiểm tra $h có khác $i không $i Các phép so sánh th−ờng dùng kiểm tra điều kiện trong các câu lệnh điều khiển mà ta sẽ học ở bài sau . + Bảng các phép toán logic Phép toán logic cùng với toán hạng tạo thành biểu thức logic. Biểu thức logic có thể có giá trị là 1 (true) hoặc 0 (false) . Toán hạng a Toán hạng b a && b a || b !a !b 1 1 1 1 0 0 1 0 0 1 0 1 0 1 0 1 1 0 0 0 0 0 1 1 + Các phép toán với biến kiểu string . 11
  12. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Ta sử dụng dấu “. “ để ghép hai biến kiểu string với nhau . ví dụ : $first = “Phineas”; $last = “Phop”; $full = $first. “ ”. $last; // $full = “Phineas Phop” ; echo ($full); Ta có thể ghép hai xâu nh− sau: echo ($last. “’s Bicycles”); //print : Phop’s Bicycles Để có thể chèn một biến vào trong hàng có kiểu string thì tên biến phải để trong dấu đóng mở ngoặc nhọn. echo (“${last}’s Bicycles”); + Các phép toán thao tác mức bit. Các phép toán thao tác mức bit tác động lên từng bit của toán hạng . Ký hiệu ý nghĩa & AND bit | OR bit ^ XOR bit Bảng các phép toán nh− sau : & Kết quả | Kết quả ^ Kết quả 1&1 1 1 | 1 1 1^1 0 1&0 0 1 | 0 1 1^0 1 0&1 0 0 | 1 1 0^1 1 0&0 0 0 | 0 0 0^0 0 PHP cũng hỗ trợ các phép dịch phải và dịch trái >> : dịch phải > n làm cho các bit trong $a bị dịch phải đi n vị trí. T−ơng tự ta có phép dịch trái . 12
  13. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL ví dụ : 11 >> 2 = 2 ; vì : 11 (1011) >> 2 2 (0010) + Các phép toán tăng giảm : - Phép tăng : phép tăng (toán tử tăng) tăng giá trị của toán hạng lên một đơn vị. $a ++ : $a đ−ợc sử dụng rồi mới tăng ++ $a : $a tăng rồi mới đ−ợc sử dụng - Phép giảm : t−ơng tự nh− phép tăng, khác là giá trị bị giảm đi một đơn vị. $a : $a đ−ợc sử dụng rồi mới giảm $a : $a giảm rồi mới đ−ợc sử dụng ví dụ : $a = 10; // $a bằng 10 $b = $a++ ; // $a bằng 11 nh−ng $b bằng 10 $a = 10; // $a bằng 10 $b = $a ; // $a bằng 9 và $b bằng 9 + Phép toán điều kiện. ? : Phép toán điều kiện cùng với toán hạng tạo nên biểu thức điều kiện. Ta ký hiệu e1 ,e2, e3 là ba toán hạng. Biểu thức có dạng : e1 ? e2 : e3 Nếu e1 != 0 thì giá trị của biểu thức điều kiện là e2 Nếu e1 == 0 thì giá trị của biểu thức điều kiện là e3 ví dụ : tìm max max = $a>$b ? a : b ; 13
  14. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL + Toán tử sizeof (đối t−ợng) : Phép toán sizeof cho biết kích th−ớc (tính bằng byte ) ô nhớ mà đối t−ợng chiếm trong bộ nhớ. Đối t−ợng ở đây có kiểu là integer, double, string. ví dụ : $a = 10; echo sizeof($a); //sẽ in ra màn hình là : 4 IV. Các câu lệnh điều khiển 1. Lệnh if_else : đây là lệnh rẽ nhánh có điều kiện . a. Dạng 1 : if ( biểu thức ) câu lệnh; Câu lệnh ở đây t−ơng đ−ơng với một khối lệnh. Một khối lệnh đ−ợc đặt trong dấu ngoặc kép. ý nghĩa : + Nếu biểu thức khác không ,thì câu lệnh đ−ợc thực hiện. + Nếu biểu thức bằng không, thì câu lệnh không đ−ợc thực hiện b. Dạng 2 : if ( biểu thức ) câu lệnh 1; else câu lệnh 2; ý nghĩa : + Nếu biểu thức khác không ,thì câu lệnh 1 đ−ợc thực hiện. + Nếu biểu thức bằng không, thì câu lệnh 2 đ−ợc thực hiện Chú ý : * Câu lệnh 1 ở dạng 2 là lệnh if_else 14
  15. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL + Nếu l−ợng else bằng l−ợng If thì else thuộc về If gần nhất theo từng cặp từ trong ra ngoài. Ví dụ : $a = 10; $b = 10; $c = 3; $d = 3; $e = 12; $f = 8; if($a == $b) if($c == $d) if($e == $f) $max = $e; else $max = $f; else $max = $d; else $max = $b echo $max ; //printf max = 8 + Nếu l−ợng else ít hơn l−ợng If thì else thuộc về If ngần nhất theo từng cặp từ trong ra ngoài. Ví dụ : T−ơng đ−ơng với : * Câu lệnh 2 của dạng 2 là elseif : 15
  16. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Bắt nguồn từ : Có thể viết lại nh− sau: if ( biểu_thức1 ) if ( biểu_thức1 ) câu_lệnh 1; câu_lệnh 1; else elseif (biểu_thức 2) if ( biểu_thức 2 ) câu_lệnh 2; câu_lệnh 2; elseif (biểu_thức 3) else câu_lệnh 3; if ( biểu_thức 3 ) câu_lệnh 3; elseif (biểu_thức i) câu_lệnh i; else if ( biểu_thức i ) else câu_lệnh i; câu_lệnh n; else câu_lệnh n; Câu lệnh elseif tạo ra lệnh rẽ nhánh có điều kiện trong đó thực hiện 1 trong n cách khác nhau. - Nếu biểu_thức i khác không (i = 1, n-1) thì thực hiện câu lệnh i . - Nếu biểu_thức i bằng không (i = 1, n-1) thì câu lệnh thứ n đ−ợc thực hiện. 2. Câu lệnh switch : switch (biểu_thức n) { case n1: câu lệnh 1; break; case n2: câu lệnh 2; break; case nn: câu lệnh nn; [default: câu lệnh] } 16
  17. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Câu lệnh switch là câu lệnh rẽ nhánh có điều kiện trong đó thực hiện một trong n cái rẽ nhánh. +Nếu biểu_thức n = ni (i = 1, n) thì câu lệnh sau case ni đ−ợc thực hiện cho đến khi gặp lệnh break hoặc dấu ngoặc “}” +Nếu biểu_thức n != mọi ni (i = 1, n) mà có nhánh Default thì các câu lệnh sau Default đ−ợc thực hiện. Ví dụ : 3. Câu lệnh FOR: Dạng lệnh : for (biểu_thức 1; biểu_thức 2; biểu_thức 3) câu lệnh ; Lệnh for là lệnh tạo chu trình có điều kiện. B−ớc 1 : tính biểu_thức 1 B−ớc 2 : tính biểu_thức 2 : Nếu biểu_thức 2 khác 0 thì thực hiện câu lệnh và sang b−ớc 3. 17
  18. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Nếu biểu_thức 2 bằng 0 thì kết thúc vòng for B−ớc 3 : tính biểu_thức 3 và quay lại b−ớc 2. + biểu_thức 1, biểu_thức 2, biểu_thức 3 là các thành phần. Mỗi thành phần có thể gồm nhiều biểu thức. Khi đó mỗi biểu thức đ−ợc viết cách nhau một dấu phẩy (“,”). +Các biểu thức đ−ợc tính lần l−ợt từ trái qua phải +Biểu thức trong biểu_thức 2 quyết định thực hiện thân của for. Ví dụ : ”); } ?> +Có thể vắng mặt bất kể thành phần nào. Nếu vắng mặt biểu_thức 2 thì câu lệnh luôn đ−ợc thực hiện. Mặc dù vắng mặt vẫn phải có dấu chấm phẩy (“;”) Ví dụ : +Nếu vắng biểu_thức 1 và biểu_thức 3 thì : for ( ; biểu_thức 2 ; ) cau_lenh ; t−ơng đ−ơng với : while (biểu_thức 2) cau_lenh ; 4. Câu lệnh WHILE while (biểu_thức) câu lệnh ; 18
  19. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Lệnh while là một lệnh tạo chu trình có điều kiện. Điều kiện thực hiện đ−ợc kiểm tra ở đầu chu trình. B−ớc 1 : Tính biểu thức Nếu biểu thức khác không, sang b−ớc 2 Nếu biểu thức bằng không, kết thúc vòng while B−ớc 2 : Thực hiện câu lệnh. Quay lại b−ớc 1. Chú ý : + Biểu thức có thể bao gồm nhiều biểu thức. Khi đó các biểu thức đ−ợc viết cách nhau một dấu phẩy ,và đ−ợc tính lần l−ợt từ trái qua phải. Biểu thức cuối cùng quyết định thực hiện câu lệnh. + Không đ−ợc phép vắng mặt biểu thức + Để tạo chu trình vô tận thì while(1) { if (biểu_thức) break; } Ví dụ : $i = 11; while ( $i) { if (my_function($i) == “error”) { break; } ++ $number; } 19
  20. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL 5. Lệnh DO WHILE Dạng lệnh : do { câu lệnh; }while (biểu_thức); Lệnh do while là lệnh tạo chu trình có điều kiện, trong đó điều kiện thực hiện chu trình đ−ợc kiểm tra ở cuối chu trình. Hoạt động : B−ớc 1 : Thực hiện câu lệnh B−ớc 2 : Tính biểu thức biểu_thức +Nếu biểu thức biểu_thức khác không thì quay lại b−ớc 1 +Nếu biểu thức biểu_thức bằng không thì kết thúc do while. Ví dụ : \n”); $i = 0; $total = 10; do { echo (“\t $i \n”); }while(++ $i \n”); ?> 6. Lệnh break Là lệnh rẽ nhánh không điều kiện và th−ờng dùng để ra khỏi thân của switch, while, do while, for . 20
  21. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Lệnh break chỉ cho phép thoát khỏi thân các lệnh bên trong nhất chứa nó. 7. Lệnh continue Là lệnh rẽ nhánh không điều kiện .Lệnh th−ờng dùng để bắt đầu lại một chu trình mới trong các lệnh for, while, do while mà không cần thực hiện hết toàn bộ thân của của lệnh tạo chu trình. 8. Khai báo tiền xử lý include và require . Để sử dụng các đoạn mã ở bên ngoài, chúng ta có thể sử dụng khai báo tiền xử lý include và require. Cho phép chúng ta xây dựng các hàm các hằng số, và bất kỳ đoạn mã nào sau đó có thể chèn vào các đoạn script. Require khác include là, nó có thể làm thay đổi nội dung của trang hiện tại khi biên dịch, các trang này dùng để khai báo các biến, các hằng số hay các đoạn mã đơn giản không có vòng lặp. Khi đó include cho phép thực hiện các câu lệnh phức tạp – có câu lệnh tạo chu trình. Nó chỉ sử dụng các hàm nh− những hàm ngoài của ch−ơng trình. V. Hàm trong PHP 1. Quy tắc xây dựng hàm function tên_hàm (danh sách đối số hình thức) { Thân hàm . } + Định nghĩa hàm không nhất thiết phải nằm ngoài thân mọi hàm, trong hàm có thể có hàm khác. Nh−ng việc sử dụng một hàm không khác nhau giữa xây dựng hàm trong thân một hàm và ngoài mọi hàm . + Tên hàm tuỳ đặt và khác tên hàm chuẩn. + Hàm có thể có giá trị trả về hoặc không. + Các câu lệnh đ−ợc quyền gọi bất kỳ hàm nào đã đ−ợc khai báo và đã đ−ợc định nghĩa. 21
  22. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL + Return : - Trả một giá trị về cho nơi gọi hàm - Là nơi báo kết thúc hàm 2. Gọi hàm . + Hàm phải đ−ợc xây dựng (khai báo) tr−ớc khi gọi . + Khi gọi hàm, nếu có giá trị trả về th−ờng đ−ợc đặt trong biểu thức . 3. Biến toàn cụ và biến cục bộ. Thông th−ờng PHP coi các biến đ−ợc sử dụng trong thân của hàm là biến cục bộ. Nghĩa là biến trong thân hàm không làm thay đổi giá trị của biến ở ngoài hàm đó. Muốn hàm làm thay đổi giá trị của biến ngoài ta cần khai báo global tr−ớc biến đó trong thân hàm . Ví dụ : $position = “m”; function change_pos() { $position = “s”; } change_pos(); echo (“$position”); //Prints “m” Ta thấy biến $position giá trị không đổi sau khi gọi hàm change_pos(). $position = “m”; function change_pos() { global $position; $position = “s”; } change_pos(); echo (“$position”); //Prints “s” 22
  23. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Ta có thể viết nh− trên hoặc ta có thể viết : $position = “m”; function change_pos() { GOLOBALS[$position] = “s”; } change_pos(); echo (“$position”); //Prints “s” VI. Biến mảng trong PHP 1. Mảng một chiều Mảng là một biến bao gồm nhiều phần tử có cùng tên nh−ng khác nhau về chỉ số (các chỉ số này tăng dần từ 0 đến n). Với ngôn ngữ lập trình C, các phần tử của mảng có cùng kiểu dữ liệu ,nh−ng với PHP thì mềm dẻo hơn. Các phần tử của mảng không nhất thiết phải cùng kiểu. a. Khai báo mảng một chiều. Ta có thể khai báo mảng bằng cách gán tên mảng với dấu đóng mở ngoặc vuông không có chỉ số. Chúng ta hãy xét ví dụ sau : $countries[] = “cr”; $countries[] = “de”; $countries[] = “us”; Ví dụ trên tạo ra một mảng gồm ba phần tử có chỉ số là 0, 1 và 2. Việc đó cũng t−ơng tự nh− ta gán : $countries[0] = “cr”; $countries[1] = “de”; $countries[2] = “us”; Ngoài ra các chỉ số của mảng không nhất thiết phải tăng dần mà có thể đ−ợc khai báo nh sau : $countries[50] = “cr”; 23
  24. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL $countries[20] = “de”; $countries[10] = “us”; echo (“$countries[20]”); // prints de Khi đó để thêm một phần tử mới vào mảng chúng ta có thể viết $countries[] = “uk”; // chỉ số sẽ là 51 Một phần tử mới đ−ợc thêm vào với chỉ số là chỉ số lớn nhất của mảng cộng thêm một. Ngoài ra cũng có thể khai báo mảng một chiều bằng câu lệnh array $countries = array (“cr”, “de”, “us”) ; echo (“$countries[2]”); //prints “us” Để chỉ số không bắt đầu từ không ta có thể khai báo lại nh− sau $countries = array (1 => “cr”, “de”, “us”); echo (“$countries[2]”); //prints “de” Toán tử => có thể đ−ợc sử dụng tr−ớc bất kỳ một phần tử nào trong mảng $countries = array (“cr”, 7 => “de”, “us”); và khi đó phần tử có giá trị “cr” có chỉ số là 0 còn phần tử có giá trị “de”, “us” lần l−ợt là 7 và 8. Khác với ngôn ngữ lập trình C, chỉ số của mảng một chiều không chỉ là các số nguyên mà còn là xâu ký tự. Ta có thể khai báo nh− sau : $countries[“ca”] = “Canada”; $countries[“cr”] = “Costa Rica”; $countries[“de”] = “Germany”; $countries[“uk”] = “United Kingdom”; $countries[“us”] = “United States”; echo (“$countries[“ca”]); // print Canada Nếu dùng array thì sẽ là : $countries = (“ca” => “Canada”, 24
  25. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL “cr” => “Costa Rica”, “de” => “Germany”, “uk” => “United Kingdom”, “us” => “United States”); 25
  26. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL b. Làm việc với các phần tử của mảng Có thể sử dụng vòng lặp for xét từng phần tử của mảng. $countries = array (“cr”, “de”, “us”); $num_elements = count($countries); for ($i = 0 ; $i \n”); } Ví dụ trên sẽ đúng khi chỉ số của các phần tử tăng dần đều. Nếu chỉ số các phần tử không theo một thứ tự nào cả ta có thể sử dụng hàm list() và each(). reset ($countries); while (list ($key, $value ) = each ($countries)) { echo (“Chỉ số $key, giá trị $value”); } Để di chuyển con trỏ tới phần tử tiếp theo hoặc tr−ớc đó ta cũng có thể dùng hàm next() - hàm next() trả về là 1 (true) nếu phần tử tiếp theo không phải là phần tử cuối cùng, ng−ợc lại là 0 (false) và prev() - hàm prev() cho giá trị trả về là 1 (true) nếu phần tử tiếp theo không phải là phần tử đầu tiên, ng−ợc lại là 0 (false). Hàm key () sẽ cho biết chỉ số và hàm current() sẽ cho biết giá trị của phần tử đó . $arr = array (3, 4, 5, 6, 7); do { $k = key ($arr); $val = current ($arr); echo (“Phần tử $k = $val”); }while 2. Mảng hai chiều Chúng ta có thể khai báo mảng hai chiều nh− sau : 26
  27. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL $countries = array (“Europs” => array (“de”, “uk”), “North America” => array (“ca”, “cr”, “us”)); echo ($countries[“Europs”][1]); // print “uk” echo ($countries[“North America”][2]); // print “us” Ta có cấu trúc của mảng trên nh− sau : $countries[“Europs”] $countries[“North America”] [0] [1] [0] [1] [2] “de” “uk” “ca” “cr” “us” Cũng giống nh− mảng một chiều ta sẽ dùng vòng lặp nh− for, while, do while để duyệt qua các phần tử của mảng. Ví dụ : $countries = array (“Europs” => array (“de”, “uk”), “North America” => array (“ca”, “cr”, “us”)); while (list ($key1) = each ($countries)) { echo (“$key1 : \n”); while (list ($key2, $val) = each($countries[“$key1”])) { echo (“ - $val \n”) } } Khi chạy ch−ơng trình sẽ in ra màn hình là : Europ : - de - uk North America : - ca - cr - us 27
  28. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL 3. Các hàm sắp xếp mảng . PHP cung cấp cho chúng ta các hàm để sắp xếp mảng. Với mỗi loại mảng sẽ có một hàm t−ơng ứng. Với mảng có chỉ số là kiểu nguyên chúng ta có hàm sort() để sắp xếp tăng dần các phần tử của mảng, hàm rsort() sẽ sắp xếp các phần tử của mảng giảm dần . $countries = array (“us”, “uk”, “ca”, “cr”, “de”); sort ($countries); while (list ($key, $val) = each ($countries)) { echo (“Element $key equals $val \n”); } Khi chạy ch−ơng trình sẽ là : Element 0 equals ca Element 1 equals cr Element 2 equals de Element 3 equals uk Element 4 equals us Với mảng chỉ số có kiểu string thì dùng hàm asort (), arsort () để sắp xếp mảng theo chiều tăng dần và giảm dần. Nếu bạn dùng các hàm sort() và rsort() thì các chỉ số có kiểu string sẽ chuyển thành các chỉ số có kiểu nguyên. $countries = array(“us” => “United States”, “uk” => “United Kingdom”, “ca” => “Canada”, “cr” => “Costa Rica”, “de” => “Germany”); asort ($countries); while (list($key, $val) = each($countries)) { echo “Chi so $key bang $val \n”; 28
  29. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL } Kết quả khi chạy ch−ơng trình : Chi so ca bang Canada Chi so cr bang Costa Rica Chi so de bang Germany Chi so uk bang United Kingdom Chi so us bang United States Nh−ng nếu thay dòng asort ($countries); bằng sort ($countries); kết quả sẽ là Chi so 0 bang Canada Chi so 1 bang Costa Rica Chi so 2 bang Germany Chi so 3 bang United Kingdom Chi so 4 bang United States Để sắp xếp mảng tăng dần hay giảm dần theo chỉ số chúng ta có hàm ksort() – tăng dần và krsort() – giảm dần . $countries = array(“e” => “United States”, “d” => “United Kingdom”, “c” => “Canada”, “b” => “Costa Rica”, “a” => “Germany”); ksort ($countries); while (list($key, $val) = each($countries)) { echo “Chi so $key bang $val \n”; } Kết quả : Chi so a bang Germany 29
  30. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Chi so b bang Costa Rica Chi so c bang Canada Chi so d bang United Kingdom Chi so e bang United States VII. Lập trình h−ớng đối t−ợng (OOP) 1. Định nghĩa lớp . Chúng ta có thể định nghĩa lớp bằng toán tử class, và trong mỗi một lớp chúng ta sẽ xây dụng các ph−ơng thức và thuộc tính cho lớp đó . Giả sử muốn định nghĩa lớp “Sesssion” chúng ta làm nh− sau : Để định nghĩa thuộc tính cho lớp chúng ta đặt từ khoá var tr−ớc thuộc tính đó. <? class Session { var $sqlhost = “localhost”; var $sqluser = “root”; var $sqlpass = “password”; var $sqldb = “session”; 30
  31. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL var $linkid; var $seshid; var $sessdata; var $userid; var $error_no; var $err; // Định nghĩa các ph−ơng thức ở đây } //Kết thúc định nghĩa lớp ?> Tiếp theo chúng ta sẽ định nghĩa các ph−ơng thức cho lớp trên. Ph−ơng thức cần xây dựng đầu tiên là Session() sau đó đến các ph−ơng thức khác. seshid = $localSeshID; $this->userid = $localUserID; // Kết nối tới MySQL $this->linkid=mysql_connect($this->sqlhost, $this->sqluser, $this- >sqlpass); 31
  32. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL if (!$this->linkid) { $this->err=mysql_error(); $this->error_no=102; } } // Định nghĩa các ph−ơng thức khác } ?> 2. Sử dụng lớp đã đ−ợc định nghĩa. Để khai báo một đối t−ợng có kiểu thuộc lớp đã xây dựng ta dùng toán tử new nh− sau : error_no) { //Thông báo có lỗi } $user = $mysesh->sessdata[userid]; ?> Welcome to my website, 32
  33. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL ”> VIII. Tìm hiểu thêm về HTML Phần một chúng ta đã tìm hiểu sơ l−ợc về ngôn ngữ HTML. Trong mục này chúng ta sẽ trình bày thêm về nó với trọng tâm là FORM của HTML. Lý do là vì khi muốn giao tiếp giữa HTML và PHP script thì không thể không biết đến FORM. FORM là công cụ phổ biến nhất để chuyển dữ liệu từ HTML đến PHP script (client lên server). Thông th−ờng, khi viết một script, ng−ời ta thiết kế một FORM sao cho nó cung cấp đầy đủ những thông tin mà script cần để xử lý. 1. Cấu trúc của một FORM Một FORM đ−ợc mở đầu bằng thẻ và kết thúc bằng thẻ . Trong FORM có : - Thuộc tính : FORM th−ờng có ba thuộc tính, ba thuộc tính này nằm trong thẻ FORM mở đầu của một FORM : action, method, enctype . - Các thẻ đ−ợc dùng trong FORM : input, select, textarea, hn, p, hr, dir, dl, menu, ol, ul, address, blockquote, [isindex]. pre . - FORM có ba thành phần chính : textarea, select, input . - FORM có thể đ−ợc dùng trong các thẻ : blockquote,body,dd, li. 2. Các thuộc tính Khi tạo một FORM ,công việc đầu tiên là xác định thuộc tính của nó. - Thuộc tính action : Action=”URL” chỉ đến script mà FORM sử dụng. Ngoài ra nó cũng có thể là mailto url, khi đó nội dung của FORM đ−ợc mail đến địa chỉ trong url . 33
  34. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL - Thuộc tính method : Method có thể đ−ợc gán bằng “GET” hoặc “POST” ,nó chỉ ra ph−ơng thức Post hay Get sẽ đ−ợc sử dụng trong FORM, giá trị ngầm định là Get. - Thuộc tính enctype : Enctype=”Mime_type” :chỉ ra loại dữ liệu sẽ gửi đi. Giá trị ngầm định là application/x-www-form-urlencode. Trong một trang chúng ta có thể sử dụng nhiều FORM nhng không đ−ợc lồng chúng vào nhau. 2. Các thành phần cơ bản của FORM. Một FORM ,thông th−ờng có ba thành phần chính : +Textarea +Select +Input a - Textarea Đ−ợc bắt đầu bằng thẻ và kết thúc bằng thẻ . Bên trong chứa các ký tự, thẻ này đ−ợc dùng lồng vào trong FORM. Các thuộc tính của Texterea . - Name : Định nghĩa tên của thành phần, thuộc tính này luôn luôn phải có. - Rows : Cho biết số hàng của hộp văn bản. - Cols : Cho biết số cột của văn bản. Wrap : Chỉ ra cách xử lý word_wraping (căn chiều dài của dòng văn bản theo kích th−ớc của hộp văn bản) trong hộp thoại. Nếu wrap=”off”, chức năng word_wraping bị cấm. Nếu wrap=”vitual”, chức năng này đ−ợc bật lên, khi gõ văn bản vào, ta thấy con trỏ tự động xuống hàng mỗi khi nó chạy đến biên của hộp văn bản, ký tự newline (OA hex) tự động đ−ợc thêm vào nh−ng không đ−ợc gửi đi cùng FORM. Nếu wrap=”physical”, chức năng này cũng đ−ợc bật và hoạt động nh− trên nh−ng ký tự newline đ−ợc gửi đi cùng với FORM. 34
  35. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Văn bản nằm giữa hai thẻ và sẽ đ−ợc thể hiện nh− đoạn văn bản ngầm định trong vùng dữ liệu. Ví dụ: . b. Select Đ−ợc bắt đầu bằng thẻ và kết thúc bằng thẻ , cặp thẻ này có thể lồng trong FORM hay bất kỳ thành phần nào của FORM ngoại trừ Texterea và Select . Select có các thuộc tính sau : - Name : Tên của thành phần. - Size : Cho biết số thành phần sẽ hiển thị, giá trị ngầm định là 1, do đó danh sách lựa chọn th−ờng đ−ợc thể hiện dới dạng pop-up menu. Thuộc tính này có thể không có. - Multiple : Nếu thuộc tính này đ−ợc thiết lập, nhiều lựa chọn sẽ đ−ợc chọn cùng một lúc, ng−ợc lại chỉ đ−ợc chọn một item. Khi sử dụng Select, chúng ta có thể dùng thêm Option . Bên trong chứa các ký tự, có thể đ−ợc sử dụng lồng vào Select . Các thuộc tính Option : - Disable : Đánh một lựa chọn bị cấm. Khi hiển thị, chọn lựa này sẽ bị che mờ. - Selected : Đánh dấu chọn lựa này đã đ−ợc chọn, nếu thuộc tính Multiple đ−ợc bật trong Select, bạn có thể đánh dấu Selected nhiều chọn lựa cùng lúc. Nó dùng để đánh dấu các lựa chọn ngầm định. - Value : Chỉ ra giá trị đ−ợc gán cho lựa chọn, nếu không có thì nội dung của th− mục option sẽ đ−ợc gửi đi thay cho value. c. Input 35
  36. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Mở đầu bằng thẻ , thẻ này có thể dùng trong bất cứ thành phần nào khác của FORM ngoại trừ Texterea và Select. Các thuộc tính : - Align : Có thể là một trong ba giá trị top, middle, bottom dùng để căn lề ảnh với các văn bản xung quanh, thuộc tính này chỉ có ý nghĩa với Type=“image” . - Name : gắn tên biến cho dữ liệu của thành phần này. Giá trị của thuộc tính do user lựa chọn . - Type : định ra một trong những giá trị sau checkbox, hidden, image, password, radio, reset, submit, text, file, bottom . - Checked : chỉ ra một nút radio, hay một checkbox cơ đ−ợc chọn hay không. - Maxlength : chỉ ra chiều dài tối đa mà hộp thoại văn bản có thể chứa, thuộc tính này chỉ có ý nghĩa với input có type=”text” hay type=”password” . - Size : chỉ ra kích th−ớc thực sự của hộp thoại văn bản. IX. Tóm l−ợc Nh− vậy, chúng ta đã khảo sát hầu hết các chức năng cơ bản của PHP, từ các kiểu dữ liệu, khai báo biến, hàng, mảng cho tới cách thực hiện ch−ơng trình dạng Máy khách/Máy chủ (Client/Server), và nhúng các đoạn mã PHP vào các trang HTML .v.v. Nh− trên chúng ta đã trình bày, cơ sở dữ liệu cho trang Web là thành phần không thể thiếu, nó đóng vai trò quyết định cho ch−ơng trình. Ví lý do đó, phần tiếp theo chúng ta sẽ khảo sát ngôn ngữ SQL và các hàm API của PHP để thực hiện các lệnh truy vấn trên hệ quản trị cơ sở dữ liệu MySQL. X. Các hàm API trong PHP 1. Giới thiệu về MySQL . PHP hỗ trợ một số l−ợng lớn các hàm làm việc với cơ sở dữ liệu nh Oracle, Sybase, PostgreSQL, MySQL. Thông qua chuẩn ODBC (Open Database Connectivity), bằng cách sử dụng các hàm API (Application 36
  37. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Programming Interface) mà PHP có thể làm việc đ−ợc với nhiều hệ quản trị cơ sở dữ liệu nh− vậy. Nếu hệ quản trị cơ sở dữ liệu không hỗ trợ ODBC ,và hơn nữa ODBC có đặc điểm chỉ hỗ trợ ở dạng chuẩn thì PHP có thể làm việc với ODBC ở tầng trên. Nếu không muốn sử dụng ODBC ta có thể sử dụng các hàm API . Trong phần này chúng ta chỉ sử dụng các hàm API để làm việc với hệ quản trị cơ sở dữ liệu MySQL . 2. Các hàm cơ bản làm việc với cơ sở dữ liệu MySQL. a) Các hàm kết nối đến MySQL Server PHP cung cấp hai hàm để kết nối với cơ sở dữ liệu MySQL : mysql_connect và mysql_pconnect . + mysql_connect () : hàm này sẽ tạo ra một liên kết tới máy chủ MySQL . Cú pháp : int mysql_connect (string [hostname [:port] [:/path_to_socket]], string [username], string [password]); Trong đó : - hostname : Tên máy chủ cơ sở dữ liệu, nơi trang web sẽ chứa cơ sở dữ liệu. Giá trị ngầm định là “localhost’” - :port : Địa chỉ cổng, nơi bộ máy cơ sở dữ liệu lắng nghe yêu cầu. Giá trị ngầm định là “:3306” . - :/path_to_socket : Cũng giống nh− :port nh−ng chỉ cho hệ điều hành UNIX. Giá trị ngầm định là “:/tmp/mysql.sock” . - username : Tên của ng−ời sử dụng đ−ợc phép kết nối vào bộ máy cơ sở dữ liệu. - password : Mật khẩu của ng−ời sử dụng để kết nối vào bộ máy cơ sở dữ liệu. Hàm này trả về mã số nhận dạng nếu kết nối thành công, giá trị 0 (false) nếu việc kết nối có lỗi. Mã số nhận dạng này sẽ đ−ợc sử dụng cho tất cả các yêu cầu tới bộ máy cơ sở dữ liệu sau này. 37
  38. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Sự kết nối này sẽ đóng lại khi gọi hàm mysql_close() hoặc kết thúc đoạn PHP script. + mysql_pconnect() : Hàm này tạo ra một liên kết bền vững với máy chủ MySQL. Cú pháp : int mysql_pconnect (string [hostname [:port] [:/path_to_socket]], string [username], string [password]); Tham số và giá trị trả về của hàm này cũng giống hàm mysql_connect(). Sự khác biết giữa hai hàm này là liên kết tới máy chủ MySQL không bị đóng lại kể cả khi kết thúc kịch bản (script) PHP hay gọi hàm mysql_close(). Mục đích của hàm này là luôn luôn duy trì liên kết tới máy chủ MySQL do luôn có sự yêu cầu tới máy chủ, tránh cho máy chủ phải tìm kiếm mã số nhận dạng mới từ đó giảm thời gian truy cập . Chú ý : hàm này chỉ thực hiện đ−ợc khi PHP đ−ợc định cấu hình nh− là một module của Web server . + mysql_close() : Hàm này huỷ bỏ sự kết nối tới máy chủ MySQL . Cú pháp : int mysql_close(int [link_identifier]); Tham số link_identifier là mã số nhận dạng tạo ra bởi hàm mysql_connect(). Hàm trả về là True nếu thành công, ng−ợc lại là False . b) Các hàm thao tác trên CSDL + mysql_create_db() : Hàm tạo cơ sở dữ liệu Cú pháp : int mysql_create_db(string name, int [link_identifier]) ; Trong đó : - string name : Tên của cơ sở dữ liệu cần tạo. - int link_identifier : Mã số nhận dạng đ−ợc cấp bởi hàm mysql_connect() . Chúng ta hoàn toàn có thể gửi câu lệnh SQL để tạo cơ sở dữ liệu thông qua hàm mysql_query() . 38
  39. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL + mysql_drop_db() : Hàm xoá cơ sở dữ liệu Cú pháp : int mysql_drop_db(string name, int [link_identifier]); Trong đó : - string name : Tên của cơ sở dữ liệu cần xoá . - int link_identifier : Mã số nhận dạng đ−ợc cấp bởi hàm mysql_connect() . Chúng ta hoàn toàn có thể gửi câu lệnh SQL để xoá cơ sở dữ liệu thông qua hàm mysql_query(). + mysql_select_db() : Hàm cho cơ sở dữ liệu hoạt động . Cú pháp : int mysql_select_db(string database_name, int [link_identifier]); Trong đó: - database_name : Tên của cơ sở dữ liệu mà sau này các hàm API khác của PHP sẽ thực hiện trên đó. - int link_identifier : Mã nhận dạng đ−ợc cấp bởi hàm mysql_connect(). Câu lệnh này sẽ gắn tên cơ sở dữ liệu với mã nhận dạng, sau này khi làm việc với link_identifier sẽ bao gồm cả cơ sở dữ liệu đ−ợc chọn . c) Các hàm thao tác trên dữ liệu + mysql_query() : Hàm gửi câu lệnh SQL tới máy chủ MySQL . Cú pháp : int mysql_query(string query, [int link_identifier]) ; Trong đó : - string query : Câu lệnh SQL cần gửi tới máy chủ MySQL . - int link_identifier : Mã số nhận dạng, nó phải đ−ợc thực hiện trong hàm mysql_select_db() tr−ớc đó . + mysql_db_query() : Hàm gửi câu lệnh SQL tới máy chủ MySQL . Cú pháp : 39
  40. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL int mysql_db_query(string database, string query, int [link_identifier]); Trong đó : - string database : Tên cơ sở dữ liệu câu lệnh SQL sẽ thực hiện trên đó. - string query : Câu lệnh SQL cần thực hiện . - link_identifier : Mã số nhận dạng đ−ợc cấp bởi hàm mysql_connect() Hàm này chỉ rõ câu lệnh đ−ợc thực hiện trên cơ sở dữ liệu nào nên tr−ớc đó không cần thực hiện hàm mysql_select_db(); +mysql_insert_id() : Hàm lấy giá trị đ−ợc sinh ra từ câu truy vấn INSERT trớc Cú pháp : int mysql_insert_id([link_identifier]) ; trong đó: int link_identifier : Mã số nhận dạng đ−ợc cấp bởi hàm mysql_connect() . Hàm này trả về giá trị id đ−ợc sinh ra trong cột AUTO_INCREMENT bởi câu truy vấn tr−ớc đó. Điều này chỉ có tác dụng trên link_identifier đ−ợc chỉ ra trong hàm, nếu gọi hàm trên mà không chỉ định tham số link_identifier thì liên kết đ−ợc mở cuối cùng sẽ đ−ợc chỉ định. Hàm mysql_insert_id() trả về giá trị 0 nếu câu truy vấn tr−ớc đó không sinh ra một giá trị AUTO_INCREMENT. Nếu ta muốn giữ lại giá trị cho lần sau, thì phải gọi hàm này ngay sau câu truy vấn sinh ra giá trị . + mysql_fetch_row() : Hàm trả về một mảng là giá trị của một bảng ghi hiện tại với chỉ số là số thứ tự của các tr−ờng (chỉ số bắt đầu từ 0). Sau đó hàm sẽ trỏ tới bảng ghi tiếp theo cho tới khi gặp bảng ghi cuối cùng hàm trả về giá trị false. Để truy xuất tới các giá trị của cột ta viết : tên_mảng[số thứ tự] Cú pháp : array mysql_fetch_row( int result_identifier); 40
  41. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Trong đó : result_identifier là mã số trả về của hàm mysql_query() hoặc mysql_db_query() . Ví dụ : + mysql_fetch_array() : Hàm trả về một mảng là giá trị của một bảng ghi hiện tại, sau đó hàm sẽ trỏ tới bảng ghi tiếp theo cho tới khi gặp bảng ghi cuối cùng hàm trả về giá trị false. Cú pháp : array mysql_fetch_array( int result_identifier [, int result_type] ); Trong đó : result_identifier là mã số trả về của hàm mysql_query() hoặc mysql_db_query() . Để truy xuất đến các thành phần của cột : tên_biến_mảng[“tên_trờng”]; result_type là một hằng số có thể nhận các giá trị sau: -MYSQL_NUM : chỉ trả lại một mảng chứa các chỉ số là số (giống nh− hàm mysql_fetch_row() ) -MYSQL_ASSOC: chỉ trả lại một mảng liên kết 41
  42. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL -MYSQL_BOTH : trả lại mảng chứa đựng các chỉ số gồm cả các con số và chỉ số liên kết . Hàm này là sự mở rộng của hàm mysql_fetch_row(). Nó cho phép truy cập tr−ờng dữ liệu của mảng kết quả không chỉ thông qua các chỉ số là các số mà chúng có thể là tên của các tr−ờng dữ liệu. Điều này làm cho việc lập trình đơn giản và chính xác hơn. Ví dụ: \n”; echo “user_id: “. $row[0] .“ \n”; echo “user_name: “. $row[“name”] .“ \n”; echo “user_name: “. $row[1] .“ \n”; } mysql_free_result ($result); ?> + mysql_fetch_object() : Hàm trả về một đối t−ợng là giá trị của một bảng ghi hiện thời. Sau đó hàm sẽ trỏ tới bảng ghi tiếp theo cho tới khi gặp bảng ghi cuối cùng hàm trả về giá trị false. Để truy xuất tới các giá trị của cột ta viết tên_object->tên_cột . Cú pháp : object mysql_fetch_object(int result_identifier); Trong đó : result_identifier là mã số trả về của hàm mysql_query() hoặc mysql_db_query() . Ví dụ : 42
  43. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL id ; echo $row->name; } ?> +mysql_fetch_assoc() :lấy về một dòng kết quả nh− là một mảng liên kết . cú pháp: array mysql_fetch_assoc(int result_identifier) Trong đó : result_identifier là mã số trả về của hàm mysql_query() hoặc mysql_db_query() . Hàm trả về một mảng t−ơng ứng với một bản ghi đ−ợc lấy về và trả lại FALSE nếu không có bản ghi nào. Hàm này t−ơng đ−ơng với hàm array mysql_fetch_array() với tham số result_type là : MYSQL_ASSOC ví dụ : 43
  44. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL +mysql_data_seek() Di chuyển con trỏ bên trong “tập kết quả” (có đ−ợc sau khi câu truy vấn SELECT đ−ợc thực hiện) Cú pháp: bool mysql_data_seek(int result_identifier, int row_number); Trong đó : result_identifier là mã số trả về của hàm mysql_query(), mysql_db_query(), mysql_list_tables(), mysql_list_dbs() . row_number là chỉ số của bản ghi mà cần đặt con trỏ vào . Hàm trả về true nếu thành công, false nếu lỗi . Hàm này sẽ di chuyển con trỏ bên trong “tập kết quả” (đ−ợc chỉ rõ bởi tham đối result_identifier) đến dòng có mã bằng tham đối row_number. Các dòng trong tập kết quả đ−ợc bắt đầu từ 0 Ví dụ: =0; $i ) { if (! Mysql_data_seek ($result, $i)) { printf ("Cannot seek to row %d\n", $i); continue; } if(!($row = mysql_fetch_object ($result))) continue; printf ("%s %s \n", $row->last_name, $row->first_name); } mysql_free_result ($result); ?> 44
  45. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL + mysql_num_rows() :trả lại số dòng trong result_identifier (nơi chứa kết quả của câu lệnh SQL đã đ−ợc thực hiện) cú pháp: mysql_num_rows(int result_identifier) ; Trong đó : result_identifier là mã số trả về của hàm mysql_query(), mysql_db_query(), mysql_list_tables(), mysql_list_dbs() . +mysql_affected_rows() cú pháp : int mysql_affected_rows(int [link_identifier]) ; Trong đó :int link_identifier là mã số nhận dạng, nó phải đ−ợc thực hiện trong hàm mysql_select_db() tr−ớc đó . Hàm trả về số dòng đã bị tác động bởi một câu truy vấn SQL :INSERT, UPDATE, DELETE tr−ớc đó theo tham số link_identifier. Nếu link_identifier không đ−ợc chỉ định thì mã kết nối tr−ớc đó sẽ đ−ợc chỉ định. Chú ý : - Nếu câu lệnh SQL tr−ớc đó là DELETE mà không có mệnh đề WHERE thì toàn bộ các bản ghi trong bảng đã bị xoá nh−ng hàm mysql_affected_rows() sẽ trả về gián trị 0. -Hàm này không có tác dụng đối với câu lệnh truy vấn SELECT. Để lấy đ−ợc số dòng trả về (số dòng đã bị tác động) bởi câu lệnh SELECT ta dùng hàm mysql_num_rows(). +mysql_result() : lấy dữ liệu từ result_identifier cú pháp : mixed mysql_result(int result_identifier, int row, mixed [field]); Trong đó : result_identifier là mã số trả về của hàm mysql_query(), mysql_db_query(), mysql_list_tables(), mysql_list_dbs() . row là bản ghi mà ta sẽ lấy dữ liệu field là tr−ờng trong dòng row mà ta sẽ lấy dữ liệu . Các tham số result_identifier và row phải có, còn tham field là tùy chọn. Hàm sẽ trả lại các nội dung của dòng row và cột field từ tập kết quả đ−ợc chỉ định bởi biến result_identifier. Nếu đối số field không đ−ợc chỉ định rõ thì tr−ờng tiếp theo của bản ghi sẽ đ−ợc trả về . 45
  46. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Ví dụ: \n”; echo “ mysql_result($result, 0, “name”) \n”; ?> +mysql_free_result() : Hàm giải phóng vùng bộ nhớ đ−ợc liên kết với result_identifier . cú pháp: mysql_free_result(int result_identifier) ; Trong đó : result_identifier là mã số trả về của hàm mysql_query(), mysql_db_query(), mysql_list_tables(), mysql_list_dbs() . Hàm này chỉ đ−ợc dùng nếu nh− bạn đánh giá thấy rằng kịch bản của bạn sử dụng quá nhiều bộ nhớ khi đang chạy. Gọi hàm này trên một trình xử lý kết quả sẽ giải phóng toàn bộ dữ liệu liên kết trong bộ nhớ . Ngoài ra còn các hàm khác: string mysql_tablename (int result_identifier, int i) Hàm trả lại tên của bảng/csdl tại chỉ số i trong result_identifier. string mysql_field_name (int result_identifier, int field_index) Hàm trả lại tên của tr−ờng tại vị trí field_index trong mã result_identifier int mysql_list_dbs ([int link_identifier]) Hàm trả lại một result_identifier là danh sách biến CSDL trên MySQL Server nếu thành công, lỗi trả về false . int mysql_list_tables (string database [, int link_identifier]) Hàm trả về danh sách tất cả câc bảng trong một CSDL MySQL, thành công trả về một result identifier, giá trị false nếu có lỗi . 46
  47. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL int mysql_list_fields (string database_name, string table_name [, int link_identifier]) Hàm trả về thông tin liên quan đến một bảng dữ liệu. int mysql_num_fields (int result_identifier) Trả về số tr−ờng trong tập kết quả . int mysql_num_rows (int result_identifier) Trả về số bản ghi trong tập kết quả, hàm này chỉ có giá đối với các câu lệnh SELECT ,để lấy lại số bản ghi đ−ợc trả lại từ các lệnh :INSERT, UPDATE hoặc DELETE, dùng mysql_affected_rows(). string mysql_field_type (int result_identifier, int field_index) Hàm trả về kiểu dữ liệu của tr−ờng tại vị trí field_index trong mã result_identifier . int mysql_field_len (int result_identifier, int field_offset) Hàm trả về độ dài của tr−ờng đ−ợc chỉ định thông qua tham số field_offset . array mysql_fetch_lengths (int result_identifier) trả về một mảng t−ơng ứng với các độ dài của mỗi tr−ờng trong bản ghi đ−ợc lấy về bởi hàm mysql_fetch_row() hoặc false nếu có lỗi. int mysql_errno ([int link_identifier]) Hàm trả về mã lỗi từ hàm thao tác CSDL MySQL tr−ớc ,trả về giá trị 0 nếu không có lỗi . string mysql_error ([int link_identifier]) Hàm trả về xâu thông báo lỗi từ hàm thao tác CSDL MySQL tr−ớc, trả về xâu rỗng nếu không có lỗi . object mysql_fetch_field (int result_identifier [, int field_offset]) Lấy thông tin về trờng từ tập kết quả rồi trả lại nh một đối t−ợng. 47
  48. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL XI. Session và Cookie 1. Session là gì ? HTTP là giao thức không đ−ợc xây dựng theo cách để có thể lu giữ đ−ợc trạng thái giữa hai lần giao dịch. Khi một ng−ời dùng yêu cầu truy nhập một trang Web, rồi sau đó ng−ời dùng này lại tiếp tục yêu cầu truy nhập đối với trang Web khác thì HTTP không thể biết đ−ợc rằng đó là hai yêu cầu từ cùng một ng−ời dùng. ý t−ởng của việc điều khiển phiên làm việc là có thể l−u vết của một ng−ời dùng trong suốt một phiên làm việc. Nếu chúng ta làm đ−ợc điều này thì sẽ dễ dàng cung cấp một truy nhập cho ng−ời dùng, từ đó ta có thể l−u vết trạng thái của ng−ời dùng và có thể thực hiện việc mua bán trên mạng. Session trong PHP đ−ợc điều khiển bởi một giá trị ID duy nhất gọi là “sessionID”, giá trị này sẽ đ−ợc tự động sinh ra và mã hóa. SessionID đ−ợc sinh ra bởi PHP và đ−ợc l−u trữ ở phía client trong suốt một phiên giao dịch. Nó có thể đ−ợc l−u trữ trên các Cookie ở máy ng−ời dùng hay truyền lên các URL. SessionID có tác dụng nh− một khoá để bạn có thể đăng ký những biến đặc biệt gọi là biến session. Nội dung của những biến này đ−ợc chứa trên Server. SessionID là những thông tin chỉ thấy đ−ợc ở phía client. Nếu tại thời điểm nào đó của một kết nối đến trang Web của bạn, sessionID có thể thấy đ−ợc trên cookie hay URL, bạn có thể truy nhập những biến session chứ trên Server ở phiên làm việc đó. 2) Cookie là gì ? Cookie là những mẩu tin nhỏ mà trang script có thể chứa trên các máy khách (client). Bạn có thể thiết lập một cookie trên một máy ng−ời dùng bằng cách gửi một “HTTP header” có chứa dữ liệu theo dạng sau: Set-Cookie:Name=VALUE;[expires=DATE;][path=PATH;] [domain=DOMAIN_NAME;][secure] câu lệnh này sẽ tạo ra một cookie có tên gọi là NAME với giá trị là VALUE. Tr−ờng expires sẽ thiết lập ngày mà cookie sẽ hết hiệu lực, path và domain có thể đ−ợc sử dụng để chỉ định các URL (nơi mà cookie sẽ đ−ợc gửi đi). Từ 48
  49. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL khoá secure có nghĩa là cookie sẽ không gửi đi trên quá một kết nối HTTP chuẩn. Khi một browser kết nối tới một URL, trớc tiên nó kiểm tra các cookie đã đ−ợc l−u trữ trên máy. Nếu có bất kì một cookie nào có liên quan đến địa chỉ URL vừa đ−ợc kết nối, chúng sẽ đ−ợc truyền trở lại cho server. 3) Thiết lập các cookie từ PHP Ta có thể thiết lập các cookie trong PHP bằng cách sử dụng hàm: int setcookie (string name [,string value [,int expire [,string path [,string domain [, int secure]]]]]); Những tham đối của hàm t−ơng ứng với những tham đối của Set-Cookie header ở trên. Nếu ta thiết lập cookie nh− sau: setcookie ("TestCookie", "Test Value"); thì khi ng−ời dùng đến thăm trang kế tiếp trong site của ta (hoặc reload trang hiện tại) ta sẽ phải truy nhập vào biến với tên là "TestCookie" có chứa giá trị là "Test Value", ta chỉ có thể truy nhập tới nó thông qua biến mảng $HTTP_COOKIE_VARS [] của PHP . Ta có thể xoá một cookie bằng cách gọi lại hàm setcookie() với tham đối nh− sau: tên của cookie là tên của cookie cần xoá và không có tr−ờng giá trị. 4) Sử dụng kết hợp cookie với session Đối với cookie có một số vấn đề sau đây: Một vài webrowser không thể truy cập đ−ợc tới các cookie (không hỗ trợ cookie) và một số ng−ời dùng không có các cookie trên browser của họ. Đây là lý do để PHP sử dụng cả hai cách thức :cookie và URL method. Khi sử dụng PHP session, ta sẽ không phải thiết lập các cookie, những hàm session sẽ l−u giữ những thông tin này cho chúng ta. Để xem nội dung của các cookie đã đ−ợc thiết lập bởi session ta sử dụng hàm: session_get_cookie_params(). Hàm này sẽ trả về một mảng liên kết mà các phần tử của mảng chứa các thông tin nh−: lifetime, path, domain, . 49
  50. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Để thiết lập các tham số cho session cookie ta dùng hàm: void session_set_cookie_params (int lifetime [, string path [, string domain]]) 5) L−u giữ sessionID PHP sẽ sử dụng các cookie mặc định cùng với session. Nếu có thể đ−ợc, một cookie sẽ đ−ợc thiết lập chứa SessionID. Một cách để sử dụng các SessionID trên URL đó là dịch PHP cùng với lựa chọn –enable-tran-sid. Cách nữa là ta có thể đa sessionID vào trong thẻ link. SessionID đ−ợc chứa trong hằng SID. Để làm đ−ợc điều này, ta thêm vào cuối thẻ link hằng SID để dùng nó nh− là ph−ơng thức GET. Ví dụ: ”> Hằng SID làm việc đ−ợc nh− trên chỉ khi ta cấu hình PHP cùng với enable-track-vars. 6) Thực thi những phiên làm việc đơn giản. Những b−ớc cơ bản của việc sử dụng session: + Bắt đầu một Session + Đăng ký những biến Session + Sử dụng biến Session + Huỷ bỏ biến Session và kết thúc Session 6.1 Bắt đầu một Session Cách đơn giản nhất để bắt đầu một Session là dùng hàm: Bool Session_start(); Hàm này sẽ kiểm tra xem đã có một Session ID nào đã đ−ợc tạo ra hay ch−a. Nếu ch−a thì nó sẽ tạo ra một Session ID, còn nếu đã tồn tại một Session ID thì thực chất nó chỉ lấy ra những biến Session để ta có thể dùng nó. Hàm trả về giá trị TRUE nếu thành công ,ng−ợc lại trả về giá trị FALSE. 50
  51. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Chúng ta cũng có thể bắt đầu một Session bằng cách cấu hình PHP để nó tự động bắt đầu khi có ai đó thăm trang Web của ta. Điều này có thể làm đ−ợc nếu ta chọn session. auto_start trong file c:\Windows\php.ini Một Session cũng sẽ đ−ợc bắt đầu khi ta đăng ký một biến Session. 6.2 Đăng ký những biến Session Để cho một biến có thể l−u dấu thông tin từ một trang script này sang trang script khác, ta cần phải đăng ký nó bằng cách gọi hàm: bool session_register(mixed VarName [,mixed ]); Việc đăng ký này sẽ l−u trữ tên biến và ghi giá trị của biến cho đến khi phiên giao dịch kết thúc hoặc khi ta huỷ bỏ (deregister) việc đăng ký biến đó. Ví dụ: Để đăng ký biến $Var_name ta viết nh− sau: $Var_name= 5; session_register(“Var_name”);// không nên sử dụng ký tự $ trong đăng ký một biến 6.3 Sử dụng biến Session Để đa một biến Session vào trong phạm vi mà nó có thể đ−ợc sử dụng, ta cần phải khởi tạo một Session bằng một trong những cách đã nêu trên. Sau đó, ta có thể truy cập đ−ợc những biến này. Nếu đã đăng ký biến này là toàn cục bằng cách sử dụng hàm register_global(), thì ta có thể truy nhập biến bình th−ờng thông qua tên biến, ví dụ : $Var_name ; Nếu không khai báo biến là toàn cục thì ta phải truy nhập những biến Session thông qua mảng liên kết $HTTP_SESSION_VARS(“Var_name”); Để kiểm tra xem một biến đã đ−ợc đăng ký là biến Session hay ch−a ta dùng hàm: bool session_is_registered (string name); Hàm này trả về giá trị TRUE nếu biến đã đ−ợc đăng ký, ng−ợc lại trả về giá trị FALSE. Ta cũng có thể kiểm tra một biến có là biến Session bằng cách kiểm tra mảng liên kết $HTTP_SESSION_VARS() về sự tồn tại của biến. 51
  52. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL 6.4 Huỷ bỏ biến Session và kết thúc Session Khi muốn kết thúc một biến Session, ta có thể huỷ bỏ đăng ký của biến đó bằng hàm : bool session_unregister (string name) ; Trong đó: name là tên biến ta muốn huỷ đăng ký (tên này không cần có ký tự $) Hàm trả về giá trị TRUE nếu thành công ,ng−ợc lại trả về giá trị FALSE. Hàm này chỉ có thể huỷ đăng ký của một biến Session tại một thời điểm. Để huỷ tất cả các biến Session hiện tại, ta dùng hàm: void session _unset ( ) ; Để kết thúc một Session ta dùng hàm:s bool session_destroy () ; Hàm này sẽ xoá đi SessionID và hủy tất cả những dữ liệu liên quan đến Session này. Hàm trả về giá trị TRUE nếu thành công, ng−ợc lại trả về giá trị FALSE. Ta nên hủy tất cả các biến Session tr−ớc khi kết thúc một Session. 52
  53. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Ch−ơng III : Ph−ơng pháp Fast Template trong PHP I. Các kĩ thuật mẫu phổ biến Các mẫu có thể đ−ợc dùng nếu nh− bạn đang thực hiện một site th−ờng xuyên sử dụng lại các thành phần .Trong phạm vi của PHP ,các mẫu ở đây ý nói đến HTML. Không dùng các mẫu ,một web site phức tạp sẽ có cấu trúc rất nặng. Để giải quyết vấn đề trên ,nhiều kĩ thuật mẫu đã tồn tại, nhúng có thể hữu ích trong một số tr−ờng hợp. Chúng ta giới thiệu qua một số kĩ thuật đ−ợc sử dụng th−ờng xuyên . HTML Code/ structure Advantages Name HTML Disadvantages Useful for Defined mixed in PHP Leadsto unreadable Embedded Fastand scrips, noreuse of Quick and Yes Yes PHP easy existing code,hardto Smallscripts maintain Fast and Separating easy, Leadsto unreadable Web sites common Yes No scripts, often hard with LOC coding, easy 1000 to adapt to new needs 53
  54. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Việc sử dụng các mẫu trong các trình ứng dụng 1. Embedded PHP Chúng ta có thể nhúng các câu lệnh PHP vào trong HTML. Một ví dụ điển hình của cách thức trên : powers powers i i^i $i ”.pow($i,$i).” \n”; } ?> Ph−ơng pháp này đ−ợc dùng khá phổ biến với những ng−ời bắt đầu học lập trình PHP. Tới một lúc nào đó ,những ng−ời mới lập trình bằng ph−ơng pháp nhúng tiến tới sự thành thạo ở các mức cao hơn, nh−ng thật đáng tiếc, cách lập trình này lại ngăn cản điều đó . 2. Separating common parts 54
  55. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Mặc dù kĩ thuật này có sử dụng lại các mã code/HTML và việc thay đổi cũng dễ dàng hơn ,nh−ng nó vẫn thừa h−ởng hầu hết các nh−ợc điểm của ph−ơng pháp PHP nhúng . Cách làm thông th−ờng là bắt đầu với các HTML header và footer, chúng đ−ợc viết thành các hàm. Các hàm này có thể đ−ợc gọi khi cần đến chúng và do đó linh hoạt hơn khi sử dụng. Sự thay đổi các hàm sẽ đ−ợc phản ánh trong tất cả các tr−ờng hợp. Ta tách ví dụ PHP nhúng ở trên ra hai file . Tệp prepend.inc chứa hai hàm :hiển thị một HTML header và một HTML footer . \ Tệp main.php sử dụng tệp prepend.inc 55
  56. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL i i^i $i ”.pow($i,$i).” \n”; } ?> 3. FastTemplate Trong phần này chúng ta cùng tìm hiểu về ph−ơng pháp thiết kế Web trong PHP là FastTemplate. Đây là ph−ơng pháp hay, nó đ−ợc gắn kèm với các gói ứng dụng của PHP, nó đ−ợc xây dựng trong tệp tin có tên class. FastTemplate.php . Mục đích của ph−ơng pháp này là giúp cho ch−ơng trình viết bằng PHP có nhiều giao diện khác nhau trên cùng một cơ sở mã, và làm giảm khối l−ợng công việc do ch−ơng trình đ−ợc tách ra làm hai phần : phần viết các đoạn mã (code) và phần thiết kế giao diện cho ch−ơng trình. Phần viết các đoạn mã sẽ tính toán dữ liệu và thể hiện trên các trang HTML thông qua các biến FastTemplate. Phần giao diện sẽ thiết kế giao diện cho ch−ơng trình bằng ngôn ngữ HTML. Trong phần này chúng ta có thể lồng vào trang HTML các ngôn ngữ nh− Java Applet, JavaScript, cho trang web thêm sinh động. Việc thêm vào trang HTML những đoạn mã này không làm ảnh h−ởng tới phần đoạn mã PHP. Khi đó, ở vị trí nào trên trang web cần thể hiện các kết quả tính toán từ đoạn mã thì sẽ sử dụng các biến FastTemplate để thể hiện. 56
  57. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL II. Ph−ơng pháp FastTemplate 1. Biến FastTemplate Biến FastTemplate là gì ? Các biến FastTemplate có cấu trúc nh− sau : {TEN_BIEN_FASTTEMPLATE} Biến đ−ợc đặt trong dấu đóng mở ngoặc nhọn, tên biến ở giữa, tên có thể là chữ hoa hoặc chữ th−ờng. Tuy nhiên trong phần đoạn mã PHP bạn cũng phải viết giống nh− vậy. 2. Vị trí đặt biến FastTemplate Các biến FastTemplatse có thể đặt bất kỳ đâu trong trang HTML. Nó có thể là biến thể hiện thông tin trên các trang HTML khi đ−ợc browser hiển thị hoặc các biến sẽ thêm vào các đoạn mã HTML . Ví dụ : ta đặt tên tệp là : vidu_template.tpl {TITLE} {CONTENT} Trong ví dụ trên có hai biến FastTemplate là {TITLE} và {CONTENT}. Biến {CONTENT} sẽ thể hiện thông tin trên trang web khi đ−ợc hiển thị, biến {TITLE} đ−ợc thêm vào nh− một thành phần của mã HTML . 3. Một ví dụ minh họa Theo ví dụ trên chúng ta đã có tệp “vidu_template.tpl”, bây giờ chúng ta đi xây dựng đoạn script sau : 57
  58. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL set_filenames(array(“body” => “vidu_template.tpl ”)); # Gán các giá trị cho biến FastTemplate $tpl->assign_vars(array( “TITLE” => “Vi du”, “CONTENT” => “Nội dung của trang web” )); # Cho hiện trang web này $tpl->pparse(“body”); ?> 4. Bốn b−ớc cho một trang web . Trong một script cần thực hiện bốn bớc theo thứ tự sau : B−ớc 1 : Khai báo một đối t−ợng thuộc lớp FastTemplate B−ớc 2 : Gán các tệp chứa mã HTML (tệp này có phần mở rộng không nhất thiết là *.htm) cho các phần tử của mảng đ−ợc định nghĩa bởi ph−ơng thức set_filenames() ( b−ớc này đ−ợc gọi là “định nghĩa một bản đồ các tệp FastTemplate” ) . B−ớc 3 : Gán giá trị cho các biến FastTemplate trong các tệp . B−ớc 4 : Cho hiện trang web bằng ph−ơng thức pparse(“tên_trang_web”) Chú ý : + B−ớc 2: Trong “định nghĩa một bản đồ các tệp FastTemplate” có thể nhiều tệp đ−ợc gán . + B−ớc 4: Mỗi lần gọi ph−ơng thức pparse(); chỉ đ−ợc một tệp FastTemplate. 58
  59. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL + Các b−ớc 1,2,3,4 có thể lặp lại nhiều lần . + Thứ tự gọi ph−ơng thức pparse(); là rất quan trọng vì nó ảnh h−ởng đến cách thể hiện của trang web. 5. Khối FastTemplate Thông tin trên trang web có thể đ−ợc thể hiện d−ới dạng bảng, với số hàng không xác định do đó FastTemplate có hỗ trợ “khối FastTemplate”. Khối FastTemplate sẽ lặp đi lặp lại một đoạn HTML nào đó khi đ−ợc đánh dấu khối. Xét ví dụ sau : Hãy thực hiện phép tính 2a với a = 1, , n. Kết quả đ−ợc thể hiện bởi một bảng gồm hai cột, cột giá trị của a và cột kết quả của phép tính 2a. Chúng ta tạo tệp “tinh_2_mu.htm” Tinh 2 mu a Gia tri a Tinh 2ê {block.GIATRI} {block.KETQUA} 59
  60. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Ta thấy tệp này tạo một bảng hai hàng hai cột, hàng trên là tiêu đề của các cột, hàng d−ới cột thứ nhất là giá trị của a và cột thứ hai là kết quả của phép tính 2a. Hàng d−ới đ−ợc bắt đầu bởi khoá và kết thúc bởi khoá . Hai khoá này cho biết phần bên trong sẽ bị lặp (block ở đây là tên khoá), các biến FastTemplate bên trong có dạng {tenkhoa.TEN_BEN}. Đoạn PHP Script sẽ nh− sau : set_filenames(array( 'tinh_2_mu_a' => 'tinh_2_mu.htm' )); $n = 10; for ($i = 1 ; $i assign_block_vars("block",array( 'GIATRI' => $i, 'KETQUA' => pow(2, $i) )); $tpl->pparse("tinh_2_mu_a"); ?> Kết quả khi chạy ch−ơng trình nh− hình vẽ. 60
  61. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Phần II : Hệ CƠ Sở Dữ LIệU MYSQL Ch−ơng I. Giới thiệu Ngôn ngữ MySQL I. Giới thiệu chung MySQL rất phức tạp, nh−ng giao diện SQL trực giác và dể học. Trong ch−ơng này chúng ta mô tả khái quát về các lệnh, các kiểu dữ liệu và các hàm mà chúng ta cần biến để sử dụng Mysql một cách có hiệu quả và có hiệu suất cao. Ch−ơng này cung cấp tất cả các hàm tham khảo trong Mysql. Để sử dụng ch−ơng này có hiệu quả bạn có thể tìm đến hàng loạt các bảng đã đ−ợc liệt kê. Các −u điểm của MySQL: • MySQL là một hệ quản trị nhỏ, bảo mật, và rất dễ sử dụng, th−ờng đ−ợc sử dụng cho các ứng dụng nhỏ và trung bình. Nó đ−ợc sử dụng cho các ứng dụng client / server với máy chủ mạnh nh− UNIX, Windows NT và Windows 95/98, và đặc biệt trên máy chủ UNIX . • MySQL hỗ trợ các điểm vào là ANSI SQL92 và ODBC mức 0-2 SQL chuẩn. • MySQL hỗ trợ nhiều ngôn ngữ cho việc thông báo lỗi nh− : Czec, Dutc, English, Estonian, French, German, Hungarian, Italian, Norwegian Nynorsk, Polish, Portuguese, Spanish and Swedish. Ngôn ngữ đ−ợc hỗ trợ mặc định cho dữ liệu là ISO-8859-1 (Latin1), muốn thay đổi phải sửa trong mã nguồn . • Ngôn ngữ lập trình sử dụng viết các hàm API để thâm nhập cơ sở dữ liệu MySQL có thể là C, Perl, PHP . • Các bảng (table) trong cơ sở dữ liệu MySQL có kích th−ớc rất lớn và đ−ợc l−u ở th− mục Datas. Kích th−ớc lớn nhất của một bảng tối thiểu là 4GB và nó còn phụ thuộc và kích th−ớc lớn nhất của một file do hệ điều hành quy định . 61
  62. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL • Cơ sở dữ liệu MySQL rất dễ quản lý và có tốc độ xử lý cao hơn tới ba bốn lần so với các hệ quản trị cơ sở dữ liệu khác. • MySQL là một hệ quản trị cơ sở dữ liệu mô hình quan hệ, nó có mã nguồn mở. Nó đ−ợc cung cấp miễn phí trên các máy chủ UNIX, OS/2 và cả trên Windows. Bên cạnh các −u điểm trên MySQL cũng có một vài nh−ợc điểm : • MySQl không cho phép thực hiện các câu lệnh SQL select truy vấn con. Ví dụ : SELECT deptno, ename, sal FROM emp x WHERE sal > (SELECT AVG(sal) FROM emp WHERE x.deptno = deptno) ORDER BY deptno • MySQL không hỗ trợ Stored Procedures, Triggers, Transactions, Foreign Keys, và Views nh− các hệ quản trị cơ sở dữ liệu khác . II .Cấu trúc ngôn ngữ 1. Đ−a ra một xâu và một số nh− thế nào Mục này mô tả những cách khác nhau để đ−a ra xâu và số trong Mysql. mục này cũng bao gồm nhiều sắc thái và ``gotchas'' điều mà bạn có thể gặp khi đi sâu vào các kiểu cơ bản trong Mysql. 2. Xâu Xâu là một dãy kí tự, đ−ợc đặt trong dấu nháy đơn ‘ ’ hoặc dấu nháy kép “ ” (nếu chạy trong ph−ơng thức ANSI thì xâu chỉ đ−ợc đặt trong dấu nháy đơn) Ví dụ: ‘trời nắng’. “chào buổi sáng”. Trong một xâu, có sự kết hợp của các kí tự tạo nên các kí tự đặc biệt. Mỗi kí tự đặc biệt này bắt đầu bằng dấu chéo ng−ợc ( \ ) đ−ợc xem nh− kí tự escape . Mysql nhận biết các kí tự đặc biệt sau: \ 0 : kí tự 0 trong mã ASCII. \’ : Kí tự nháy đơn ‘. 62
  63. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL \” : Kí tự nháy kép “. \ b : Kí tự Backspace. \n : Kí tự xuống dòng mới. \r : Kí tự về đầu dòng . \t : Nhẩy ô (tab). \z : Kí tự 26 trong mã ASCII. Kí tự này có thể đ−ợc mã hoá để đứng ở cuối file trong Windows. \\ : Kí tự chéo ng−ợc \ . \% : Kí tự % . \ _ : Kí tự gạch d−ới _ . chú ý : nếu nh− sử dụng kí tự ‘\%’ hoặc kí tự gạch d−ới ‘\ _’ trong một số tr−ờng hợp có thể trả về \% và \ _ chứ không phải là % và _ . * có một số cách để xâu gồm cả dấu nháy : - để một dấu nháy đơn ( ‘ ) nằm trong một xâu đ−ợc đánh dấu bởi dấu nháy đơn thì phải viết là: ‘ ‘ ’ ’ . - để một dấu nháy kép ( “ ) nằm trong một xâu đ−ợc đánh dấu bởi dấu nháy đơn thì phải viết là: ‘ “ ” ’ . - có thể đặt kí tự (‘\’) tr−ớc kí tự đánh dấu . - một dấu nháy đơn trong cặp dấu nháy kép đ−a ra xâu chứa dấu nháy đơn, một dấu nháy kép trong cặp dấu nháy đơn đ−a ra xâu chứa dấu nháy kép. - Ví dụ : mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo','\'hello'; | hello | "hello" | ""hello"" | hel'lo | 'hello | mysql> SELECT "hello", "'hello'", "''hello''", "hel""lo", "\"hello"; | hello | 'hello' | ''hello'' | hel"lo | "hello | mysql> SELECT "This\nIs\nFour\nlines"; | This Is Four lines | 63
  64. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL nếu bạn muốn chèn dữ liệu nhị phân vào trong cột BLOB. Những kí tự sau phải đ−ợc thể hiện d−ới dạng những kí tự đặc biệt : - NUL : ASCII 0. phải đ−ợc thể hiện ‘ \ 0 ’ . - \ : ASCII 92. dấu gạch ng−ợc phải đ−ợc thể hiện ‘ \\ ’ . - ’ :ASCII 39. dấu nháy đơn phải đựơc thể hiện ‘ \’ ’ . - ” : ASCII 34. dấu nháy kép phải đ−ợc thể hiện ‘ \” ’. - nếu biết mã C, có thể sử dụng hàm CAPI là Mysql-escape-string() để ESC kí tự bằng câu lệnh INSERT. - Nên sử dụng hàm ESC đối với những xâu chứa kí tự đặc biệt đ−ợc liệt kê ở trên. 3. Số (Numbers) Sô bao gồm số nguyên và số thực . Số nguyên đ−ợc biểu diễn bằng một dãy số. Còn số thực sử dụng dấu chấm để phân cách phần thập phân . Dấu gạch d−ới đựơc đặt tr−ớc số để chỉ số âm. Ví dụ: 1221 0 32 Ví dụ cho số thực: 94.42 32032.6809e10 48.00 chú ý : số nguyên đ−ợc sử dụng trong ngữ cảnh số thực đ−ợc chuyển thành số thực có giá trị ngang bằng ví dụ : float 0 0.0 float 56 -> 56.0 Những giá trị hệ Hexa (hệ 16) Mysql hỗ trợ các giá trị hệ Hexa. Trong ngữ cảnh số thì chúng giống nh− một số nguyên. Trong ngữ cảnh xâu thì chúng giống nh− một xâu nhị phân mà mỗi cặp số nguyên Hexa đ−ợc chuyển thành một kí tự . Ví dụ: mysql> SELECT x'FF' -> 255 mysql> SELECT 0xa0; -> 10 mysql> select 0x5061756c; -> Paul 64
  65. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL ở ví dụ trên khi viết một số d−ới dạng Hexa bạn phải điền vào vào tr−ớc số đó chuỗi ‘x’ hoặc ‘0x’. Cú pháp x ‘xâu Hexa’ dựa trên ANSISQL, và cú pháp 0x dựa trên ODBC. Xâu hệ Hexa th−ờng sử dụng ODBC để đ−a giá trị cho cột BLOB Có thể chuyển một xâu hoặc số thành hệ Hexa bằng hàm HEX(). 4. Giá trị NULL Giá trị NULL có nghĩa là “không có dữ liệu”(“no data”) khác với giá trị 0 đối với kiểu số và xâu rỗng đối với kiểu xâu . Trong khuôn dạng xuất hoặc nhập File dữ liệu NULL có thể đ−ợc thể hiện bằng ‘\N’ (nh− LOAD DATA INFILE, SELECT INTO OUTFILE). 5. Tên của Cơ sở dữ liệu, bảng, chỉ số cột và bí danh Tên của cơ sở dữ liệu, bảng, chỉ số cột và bí danh tất cả đều tuân theo một qui luật chung trong Mysql. Nh−ng chú ý rằng qui luật này đã đ−ợc thay đổi bắt đầu với Mysql Version 3.23.6 khi chúng ta d−a vào lời chú thích cho việc nhận biết cơ sở dữ liệu, bảng và tên cột với dấu ‘ ‘ ’ ’ .’ ” ’sẽ làm việc nhận ra lời chú thích nếu bạn chạy trong chế độ ANSI . Định danh Độ dài Các kí tự cho phép (Identifier) Database 64 Tất cả các kí tự cho phép trong th− mục (cơ sở dữliệu) ngoại trừ ‘/’ và ‘.’ Table 64 Tất cả các kí tự cho phép với tên File ngoại (Bảng) trừ ‘/’ và ‘.’ Column 64 Cho phép tất cả các kí tự (Cột) Alias 256 Cho phép tất cả các kí tự (Bídanh) Chú ý: ở bảng trên định danh không thể có kí tự đánh dấu, ASCII(0) hoặc ASCII(255) . Nếu định danh là một từ bị hạn chế hoặc trong đó có chứa các kí tự đặc biệt thì bạn phải sử dụng dấu nháy đơn để chú thích khi sử dụng chúng . Ví dụ: SELECT * from `select` where `select`.id > 100; Trong phiên bản tr−ớc của Mysql, luật đặt tên nh− sau : 65
  66. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL - Một tên gồm các kí tự trong bảng mã, cũng cho phép kí tự gạch d−ới ‘_’ và ‘$’. - Tên có thể bắt đầu bởi tất cả các kí tự hợp pháp, trong thực tế tên có thể bắt đầu bằng một số (điều này khác nhiều với hệ cơ sở dữ liệu )tuy nhiên tên không chỉ gồm một số . - Không đ−ợc sử dụng kí tự ‘.’ Trong tên bởi vì kí tự đó đ−ợc sử dụng để mở rộng khuôn dạng để truy nhập đến cột (xem ở bảng d−ới đây). Chúng ta không nên dùng những tên nh− 1e bởi vì một biểu thức nh− 1e1thì rất mơ hồ, nó có thể đ−ợc biên dịch là một biểu thức 1e1 hoặc là số 1e1. Trong Mysql ta có thể liên hệ tới một cột bằng việc sử dụng những cách sau: Cột tham chiếu ý nghĩa Col_name Cột col_name từ bảng sử dụng trong câu truy vấn chứa cột với tên này. Tbl_name.col_name Cột col_name từ bảng tbl_name của cơ sở dữ liệu hiện thời . Db_name.tbl_name. Cột col_name từ bảng tbl_name của cơ sở dữ liệu col_name Db_name. ‘column_name’ Một cột có chứa kí tự đặc biệt hoặc từ khoá Bạn cần phải chỉ rõ tbl_name hoặc db_name.tbl_name đối với những cột có cùng tên trong nhiều bảng của cơ sở dữ liệu, hoặc bảng có cùng tên trong các cơ sở dữ liệu khác nhau để tránh sự nhập nhằng . Ví dụ : giả sử mỗi bảng T1 ,T2 chứ một cột C bạn có thể lấy C trong một lệnh SELECT sử dụng cả T1 và T2. Trong tr−ờng hợp này C nhập nhằng bởi vì nó không duy nhất giữa các bảng đ−ợc sử dụng trong câu lệnh. Bạn phải chỉ ra tên bảng bằng cách viết T1.C hoặc T2.C. t−ơng tự nếu bạn lấy từ một bảng T trong cơ sở dữ liệu DB1 và từ bảng T trong cơ sở dữ liệu DB2, bạn phải tham chiếu đến cột trong những bảng đó nh− sau : DB1.T.col_name và DB2.T.col_name. Cú pháp .Tbl_name có nghĩa là bảng Tbl_name nằm trong cơ sở dữ liệu hiện thời .cú pháp này đ−ợc chấp nhận cho t−ơng thích ODBC bởi vì một số ch−ơng trình ODBC thêm vào đầu tên bảng một dấu chấm ‘.’ 6. Phân biệt chữ hoa và chữ th−ờng đối với tên trong Mysql : 66
  67. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Trong Mysql tên cơ sở dữ liệu, bảng trong Windows thì không phân biệt chữ hoa và chữ th−ờng, còn trong Unix thì có phân biệt chữ hoa và chữ th−ờng . Chú ý : mặc dù trong windows không phân biệt chữ hoa và chữ th−ờng, bạn cũng không nên dùng tên cơ sở dữ liệu, bảng với các tr−ờng hợp khác nhau trong cùng một câu truy vấn . Ví dụ : mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1; câu lệnh trên sẽ không thực hiện đ−ợc . Tên cột không phân biệt chữ hoa và chữ th−ờng trong tất cả các tr−ờng hợp . Bí danh trên bảng phân biệt chữ hoa và chữ th−ờng Ví dụ: mysql> SELECT col_name FROM tbl_name AS a WHERE a.col_name = 1 OR A.col_name = 2; Câu lệnh trên sẽ không thực hiện đ−ợc vì bí danh phân biệt ‘a’ và ‘A’ Bí danh trên cột sẽ không phân biệt chữ hoa và chữ th−ờng. Nếu bạn muốn truy vấn thực hiện đ−ợc trên bảng thì chấp nhận một qui −ớc luôn luôn tạo ra tên cơ sở dữ liệu và tên bảng sử dụng chữ th−ờng. Một cách tránh vấn đề này là sẽ bắt đầu mysql với -0 lower_case_table_names = 1, Theo mặc định tùy chọn này là 1 trên Windows và 0 trên Unix. Nếu lower_case_table_names là 1 MySQL sẽ chuyển đổi tất cả các tên bảng về chữ th−ờng ,Chú ý rằng nếu bạn thay đổi tùy chọn này, bạn cần tr−ớc hết chuyển đổi những tên bảng cũ của bạn về chữ th−ờng tr−ớc khi bắt đầu mysql. 7. Biến ng−ời sử dụng Mysql hổ trợ các biến riêng cùng với cú pháp @variable name. Tên biến bao gồm kí tự anpha t− tập các kí tự và thêm vao kí tự ‘_’, ’$’, và ‘.’ Biến không phải khởi tạo, NULL không xuất hiện trong biến, biến có thể chứa số nguyên thực hoặc giá trị xâu. Tất cả các biến sẽ tự giải phóng vùng nhớ khi chúng thoát ra. Bạn có thể gán biểu thức vào biến theo cú pháp : @variable:=expr Ví dụ: select @t1:=(@t2:=1)@t3:=4,@t1,@t2,@t3; | @t1:=(@t2:=1)@t3:=4 | @t1 | @t2 | @t3 | | 5 | 5 | 1 | 4 | chúng ta phải sử dụng cú pháp:= để gán biến, bởi vì dấu bằng (= ) đ−ợc sử dụng để so sánh . 67
  68. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL biến có thể đ−ợc sử dụng trong một biểu thức l−u ý rằng điều này không đ−ợc sử dụng trong ngữ cảnh một số đ−ợc yêu cầu rõ ràng nh− trong mệnh đề LIMIT của lệnh select hoặc mệnh đề IGNORE number LINES của lệnh LOAD DATA . chú ý : trong lệnh SELECT mỗi biểu thức chỉ nhận một giá trị khi nó đ−ợc gửi cho ng−ời dùng. Điều này cũng đúng trong mệnh đề HAVING, GROUP BY, ORDER BY. Bạn không thể tham chiếu tới một biểu thức gồm tập hợp các biến trong SELECT. Ví dụ: SELECT (@aa:=id) AS a, (@aa3) AS b FROM table_name HAVING b=5; Câu lệnh trên không thực hiện đ−ợcbởi vì @aa sẽ không chứa giá trị ở hàng hiện tại trừ phi gí trị của id thay cho cột đã đ−ợc chấp nhạn tr−ớc . 8. Các dòng chú thích Mysql cho phép chèn các câu chú thích vào trong kịch bản của Mysql, khi thực hiện trình thông dịch sẽ bỏ qua tất cả các đoạn văn bản là câu chú thích Trong Mysql chú thích đ−ợc đặt sau dấu : # dòng chú thích dòng chú thích cách viết này chỉ có tác dụng trên một dòng . dùng cặp kí hiệu sau : /* */ để chèn các câu chú thích, loại chú thích này đ−ợc gọi là chú thích khối . ví dụ: mysql> select 11; # chú thích trên một dòng mysql> select 11; chú thích trên một dòng mysql> select 1 /* chú thích khối*/ 1; mysql> select 1 /* chú thích trên nhiều dòng chú thích khối */ 1; l−u ý rằng chú thích – yêu cầu bạn phải có ít nhất một dấu cách sau ! Mặc dù vậy có vài hạn chế trong cách ghi chú \* *\ đó là: - kí tự nháy đơn và nháy đôi dùng để chỉ sự bắt đầu của một xâu thậm chí sử dụng bên trong một chú thích nếu trong chú thích dấu nháy thứ nhất không phù hợp với dấu nháy thứ hai thì hệ phân tích sẽ không nhận ra điểm kết thúc của ghi chú. - dấu chấm phẩy ( ; ) đ−ợc dùng để báo kết thúc của một câu lệnh Mysql và sau dấu ( ; ) là sự bắt đầu của câu lệnh tiếp theo. 68
  69. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Ch−ơng II. Các thành phần của My SQL Trong phần này chúng ta giới thiệu khái quát về các kiểu dữ liệu của các tr−ờng va các thuộc tính về kiểu trong mỗi loại dữ liệu.Sau đó là một số kiểu bảng trong MySQL và cuối cùng là một số hàm cơ bản đ−ợc cung cấp bởi MySQL. I. Các kiểu dữ liệu Trong MySQL có các kiểu dữ liệu sau: Kiểu số Kiểu kí tự (char,varchar,Blob,Text,Enum,Set) Kiểu xâu. Kiểu ngày giờ (Datetime,Date,TimeStamp,Time,year) 1. Kiểu số Kiểu tinyint: Khai báo TINYINT[Cm] [UNSGNED] [ZEROFIU].Đây là kiểu số nguyên với giá trị rất nhỏ: -Nếu khai báo với từ khoá nusigned thì giá trị mà cột có kiểu này có thể nằm trong khoảng 0 đến 255. -Nếu không có từ khóa nusiged thì giá trị trong khoảng –128 đến 127 Kiểu Smallint Khai báo:Smallint [Cm] [nusiged] [zerofill].Đây là kiểu số nguyên có giá trị nhỏ: -Nếu là số có dấu thì giá trị nằm trong khoảng-32768 đến 32767 -Nếu là số không dấu thì giá trị trong khoảng 0 đến 65536. Kiểu Mediumint Khai báo :Mediumint [cm] [nusiged] [zerofill] [(m)] -Nếucó dấu thì giá trị nằm trong khoảng –8388608 đến 8388607. -Nếu là số có dấu thì giá trị nằm trong khoảng 0 đến 16777215. Kiểu Int: Khai báo:Int:[Cm] [nusiged] [zerofill] -Với số có dấu giá trị trong khoảng –2147483648 đến 2147483647 -Với số không dấu giá trị trong khoảng 0 đến 429467295 Kiểu Interger Khai báo:interger [Cm] [nusiged] [zerofill].T−ơng tự kiểu INT. 69
  70. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Kiểu Bigint Khai báo :Bigint [Cm] [nusiged] [zerofill].Đây là kiểu nguyên mà giá trị là rất lớn. -Với số có dấu giá trị trong khoảng –9223372036854775808 đến 9223372036854775807. -Với số không dấu giá trị trong khoảng 0 đến 18446744073709551615 Note:tất cả các phép toán số học sử dụng số có dấu bigint hoặc double, vì vậy không sử dụng số không dấu ,mà giá trị v−ợt quá số nguyên lớn tức là nếu nhân hai số nguyên lớn thì giá trị trả về sẽ v−ợt quá số nguyên lớn có dấu. Kiểu float: Khai báo:float (precision)[zerofill].Đối với số thực độ chính xác đơn thì độ chính xác <24.Đối với số thực độ chính xác kép thì độ chính xác <255.Float(x) giống kiểu double,float nh−ng cỡ và số chữ số phần thập phân ch−a đ−ợc định nghĩa Precision:số chữ số phần thập phân mà float có thể nhận.Float [Cm,d] [zerofill]:đây là số thực với độ chính xác kép với m hiển thị độ rộng,d là số các chữ số phần thập phân. Nếu dùng float không có đối hoặc đối <=24,thì t−ơng ứng dùng số thực có độ chính xác đơn. Double [(Cm,d)] [zerofill]:số thực với độ chính xác kép với m là độ rộng, d là số chữ số phần thập phân.Nừu dùng double không đối hoặcdùng float(x) với 25<=x<=53 thay cho một số thực độ chính xác kép. Double precision [(Cm,d)][zerofill] Real [(Cm,d)][zerofill] .t−ơng tự nh− số double. Decimal [(Cm,d)][zerofill] đ−ợc coi nh− một kiểu char,đ−ợc l−u trữ nh− một xâu mỗi kí tự là một kí số của giá trị cần l−u trữ. Nuneric [(Cm,d)][zerofill] t−ơng tự decimal. 2.Kiểu ngày giờ 2.1 Datime, Date, TimeStamp. Các kiểu Datime, Data, TimeStamp có những đặc tr−ng riêng nh−ng cũng có mối liên quan. Có một số Y2K chúng ta đã từng biến đổi với các kiểu thời gian không gian rõ ràng trên MySQL đã giải thích các ngày cùng với giá trị năm mập mờ theo quy luật sau: -Giá trị năm trong khoảng 70-69 đ−ợc chuyển sang năm 2000- 70
  71. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL 2069 -Giá trị năm trong khoảng 70-99 đ−ợc chuyển sang năm 1970- 1999. Đó là vì giá trị năm ta chỉ để hai chữ số, còn hai số tr−ớc mặc định là năm 1900.Để làm cho không nhầm lẫn năm thì phảI cung cấp giá trị năm là bốn số.MySQL đã làm điều này. Kiểu datetime: Đây là kiểu ngày giờ đ−ợc dùng khi bạn cần l−u trữ thông tin cả về ngày tháng và thời gian.Giá trị của nó nằm trong khoảng 1000-01-10:00:00 đến ‘9999-12-3123:59:59’ MySQL hiển thị datatime theo định dạng: “yyyy-mm-dd hh:mm:ss” nh−ng nó cũng cho phép ấn định giá trị cho kiểu này bằng dạng số hoặc xâu. Kiểu Date đ−ợc dùng khi bạn chỉ cần l−u trữ giá trị ngày tháng. MySQL truy xuất và hiển thị giá trị DATE với định dạng “yyyy- mm-dd” Giá trị trong khoảng ‘1000-01-01’ đến ‘9999-12-31’có thể ấn đinh bằng số hoặc xâu. Kiểu TIMESTAMP [Cm] Cung cấp 1 kiểu mà bạn có thể dùng để đánh dấu một cách tự động đối với phép INSERT hoặc UPDATE cùng với ngày giờ hiện tại.Nếu có nhiều cột TIMESTAMP thì chỉ cột đầu tiên đ−ợc cập nhật một cách tự động. Để cập nhật vào cột đầu nh− vậy cũng phải thoả mãn các điều kiện sau: -Cột mà chứa đ−ợc xác định chi tiết trong mệnh đề INSERT hoặcLOADDATAINFILE -Cột mà không xác định chi tiết trong lệnh UPDATE và một số cột khác đã thay đổi giá trị -Bạn đặt chi tiết cột TIMESTAMP là ngày giờ hiện tại bằng cách ấn định giá trị NULL Các cột khác có thể đ−ợc đặt thời gian và ngày tháng hiện tại.Chỉ cà với cột giá trị NULL hoặc NOW.Giá trị của TIMESTAMP là từ 1970- 01-01:00:00:00.Đến năm 2037 thì MySQL hiển thị TIMESTAMP theo định dạng ‘yyyy mm dd hh mm ss’ ‘yyyy mm dd hh mm ss’.MySQL cũng cho phép sử dụng bằng xâu hoặc số. Kiểu TIME MySQL định dạng giá trị thời gian là ‘hh:mm:ss’ hoặc HHH:MM:SS Nguyên nhân mà phần giờ có thể lớn hơn tại vì kiểu TIME không chỉ biểu diễn thời gian trong 1ngày (giờ phải 24 hoặc thậm chí là âm).Giá trị của 71
  72. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL nó trong khoảng ‘-838:59:59’ tới ‘838:59:59’ Kiểu YEAR Có thể định dạng bởi hai hoặc bốn chữ số, giá trị nằm trong khoảng 1901 đến 2155 với bốn chữ số. Với hai số thì mặc định từ 00-69 là 2000-2069 ,70 đến 99 là 1970- 1999 3.Kiểu kí tự (String) Kiểu char: Độ dài cột char là cố định khi bạn tạo bảng. Giá trị độ dài trong khoảng 0-255 nếu số kí tự điền vào nhỏ hơn độ dài quy định thì nó sẽ tự động điền vào kí tự trống. Trong MySQL kiểu char cho phép bạn tạo một cột có dạng char(0),điều này cũng thuận tiện trong tr−ờng hợp bạn phải tuân theo với số phần mềm cũ nó phụ thuộc và sự tồn tại của một cột mà không thực sự cần sử dụng giá trị. Cũng tốt trong tr−ờng hợp bạn cần định nghĩa một cột sao cho nó có thể nhận hai giá trị một cột khai báo char(0) nó có thể chiếm một bit và có thể nhận hai giá trị NULL hoặc “ ” Kiểu Varchar [national] varchar(m)[binary]. Đây là cột đ−ợc khai báo với một xâu có độ dài không cố định những kí tự trống sẽ đ−ợc huỷ khi l−u trữ giá trị, m nằm trong khoảng 1-255. Storage Storage value Char(4) require Varchar require d d ’ ‘ ‘ ’ 4bytes ‘ ’ 1bytes ‘ab’ ‘ab’ 4bytes ‘ab’ 3bytes ‘abcd’ ‘abcd’ 4bytes ‘abcd’ 5bytes ‘abcdefgh’ ‘abcd’ 4bytes ‘abcd’ 5bytes Kiểu Blob và TEXT -BLOB là đối t−ợng nhị phân lớn có thể chứa l−ợng rất lớn các dữ liệu với 4 kiểu BLOB:TINYBLOB, BLOB, MEDIUMBLOB và LONGBLOB.Có 4 kiểu TEXT là TINYTEXT,TEXT, MEDIUMTEXT, và LONGTEXT TINYBLOB,TINYTEXT:có độ rộng tối đa là255 Blob và Text độ dài tối đa là 65535 kí tự. Mediumblob,mediumtext:độ dài tối đa 16777125 kí tự. Longblob,longtext: độ dài tối đa 424967295 kí tự. 72
  73. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Chú ý: Mô hình client/server giới hạn bởi 16Mb. Một gói giao tiếp trên một hàng nên không thể sử dụng toàn bộ phạm vi của kiểu này. Kiểu ENUM(value1,value2, )(kiểu liệt kê). Một đối t−ợng xâu chỉ có thể có 1 giá trị chọn từ một danh sách các giá trị ‘’value1”,”value2”, null hoặc kí tự đặc biệt. Một kiểu liệt kê có giá trị lớn nhất là 65535 giá trị. Kiểu tập hợp set(value1,value2, ) một đối t−ợng xâu có thể nhận 0 hoặc nhiều hơn mỗi loại có thể chọn từ danh sách các giá trị :”value1”,”value2”, Một tập hợp có tối đa 64 thành phần. Giá trị null nghĩa là không có dữ liệu,nó khác giá trị 0 và xâu rỗng. Giá trị null có thể đ−ợc kí hiệu bởi \n cho việc truy xuất file dạng text. 4 .Cột chỉ số. Tất cả các kiểu cột của MySQL có thể đ−ợc chỉ số hoá .Việc dùng chỉ số hoá trên các cột có liên quan với nhau là cách tốt nhất để cải tiến việc thực hiện của câu lệnh Select. Một bảng có thể có tới 16 cột chỉ số, độ dài chỉ số tối đa là 256 bytes ,mặc dù có thể thay đổi khi biên dịch MySQL. Đối với cột kiểu char và varchar bạn có thể chỉ số hoá phần đầu của cột.Nh− vậy sẽ nhanh hơn và cần ít không gian đĩa hơn là chỉ số hoá trong cả cột.Cú pháp dùng trong mệnh đề CREATE TABLE nh− sau: KEY index_name(colname(length)). Ví dụ sau sẽ tạo một chỉ số hoá cho 10 kí tự đầu của cột tên: MySQL>CREATE TABLE test( Name char(200)not NULL KEY index_name(name(10))) Đối với cột kiểu BLOB và TEXT, bạn phải chỉ số hoá một phần đầu của cột, không thể chỉ số hoá cả cột đ−ợc. Tạo chỉ số trên nhiều cột. MySQL có thể tạo chỉ số trên nhiều cột. Một việc chỉ số hoá có thể lên tới 15 cột(trên cột char và varchar bạn có thể chỉ số hoá phần đầu của cột nh− một phần của việc chỉ số hoá). Việc chỉ số hoá nhiều cột đ−ợc xem nh− một mảng đ−ợc sắp xếp mà chứa các giá trị đ−ợc tạo bởi việc kết nối các giá trị giữa các cột đ−ợc chỉ số hoá . Mysql sử dụng chỉ số hoá nhiều cột nh− là cách để truy vấn nhanh hơn khi bạn đã xác định đ−ợc số l−ợng lớn thông tin của cột đầu tiên của sắp xếp trong một câu lệnh WHERE, thậm chí nếu bạn 73
  74. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL không xác định giá trị đối với các cột khác thì thông tin lấy đ−ợc vẫn chính xác . Ví dụ : Mysql> CREATE TABLE test( Id int NOT NULL, Last_name char(30)NOT NULL, First_name char(30)NOT NULL, PRIMARY KEY(id), INDEX name(Last_name, First_name); Khi đó tên sẽ đ−ợc chỉ số thông qua 2 cột Last_name, First_name. Việc chỉ số sẽ đ−ợc áp dụng cho việc truy vấn đến các giá trị cụ thể đó trong phạm vi của cột last_name hoặc cả Last_name và First_name. Do đó, cột tên sẽ đ−ợc dùng trong truy vấn d−ới đây: Mysql>SELECT* FROM test WHERE last_name=”Lan”; Mysql>SELECT* FROM test WHERE last_name=”Lan” AND first_name=”Nguyễn”; Mysql>SELECT* FROM test WHERE last_name=”Lan” AND(first_name=”Nguyễn”)OR(first_name=”Lê”) Mysql>SELECT* FROM test WHERE last_name=”Lan”; AND(first_name>=”L”)AND(first_name SELECT* from test WHERE last_name=”Lan” Mysql>SELECT* from test WHERE last_name=”Lan” OR(first_name=”Nguyễn”) Sử dụng các kiểu cột từ những bộ máy CSDL khác Đây là cách tạo ra một cách dễ dàng có sử dụng mã SQL cho các hệ quản trị CSDL khác có cơ sở là SQL.Đây chính là ánh xạ kiểu từ CSDL khác sang kiểu t−ơng ứng bên MySQL,do đó dễ dàng chuyển bảng từ CSDL khác sang bảng có kiểu trong MySQL . 74
  75. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Kiểu ở các thành phần khác Kiểu trong mySQL Binary(num) Char(num)binary Char varyfing(num) Varchar(num) Float4 Float Float8 double Int1 Tinyint Int2 Smallint Int3 Mediumint Int4 Int Int8 Bigint Long Varbinaryint mediumBlob Long Varchar mediumText Midleint Mediumint Varbinary Varchar(num)Bynary Nếu bạn tạo bảng với kiểu sử dụng là của bộ máy CSDL khác thì khi đ−a ra lệnh :DISCRIBE tbl_name,khi đó Mysql sẽ ghi lại cấu trúc bảng này với kiểu t−ơng ứng trong Mysql. 5.Các kiểu bảng trong MySQL Trong Mysql có 4 kiểu bảng khác nhau ,có thể tạo nhiều kiểu bảng với câu lệnh CREATE TABLE: Kiểu bảng MyISAM(indexsequential acces method):Đây là kiểu bảng mặc định đ−ợc tạo ra khi bạn dùng lệnh Create,nó là cơ sở trong mã lệnh ISAM và có một sô sự mở rộng hữu dụng tạo ra file với phần mở rộng .MYI Kiểu bảng MyHeap:Các bảng kiểu này đ−ợc l−u trữ trong bộ nhớ ,việc chỉ số hoá của chúng đ−ợc thực hiện bởi hàm băm,vì vậy mà tốc độ thực hiện của bảng kiểu này cực kì nhanh,nh−ng nó phảI trả giá rất đắt ,vì dữ liệu của ta bị mất .Vì vậy bảng này chỉ dùng tạm thời ,bạn có thể chỉ ra sô hàng tối đa trong câu lệnh Create table .Kiểu bảng này có thể chiếm gần hết bộ nhớ của bạn ,vì vậy không thể sử dụng các cột kiểu blob,text hoặc auto_increment. Bảng kiểu BDB:Các bảng kiêu này là những giao dịch an toàn ,chúng đ−ợc cung cấp các lệnh COMMIT,ROOLBACK,các bảng kiểu này hoạt động chậm hơn các bảng có kiểu MyISAM 75
  76. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Bảng kiểu Merge:Đây là kiểu bảng mới ,mã lệnh cho kiểu bảng này mới đang ở phiên bản bêta,tuy nhiên nó sẽ nhanh chóng ổn định ,đây chính là bảng ISAM nh−ng chúng chỉ đ−ợc chọn lựa một bảng ,chỉ đ−ợc insert,update,delete một bảng mà bạn chọn ,nếu bạn muốn xoá bảng chỉ cần chỉ định xoá merge.Bảng kiểu này giúp xử lý các vấn đề sau ,dễ quản lý và tách ra thành nhiều bảng khác nhau ,nâng cao tốc độ xử lý ,việc tìm kiếm sẽ hiệu quả hơn. II. Các hàm trong MySQL Hàm dùng trong câu lệnh SELECT và WHERE 1. Hàm nhóm. Mysql>select 12*3 ->7 Mysql>select (12)*3 ->9 2. Các phép toán xử lý thông th−ờng Cộng : Mysql>select 35 ->8 Trừ : Mysql>select 3-5 ->-2 Nhân: Mysql>select 3*5 ->15 Chia:Mysql>select 3/5 ->0.6 Mysql>select 3/0 ->NULL 3. Phép toán thao tác với bit Số bit tối đa là 64 bits Phép AND Mysql>select 29&15; ->13 Phép OR: Mysql>select 29\15; ->31 Dịch tráI: Mysql>select 1 4 Dịch phải: 76
  77. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Mysql>select 4>>2; ->1 4. Phép toán lôgic Các phép and(&),or(::),not(!).Các giá trị trả về là 0 hoặc 1 t−ơng ứng đúng hoặc sai Ví dụ: Mysql>select not 1; ->0 5. Các phép so sánh(>=,>, SELECT 1>’6x’; ->0 Mysql>SELECT 7>’6x’; ->1 Mysql>SELECT 1=’x6’; ->1 Mysql>SELECT 1 is NULL,0 IS NULL,NULL IS NULL ->0 0 1 phép toán BETWEEN: expr BETWEEN min AND max Mysql>select 1BETWEEN 2 AND 3; ->0 Mysql>select ‘b’BETWEEN ‘a’ AND ‘c’; ->1 Mysql>select 2BETWEEN 2 AND ‘x-3’; ->0 Phép toán in,not in(value1, ) 77
  78. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL mysql>select 2 IN (0,4,’dfdg’); ->0 mysql>select ‘dfdg’ IN (0,4,’dfdg’); ->1 Phép toán ISNULL mysql>select ISNULL(11); ->0 mysql>select ISNULL(1/0); ->1 6. Các hàm so sánh xâu Đối với các hàm so sánh xâu thì có phân biệt chữ hoa ,chữ th−ờng expr LIKE pat[ESCAPE ‘escape-char’] giá trị trả về có thể là số hoặc xâu,với hàm này có thể dùng hai kí tự đại diện là %,- %: giá trị trả về có thể là số các kí tự -: giá trị phù hợp chỉ là một kí tự T−ơng tự ta sẽ có hàm NOT LIKE: NOT (expr LIKE pat[ESCAPE ‘escape-char’]) Ví dụ : mysql>select ‘hà’ LIKE ‘hà\-’; ->1 mysql>select 10 LIKE ‘1%’; ->1 Hàm STRCMP(expr1,expr2):trả về 0 nếu 2 xâu nh− nhau ,-1 nếu đối số đầu nhỏ hơn đối số hai theo thứ tự sắp xếp ,ngoàI ra thì bằng 1 mysql>select STRCMP (‘text1’,’text2’); ->-1 mysql>select STRCMP (‘text1’,’text’); ->1 mysql>select STRCMP (‘text1’,’text1’); ->0 Phép toán cast mysql>select “a”=”A”; ->1 mysql>select BINARY “a”=”A”; ->0 Hàm IF(expr1,expr2,expr3) 78
  79. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL T−ơng đ−ơng với hàm if kép trong ngôn ngữ C,nếu expr1 đúng thì hàm nhận giá trị expr2,ng−ợc lại thì nhận giá trị expr3 Ví dụ: Mysql>select IF(1 4 Mysql>select IF(1>2,yes,no); ->no giá trị trả về có thể là kiểu sô hoặc xâu tuỳ theo ngữ cảnh phù hợp . 7. Các hàm toán học. -ABS(x): giá trị tuyệt đối của x mysql>select ABS(-3); ->3 mysql>select ABS(3); ->3 -SIGN(X): Dấu của biểu thức trong ngoặc ,trả lại 0 nếu X=0,-1 nếu X 0 mysql>select (3-5); ->-1 mysql>select (0); ->0 mysql>select (3); ->1 -MOD(N,M):lấy phân d− của phép chia n cho m mysql>select MOD(30,6); ->0 mysql>select 13%6; ->1 -ROUND(X):Lấy phần nguyên gần X nhất -exp(x),log(x),log10(x) -POW(x,y):x mũ y T−ơng tự ta có các hàm toán học khác nh−: sin(x),cos(x),tan(x),asin(x),acos(x),atan(x),rand(); 8. Các hàm xử lý xâu: -Char(N, ) hàm trả về dãy các kí tự có mã ACCSI đ−ợc liệt kê trong ngoặc VD: mysql>select CHAR(77,121,83,81,’76’); 79
  80. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL ->’MySQL’ mysql> select CHAR(77,77.3,’77.3’); ->’MMM’ -Hàm ghép 2 xâu : CONCAT(str1,str2, ) vd : mysql> select CONCAT(‘MY’,’S’,’QL’); ->’MYSQL’ mysql> select CONCAT(‘MY’,NULL,’QL’); ->NULL mysql> select CONCAT(12.5); ->12.5 -CONCAT_WS(separator,str1,str2 ) mysql> select CONCAT_WS(“,”,”first name”,”last name”); ->’first name,last name’ mysql> select CONCAT_WS(“,”,”first name”,NULL,”last name”); ->’first name,last name’ -Các hàm về độ dàI của xâu : LENGTH(str) 0CTET_LENGTH(str) CHAR_LENGTH(str) CHARACTER_LENGTH(str) Mysql>select LENGTH(‘text’); ->4 mysql>select 0CTET_LENGTH(‘text’) -Các hàm định vị xâu con LOCATE(substr,str) POSITION(substr IN str) Mysql>select LOCATE(‘nam’,’ph−ơngnam’); ->7 Mysql>select LOCATE(‘nama’,’ph−ơngnam’); ->0 NgoàI ra trong Mysql còn rất nhiều các hàm liên quan đến việc xử lý xâu khác nh−ng không liệt kê ở đây .Ta sẽ sang ch−ơng mới 80
  81. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL CHƯƠNG III. CáC LệNH THAO TáC VớI CSDL I. Các lệnh thao tác với CSDL 1. Lệnh tạo CSDL Cú pháp :CREATE DATABASE[if not exists] db_name; Tạo ra CSDL nh− là tạo một th− mục mà trong đó có các file,đây chỉ là tạo th− mục chứ ch−a có file,mà các file ở đây là các bảng.Vậy ta sẽ phải có câu lệnh tạo bảng CREATE DATABASE IF NOT EXISTS NHANSU; Câu lệnh trên sẽ tạo ra một CSDL tên NHANSU,nh−ng ch−a có bản nào đ−ợc tạo ra. Từ khoá if not exists nếu đ−ợc chỉ ra sẽ tránh đ−ợc một lỗi phát sinh nếu nh− trên máy đã có cơ sở dữ liệu này rồi. 2. Lệnh xoá CSDL. Cú pháp:Drop Database [if esists]db_name. Câu lệnh này sẽ xoá tất cả các bảng trong cơ sở dữ liệu và xoá luôn cả cơ sở dữ liệu có tên là DB_NAME. Ví dụ:Drop Database [if eists] NHANSU Nếu bạn thực hiện xoá một cơ sở dữ liệu với kết nối cơ sở dữ liệu đó thì cả CSDL nguồn và kết nối sẽ bị xoá.Bạn phảI rất cẩn thận đối với lệnh này,nó sẽ xoá th− mục với tên của CSDL và tất cả các file với các phần mở rộng nh− sau: .BAK .DAT .HSH .ISD .ISM .ISM .MRG .MYD .MYI .DR .FRM Trong các phiên bản 3.22 hoặc cũ hơn ta có thể chỉ định từ khoá if esists để ngăn một lỗi xuất hiện nếu nh− CSDL ch−a có trên đĩa. II. Các lệnh thao tác trên bảng và xử lý đối với bảng. 1. Lệnh tạo bảng. Cú pháp: CREAT{TEMPORARY}TABLE{IF NOT ESISTS} Tbl_name [(creat_definition, )] [table_options] [select_statement] 81
  82. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Lệnh sẽ tạo ra một bảng trong cơ sở dữ liệu hiện tại nếu cơ sở dữ liệu ch−a tồn tại thì sẽ có lỗi phát sinh.Trong phiên bản Mysql3.2.2 hoặc muộn hơn tên bảng có thể đ−ợc chỉ định rõ là db_name.table_name trong tr−ờng hợp này máy sẽ thực hiện mà không quan tâm tới việc cơ sở dữ liệu có tồn tại hay không. Trong đó: Tbl_name là tên bảng cần tạo table_options :chỉ ra kiểu của bảng cần tạo và những đặc tính của bảng cần tạo table_options ={ISAM | MYISAM | HEAP | MERGE} or AUTO_INCREMENT=#:Giá trị tiếp theo mà bạn muốn đặt cho bảng or AUTO_ROW_LENGTH=#:Giá trị trung bình độ dàI của hàng trong bảng or COMMENT=”string”:lời bình luận tối đa 60 kí tự or MAX_ROWS=# số hàng tối đa mà bạn định l−u trữ creat_definition:đ−ợc định nghĩa nh− sau: creat_definition: col_name type [NOT NULL | NULL] [DEFAULT default_value] { AUTO_INCREMENT} [PRIMARY KEY}{reference_definition] or PRIMARY KEY (index_col_name, ) or KEY [index_name] (index_col_name, ) or INDEX [index_name] (index_col_name, ) or UNIQUE {INDEX} [index_name] (index_col_name, ) or FULLTEXT {INDEX} [index_name] (index_col_name, ) or {CONSTRANINT symbol] FOREIGN KEY index_name ((index_col_name, ) [reference_defintion] or CHECK (expr) type:Kiểu của cột đ−ợc tạo trong bảng REFERENCES tab_name [(index_col_name, )] [MATCHFULL | MATCHPARTIAL] [ON DELETE reference_option ] [ON UPDATE reference_option] reference_option: RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT 82
  83. Ban chỉ đạo cntt của cơ quan đảng PHP & MySQL Trong phiên bản 3.23 bạn có thể sử dụng từ khoá temporary khi tạo một bảng,bảng tạm này sẽ tự động đ−ợc xoá khi kết thúc một phiên làm việc . NOT NULL: Nếu cột đ−ợc chỉ định là NOT NULL thì khi nhập liệu ta bắt buộc phảI nhập dữ liệu cho cột này . NULL :Đối với cột kiểu timestamp sẽ có sự khác biệt về giá trị NULL so với những cột có những kiểu khác,bạn không thể đ−a ra giá trị NULL với cột có kiểu timestamp nếu đặt là NULL thì nó sẽ tự động đặt ngày giờ hiện tại,bởi vì cột có kiểu stamp sử dụng cách thức này nên thuộc tính NULL hoặc NOT NULL sẽ không đ−ợc đặt nh− những cột thông th−ờng và nó sẽ đ−ợc lờ đI nếu bạn chỉ định đIều này . DEFAULT :cột này sẽ tự động đ−ợc đặt là giá trị ngầm định nếu nh− ta bỏ qua không nhập giáv trị cho cột này .Giá trị ngầm định phảI là hằng số theo nghĩa là ta không thể đặt giá trị mặc định cho cột là giá trị trả về của một hàm ,nếu cột đ−ợc khai báo là NOT NULL thì giá trị ngầm định sẽ phụ thuộc kiểu của cột Nếu không đặt DEFAULT -AUTO_INCREMENT:chỉ có đối với cột số nguyên cột này sẽ tự động đ−ợc tăng khi nhập dữ liệu .Nếu bạn xoá một hàng chứa giá trị lớn nhất của cột auto_increment thì giá trị này sẽ dùng lại cho lần nhập liệu sau (đIều này chỉ xảy ra đối với bảng loại ISAM mà không xảy đối với bảng MYISAM) chú ý:Mỗi hàng chỉ có một cột đặt là auto_increment và phảI đ−ợc đặt là chỉ số -UNIQUE KEY:đây là khoá của bảng nó chỉ có thể nhận một giá trị nhất định,sẽ có lỗi nếu nh− ta chèn vào một hàng của bảng giá trị khoá trùng với khoá của hàng đã tồn tại . -PRIMARY KEY:Định nghĩa khoá chính của bảng,là khoá duy nhất với ràng buộc rằng tất cả các giá trị khoá đều phảI đặt NOT NULL mỗi bảng chỉ có thể có một khoá chính. -FOREIGN KEY :khoá ngoại dùng làm khoá chính của bảng khác -Mệnh đề SELECT :Nếu có thêm mệnh đề SELECT sau câu lệnh CREATE TABLE thì Mysql sẽ tạo các tr−ờng mới cho tất cả các thành phần nằm trong câu lệnh SELECT Ví dụ ta tạo bảng hosinh CREATE TABLE HOCSINH(, Mahs char(5) NOT NULL,PRIMARY KEY, Hoten varchar(35), Ngaysinh date, Quequan varchar(40)); 83