PHP là ngôn ngữ kịch bản máy chủ và là công cụ mạnh mẽ để tạo các trang Web động và tương tác
PHP là một giải pháp thay thế được sử dụng rộng rãi, miễn phí và hiệu quả cho các đối thủ cạnh tranh như ASP của Microsoft
Bắt đầu học PHP ngay bây giờ »Học dễ dàng với "PHP Tryit"
Với trình chỉnh sửa "PHP Tryit" trực tuyến của chúng tôi, bạn có thể chỉnh sửa mã PHP và nhấp vào nút để xem kết quả
Thí dụ
echo "Tập lệnh PHP đầu tiên của tôi. ";
?>
Nhấp vào nút "Tự dùng thử" để xem nó hoạt động như thế nào
Bài tập PHP
Kiểm tra bản thân với các bài tập
Tập thể dục
Chèn phần còn thiếu của mã bên dưới để xuất "Xin chào thế giới"
Cung cấp câu trả lời "
Ví dụ PHP
Tìm hiểu bằng các ví dụ. Hướng dẫn này bổ sung tất cả các giải thích với các ví dụ rõ ràng
Xem tất cả các ví dụ về PHP
Bài kiểm tra PHP
Học bằng cách làm bài kiểm tra. Bài kiểm tra này sẽ cung cấp cho bạn tín hiệu về mức độ bạn biết hoặc không biết về PHP
Bắt đầu bài kiểm tra PHP
Việc học của tôi
Theo dõi tiến trình của bạn với chương trình "Học tập của tôi" miễn phí tại W3Schools
Đăng nhập vào tài khoản của bạn và bắt đầu kiếm điểm
Đây là một tính năng tùy chọn. Bạn có thể học W3Schools mà không cần sử dụng My Learning
Tài liệu tham khảo PHP
Tài liệu tham khảo PHP của W3Schools chứa các danh mục khác nhau của tất cả các hàm, từ khóa và hằng số PHP, cùng với các ví dụ
Ví dụ sau select the column id, firstname and lastname from the MyGuests table and display this information on page
Ví dụ [MySQLi direction object]
Kết quả
id: 1 - Name: David Vinh id: 2 - Name: Tran Tan
Đoạn mã trên có thể được giải thích như sau
Đầu tiên, chúng ta thiết lập một truy vấn SQL để chọn các cột id, firstname và lastname từ bảng MyGuests. Dòng mã tiếp theo thực hiện truy vấn và đưa kết quả vào một biến gọi là $result
Sau đó, các chức năng num_rows[] kiểm tra xem có nhiều hơn 0 bản ghi trả về
Nếu có nhiều bản ghi được trả về, hàm fetch_assoc[] sẽ đặt tất cả các kết quả vào một mảng kết hợp mà chúng ta có thể lặp lại. Vòng lặp while[] tập tin kết quả và cột id, firstname và lastname được hiển thị trên trang
Nếu chưa biết cách tạo cơ sở dữ liệu và kết nối thông tin, bạn có thể xem lại cách tạo từ phpMyAdmin
Nếu chưa biết file PHP được tạo ở đâu thì bạn có thể xem lại Thư mục đang làm việc khi cài đặt XAMPP
Object direction type
connect_error] { die["Không kết nối :" . $conn->connect_error]; exit[]; } echo "Khi kết nối thành công sẽ tiếp tục dòng code bên dưới đây." ?>
Loại thủ tục
Nếu không xảy ra lỗi kết nối, trình duyệt sẽ hiển thị như bên dưới
Khi kết nối thành công sẽ tiếp tục dòng mã bên dưới đây
Tải xuống tệp ví dụ
Trong file download đã có sẵn file tintuc. sql, file này là file dữ liệu mẫu, sau khi tạo cơ sở dữ liệu chúng ta có thể lấy dữ liệu từ file tintuc. sql bằng thao tác nhập có trong phpMyAdmin
connect_error] { die["Không kết nối :" . $conn->connect_error]; exit[]; } echo "Khi kết nối thành công sẽ tiếp tục dòng code bên dưới đây." ?>6
connect_error] { die["Không kết nối :" . $conn->connect_error]; exit[]; } echo "Khi kết nối thành công sẽ tiếp tục dòng code bên dưới đây." ?>7
";
print_r[$myrow];
echo "
connect_error] { die["Không kết nối :" . $conn->connect_error]; exit[]; } echo "Khi kết nối thành công sẽ tiếp tục dòng code bên dưới đây." ?>8
connect_error] { die["Không kết nối :" . $conn->connect_error]; exit[]; } echo "Khi kết nối thành công sẽ tiếp tục dòng code bên dưới đây." ?>9
Nếu bạn là một Nhà phát triển PHP, chắc chắn bạn đã rất quen thuộc với việc truy xuất Cơ sở dữ liệu [Cơ sở dữ liệu] bằng các tiện ích mở rộng MySQL và MySQLi. Từ PHP 5. 1 ta có một cách thức tối ưu hơn đó là sử dụng PHP Data Objects. PDO cung cấp các cơ chế câu lệnh được chuẩn bị sẵn, các thủ tục được lưu trữ và giúp bạn thao tác với cơ sở dữ liệu thông qua các đối tượng [Object] làm cho công việc trở nên hiệu quả, dễ dàng hơn
So sánh PDO và MySQLi
PDOMySQLiDatabase SupportHơn 12 LoạiChỉ hỗ trợ MySQLAPIHướng đối tượng [OOP]Hướng đối tượng [OOP] - Hướng thủ tục [Thủ tục]Kết nối Cơ sở dữ liệuDễ dàngDễ dàngĐặt tên tham sốCóKhôngObject MappingCóCóPrepared StatementsCóKhôngHiệu năngCaoCaoStoredProceduresCóCóCó1. Giới thiệu PDO - PHP Data Objects
Đối tượng dữ liệu PHP [PDO] là một lớp truy xuất cơ sở dữ liệu cung cấp một phương pháp hệ thống tốt nhất để làm việc với nhiều loại cơ sở dữ liệu khác nhau. Khi làm việc với PDO, bạn sẽ không cần phải viết các câu lệnh SQL cụ thể mà chỉ sử dụng các phương thức mà PDO cung cấp, giúp tiết kiệm thời gian điện và làm cho việc chuyển đổi Hệ quản trị cơ sở dữ liệu trở nên dễ dàng
Bạn chỉ cần xác định API mà PDO cung cấp là có thể làm việc được với nhiều Hệ thống quản trị cơ sở dữ liệu khác nhau như MySQL, SQLite, PostgreSQL, Microsoft SQL Server,. and could easy easy convert them
Hệ thống quản trị cơ sở dữ liệu [Database Management System] mà PDO hỗ trợ bao gồm
Tên trình điều khiểnDBMSPDO_CUBRIDCubridPDO_DBLIB FreeTDSMicrosoft SQL Server / SybasePDO_FIREBIRDFirebirdPDO_IBMIBM DB2PDO_INFORMIXIBM Informix Dynamic ServerPDO_MYSQLMySQL 3. x/4. x/5. xPDO_OCIOGiao diện cuộc gọi OraclePDO_ODBCODBC v3 [IBM DB2, unixODBC và win32 ODBC]PDO_PGSQLPostgreSQLPDO_SQLITESQLite 3 và SQLite 2PDO_SQLSRVMicrosoft SQL Server / SQL AzurePDO_4D4D2. Kết nối cơ sở dữ liệu
Mỗi DBMS sẽ có các phương thức kết nối khác nhau [có các loại cần Tên người dùng, Mật khẩu, Cơ sở dữ liệu đường dẫn, Cổng, có loại không]. Chuỗi kết nối của các biến DBMS phổ biến hầu hết đều có dạng như sau
$conn = new PDO['mysql:host=localhost;dbname=izlearn', $username, $password];
Với mysql là tên của DBMS, localhost có nghĩa là cơ sở dữ liệu được đặt trên cùng một máy chủ, izlearn là tên của cơ sở dữ liệu. $username và $password là 2 biến chứa thông tin xác thực
Đối với SQLite, DBMS này không có cơ chế xác thực bằng Tên người dùng và Mật khẩu mà chỉ đơn giản là đường dẫn đến tệp dữ liệu
$conn = new PDO["sqlite:your/database/path/izlearn.db"];
Đây là lúc để bạn quên đi Connection String error mysql_connect['localhost', 'username', 'password'] or die['Could not connect. '. mysql_error[]]; . Thực ra họ chỉ đang dẫn bạn đi về quá khứ mà thôi. Đế ngắt kết nối khi không cần thao tác với cơ sở dữ liệu nữa, các bạn chỉ cần set biến $conn về null;
$conn = null;
3. Chèn và cập nhật
Thêm mới [chèn] và cập nhật [update] dữ liệu là những hoạt động cơ bản khi thao tác với cơ sở dữ liệu. Với PDO, mỗi hoạt động chèn hoặc cập nhật được thực hiện qua 3 quá trình sử dụng cơ chế Câu lệnh đã chuẩn bị
- chuẩn bị tuyên bố. Chuẩn bị sẵn một câu lệnh SQL làm khung/mẫu được gọi là Tuyên bố đã chuẩn bị với các trình giữ chỗ [có thể hiểu trình giữ chỗ đóng vai trò như tham số của các phương thức khi bạn khai báo hàm]
- tham số ràng buộc. Gắn giá trị thực vào các trình giữ chỗ [tương tự như khi bạn truyền giá trị vào các tham số của phương thức]
- Hành hình. Thực thi câu lệnh
Tuyên bố chuẩn bị
Có 2 loại Trình giữ chỗ trong Tuyên bố đã chuẩn bị là Trình giữ chỗ không được định danh [Phần giữ chỗ không được đặt tên] và Trình giữ chỗ được định danh [Phần giữ chỗ được đặt tên] như ví dụ sau
$stmt = $conn->prepare['INSERT INTO users [name, email, age] values [?, ?, ?]'];
$stmt = $conn->prepare['INSERT INTO users [name, email, age] values [:name, :mail, :age]'];
Dòng lệnh thứ nhất sử dụng Trình giữ chỗ không được định danh là các dấu hỏi - ?. Dòng lệnh thứ 2 sử dụng Placeholder định danh. . Tên,. thư,. tuổi [lưu dấu hai chấm và trình giữ chỗ không nhất thiết phải giống tên cột]. Sau đây là toàn bộ quá trình Chèn và Cập nhật sử dụng 2 loại Trình giữ chỗ nêu trên
Trình giữ chỗ chưa đặt tên
________số 8Như các bạn đã thấy, chúng ta chỉ cần khởi động Chuẩn bị Tuyên bố một lần và có thể sử dụng lại nhiều lần. Với mỗi cột - placeholder ta phải thực hiện gán tham số một lần, điều này sẽ không sao với những bảng có ít cột như ví dụ trên, nhưng sẽ rất bất tiện nếu bảng có nhiều bảng, rất may ta có cách khác để
$stmt = $conn->prepare['INSERT INTO users [name, email, age] values [?, ?, ?]'];
$data = array['Vu Hoang Lam', '[email protected]', 22];
//Phương thức execute[] dưới đây sẽ gán lần lượt giá trị trong mảng vào các Placeholder theo thứ tự
$stmt->execute[$data];
Trình giữ chỗ được đặt tên
Đối với Trình giữ chỗ được đặt tên, cách thực hiện cũng khá tương đồng với Trình giữ chỗ không được đặt tên, chỉ khác là ta không sử dụng trình giữ chỗ thứ tự để gán giá trị [liên kết] mà sử dụng tên chính của trình giữ chỗ
id: 1 - Name: David Vinh id: 2 - Name: Tran Tan0
Các bạn cũng có thể sử dụng mảng để rút gọn
id: 1 - Name: David Vinh id: 2 - Name: Tran Tan1
Ở dòng cuối cùng, tôi đã thực hiện "ép kiểu" [ép] Đối tượng $person thành mảng để truyền vào phương thức thực thi[];
Việc sử dụng Tuyên bố đã chuẩn bị sẽ giúp bạn tránh bị SQL Injection, tôi sẽ đi sâu giải thích vấn đề này trong một bài viết khác
4. Chọn Dữ liệu - "Đọc" dữ liệu từ cơ sở dữ liệu
Khi đọc dữ liệu từ cơ sở dữ liệu, PDO sẽ trả về dữ liệu theo cấu trúc mảng [mảng] hoặc đối tượng [đối tượng] thông qua phương thức tìm nạp[]. Bạn nên thiết lập trước cấu trúc dữ liệu trước khi gọi phương thức này, PDO hỗ trợ các tùy chọn sau
- PDO. FETCH_ASSOC. Trả về dữ liệu dạng mảng với key là tên của cột [cột của các bảng trong cơ sở dữ liệu]
- PDO. FETCH_BOTH [mặc định]. Trả về dữ liệu dạng mảng với khóa là tên của cột và số thứ tự của cột
- PDO. FETCH_BOUND. Gán giá trị của từng cột cho từng biến đã khởi tạo trước đó thông qua phương thức bindColumn[]
- PDO. FETCH_CLASS. Gán giá trị của từng cột cho từng thuộc tính [thuộc tính/thuộc tính] của một lớp Lớp theo tên cột và tên thuộc tính
- PDO. FETCH_INTO. Gán giá trị của từng cột cho từng thuộc tính của một Phiên bản lớp [có thể hiển thị của một lớp]
- PDO. FETCH_LAZY. Gop chung PDO. FETCH_BOTH/PDO. FETCH_OBJ
- PDO. FETCH_NUM. Trả về dữ liệu dạng mảng với key là số thứ tự của cột
- PDO. FETCH_OBJ. Trả về một đối tượng của stdClass [link is external] với tên thuộc tính của đối tượng là tên của cột
Trong thực tế, chúng ta chỉ thường sử dụng 3 kiểu tìm nạp đó là. FETCH_ASSOC, FETCH_CLASS và FETCH_OBJ. Để thiết lập cấu trúc dữ liệu cấu trúc [Tìm nạp kiểu hoặc Chế độ tìm nạp] trước khi tìm nạp ta sử dụng câu lệnh sau
id: 1 - Name: David Vinh id: 2 - Name: Tran Tan2
Hoặc nếu muốn, bạn cũng có thể thiết lập kiểu tìm nạp khi gọi hàm tìm nạp[]
id: 1 - Name: David Vinh id: 2 - Name: Tran Tan3
FETCH_ASSOC
Kiểu tìm nạp này sẽ tạo ra một kết hợp mảng lập chỉ mục theo tên cột [nghĩa là các khóa của mảng chính là tên của cột], tương tự như khi ta sử dụng MySQL/MySQLi Extension
$conn = new PDO["sqlite:your/database/path/izlearn.db"];
0FETCH_OBJ
Kiểu tìm nạp này trả về một đối tượng của stdClass cho mỗi hàng của kết quả
$conn = new PDO["sqlite:your/database/path/izlearn.db"];
1FETCH_CLASS
Kiểu tìm nạp này cho phép bạn đưa kết quả vào Đối tượng của một Lớp mà bạn chỉ định. Khi sử dụng FETCH_CLASS, thuộc tính của lớp sẽ được gán giá trị trước khi hàm tạo của lớp đó được gọi [phải chú ý vì điều này rất quan trọng]. Nếu không có thuộc tính khớp với tên của một cột bất kỳ thì thuộc tính đó sẽ được tự động tạo ra [công khai]
Bảng giả sử người dùng có một Class User đã được định nghĩa như sau
$conn = new PDO["sqlite:your/database/path/izlearn.db"];
2Khi truy vấn dữ liệu từ cơ sở dữ liệu sử dụng đoạn mã sau
$conn = new PDO["sqlite:your/database/path/izlearn.db"];
3Vì hàm tạo được gọi sau khi thuộc tính $name được gán bằng Vũ Hoàng Lâm nên isAdmin sẽ mang lại giá trị Yes. Nếu muốn hàm tạo của lớp được gọi trước khi các thuộc tính được gán giá trị, bạn phải sử dụng thêm PDO. FETCH_PROPS_LATE. Cách sử dụng như sau
$conn = new PDO["sqlite:your/database/path/izlearn.db"];
4Nếu cần truyền các tham số cho hàm tạo của lớp thông qua phương thức tìm nạp[], bạn có thể đặt chúng trong một mảng theo thứ tự tương ứng với các công cụ như sau
$conn = new PDO["sqlite:your/database/path/izlearn.db"];
5Ngoại lệ - Xử lý ngoại lệ
PDO sử dụng các ngoại lệ để xử lý các lỗi phát sinh khi làm việc với cơ sở dữ liệu, vì thế tất cả những gì bạn làm với PDO nên được đặt trong một khối thử/bắt. PDO cung cấp 3 chế độ xử lý lỗi [Chế độ lỗi] được thiết lập thông qua phương thức setAttribute[]
$conn = new PDO["sqlite:your/database/path/izlearn.db"];
6PDO. ERRMODE_SILENT
Đây là chế độ xử lý lỗi mặc định của PDO, khi gặp lỗi bất thường, PDO sẽ im lặng [im lặng] và chương trình vẫn tiếp tục chạy. Bạn có thể lấy mã lỗi và thông tin về các lỗi đã xảy ra thông qua PDO. errorCode[] và PDO. errorInfo[]
PDO. ERRMODE_WARNING
Ở chế độ này khi gặp phải lỗi PDO sẽ ném ra một Cảnh báo PHP, chương trình sẽ tiếp tục chạy
PDO. ERRMODE_EXCEPTION
Đây là chế độ mà bạn nên sử dụng nhiều nhất, khi đặt trong một khối thử/bắt sẽ giúp bạn kiểm tra các lỗi phát sinh một cách nhẹ nhàng và ẩn các thông báo lỗi có thể khiến Kẻ tấn công khai thác hệ thống của bạn
$conn = new PDO["sqlite:your/database/path/izlearn.db"];
7Đoạn mã trên sẽ ghi thông báo lỗi vào một tệp văn bản với tên PDOErrors. txt
Một số phương thức hữu ích khác
$conn = new PDO["sqlite:your/database/path/izlearn.db"];
8Phương thức trả về ID tăng tự động của các hàng được bổ sung gần đây nhất
$conn = new PDO["sqlite:your/database/path/izlearn.db"];
9Đối với các lệnh SQL không có dữ liệu trả về và không cần thiết phải truyền tham số thì có thể sử dụng phương thức exec[]. Phương thức này sẽ trả về số lượng hàng bị tác động sau khi thực hiện lệnh. As ví dụ trên sẽ trả về số lượng hàng bị xóa
$conn = null;
0Phương thức quote[] sẽ giúp bạn thêm dấu nháy cho một chuỗi để chuỗi đó an toàn khi sử dụng để truy vấn, nếu bạn không muốn sử dụng Câu lệnh Chuẩn bị
$conn = null;
1Phương thức rowCount[] trả về số lượng hàng được tác động sau khi thực hiện các thao tác DELETE, INSERT và UPDATE. Use rowCount[] for the thao tác SELECT can't pay return result false with a number of database