# I. Cookies
Cookies trong PHP là một phần quan trọng của web development, cho phép lưu trữ dữ liệu người dùng trên trình duyệt của họ. Dưới đây là thông tin cơ bản về cách thức hoạt động và sử dụng cookies trong PHP:
### 1. Khái Niệm Cơ Bản
- **Cookies là gì?**
- Cookies là những tệp nhỏ được lưu trên máy tính của người dùng. Chúng được tạo ra bởi trang web mà người dùng đang truy cập và chứa dữ liệu như tùy chọn người dùng hoặc thông tin đăng nhập.
- Cookies giúp trang web nhớ thông tin về lần truy cập của người dùng, làm cho trải nghiệm duyệt web trở nên mượt mà hơn.
### 2. Sử Dụng Cookies trong PHP
- **Tạo Cookie**
- Sử dụng hàm `setcookie()` để tạo một cookie.
- Hàm này phải được gọi trước bất kỳ output nào được gửi đến trình duyệt.
```php
setcookie("user", "John Doe", time() + (86400 * 30), "/"); // Cookie sống trong 30 ngày
```
- **Đọc Cookie**
- Một khi cookie đã được tạo, nó có thể được truy cập thông qua biến siêu toàn cầu `$_COOKIE`.
```php
if(!isset($_COOKIE["user"])) {
echo "Cookie 'user' không được thiết lập!";
} else {
echo "Giá trị cookie 'user' là: " . $_COOKIE["user"];
}
```
- **Xóa Cookie**
- Để xóa một cookie, bạn sử dụng `setcookie()` với ngày hết hạn trong quá khứ.
```php
setcookie("user", "", time() - 3600, "/");
```
### 3. Tại sao cần Cookies
#### 3.1. Quản Lý Phiên
- **Duy Trì Trạng Thái Đăng Nhập**: Cookies thường được sử dụng để nhớ người dùng đã đăng nhập vào một trang web, cho phép họ duyệt qua nhiều trang mà không cần đăng nhập lại ở mỗi trang mới.
- **Theo Dõi Phiên Mua Sắm**: Trong các trang web thương mại điện tử, cookies giúp duy trì trạng thái của giỏ hàng hoặc lưu trữ các sản phẩm đã xem.
#### 3.2. Tùy Chỉnh Trải Nghiệm Người Dùng
- **Lưu Tùy Chọn Người Dùng**: Cookies lưu thông tin về tùy chọn người dùng như ngôn ngữ, chủ đề, và các tùy chọn tùy chỉnh khác, giúp tạo trải nghiệm cá nhân hóa mỗi khi người dùng trở lại trang web.
#### 3.3. Theo Dõi và Phân Tích
- **Phân Tích Dữ Liệu**: Cookies được sử dụng để theo dõi hành vi duyệt web của người dùng, cho phép trang web và quảng cáo được tối ưu hóa dựa trên thông tin thu thập được.
- **Quảng Cáo Hướng Nghiệp**: Cookies giúp nhận dạng sở thích của người dùng và hiển thị quảng cáo phù hợp với họ.
#### 3.4. Bảo Mật
- **Xác Thực và Bảo Vệ**: Cookies có thể giúp xác thực người dùng và ngăn chặn các cuộc tấn công bảo mật như tấn công giả mạo yêu cầu (CSRF).
#### 3.5. Duy Trì Trạng Thái Giao Diện
- **Ghi Nhớ Các Cài Đặt Giao Diện**: Cookies lưu trữ cài đặt như kích thước font chữ, tùy chọn hiển thị, và các tùy chỉnh giao diện khác.
### 4. Các hàm / biến để xử lý Cookies
Trong PHP, có một số hàm chính được sử dụng để làm việc với cookies. Dưới đây là danh sách các hàm liên quan đến cookies và mô tả cách chúng được sử dụng:
#### 1. `setcookie()`
- **Mục Đích**: Được sử dụng để gửi một cookie từ máy chủ đến trình duyệt của người dùng.
- **Cú Pháp**:
```php
setcookie(name, value, expire, path, domain, secure, httponly);
```
- **Ví Dụ**:
```php
setcookie("user", "John Doe", time() + 3600, "/");
```
### 2. `setrawcookie()`
- **Mục Đích**: Tương tự `setcookie()`, nhưng không tự động mã hóa giá trị cookie.
- **Cú Pháp**:
```php
setrawcookie(name, value, expire, path, domain, secure, httponly);
```
### 3. `$_COOKIE`
- **Mục Đích**: Một biến toàn cục trong PHP dùng để truy cập các cookie.
- **Cách Sử Dụng**:
- Truy cập giá trị của một cookie cụ thể:
```php
echo $_COOKIE["user"];
```
- Kiểm tra xem cookie có tồn tại không:
```php
if (isset($_COOKIE["user"])) {
// Xử lý khi cookie tồn tại
}
```
## 5. Tham số path, domain, secure, httponly có ý nghĩa gì
Khi sử dụng hàm `setcookie()` để tạo hoặc sửa đổi cookie, bạn có thể cung cấp một số tham số để kiểm soát cách cookie hoạt động. Các tham số `path`, `domain`, `secure`, và `httponly` có ý nghĩa quan trọng trong việc định cấu hình cookie:
### 1. `path`
- **Ý Nghĩa**: Tham số `path` chỉ định đường dẫn trên máy chủ mà cookie sẽ được sẵn sàng. Chỉ các trang nằm dưới đường dẫn này mới có thể truy cập vào cookie.
- **Ví Dụ**: Nếu bạn đặt `path` là `/blog`, cookie chỉ có thể được truy cập từ các trang bắt đầu với `/blog`.
### 2. `domain`
- **Ý Nghĩa**: Tham số này chỉ ra domain hoặc subdomain mà cookie sẽ gửi tới. Nó được sử dụng để chia sẻ cookies giữa các subdomains.
- **Ví Dụ**: Nếu bạn đặt `domain` là `example.com`, cookie có thể được truy cập từ `example.com` và tất cả subdomains của nó như `sub.example.com`.
### 3. `secure`
- **Ý Nghĩa**: Khi thiết lập `secure` thành `true`, cookie chỉ được gửi qua kết nối HTTPS. Điều này giúp tăng cường bảo mật cookie bằng cách ngăn chặn việc gửi nó qua kết nối không an toàn.
- **Ví Dụ**: Đặt `secure` là `true` để đảm bảo cookie chỉ được gửi khi truy cập trang web qua HTTPS.
### 4. `httponly`
- **Ý Nghĩa**: Khi `httponly` được thiết lập thành `true`, cookie chỉ có thể được truy cập thông qua giao thức HTTP và không được truy cập qua JavaScript. Điều này giúp phòng chống một số loại tấn công, như tấn công XSS (Cross-site Scripting).
- **Ví Dụ**: Đặt `httponly` là `true` để ngăn script phía client (như JavaScript) truy cập vào cookie, giúp tăng cường bảo mật.
Sử dụng những tham số này một cách thích hợp có thể giúp bạn kiểm soát tốt hơn việc phân phát và bảo mật cookie của mình. Chúng đặc biệt quan trọng trong việc ngăn chặn việc lạm dụng cookie và bảo vệ thông tin của người dùng.
## 6. Lưu Ý Khi Làm Việc Với Cookies
- Cookies phải được gửi trước bất kỳ output nào từ script (trước thẻ HTML, khoảng trắng, vv).
- Khi sử dụng `setcookie()` hoặc `setrawcookie()`, hãy chú ý đến các tham số như `expire`, `path`, `domain`, `secure`, và `httponly` để đảm bảo an toàn và phù hợp với yêu cầu của ứng dụng.
- Bảo mật: Hãy cẩn thận không lưu trữ thông tin nhạy cảm trong cookies vì chúng có thể dễ dàng bị truy cập hoặc thay đổi.
## 7. Lưu Ý Chung
- **Bảo Mật và Quyền Riêng Tư**
- Mặc dù cookies rất hữu ích, việc sử dụng chúng cũng cần phải tuân thủ các quy định về quyền riêng tư và bảo mật, như Quy định Bảo vệ Dữ liệu Chung của EU (GDPR) và Đạo luật Bảo vệ Quyền Riêng tư Trực tuyến của Trẻ em (COPPA) ở Hoa Kỳ. Trang web cần thông báo cho người dùng về việc sử dụng cookies và, trong nhiều trường hợp, cần có sự đồng ý của họ để sử dụng cookies.
- Sử dụng HTTPS để truyền cookies an toàn.
- **Nên sử dụng Cookie HTTP Only**
- Để tăng cường bảo mật, bạn có thể đánh dấu cookie là "HTTP Only", điều này ngăn chặn việc truy cập cookie thông qua JavaScript.
```php
setcookie("user", "John Doe", time() + (86400 * 30), "/", "", false, true);
```
- **Giới Hạn**
- Mỗi trình duyệt có giới hạn về số lượng và kích thước của cookies. Do đó, không nên dựa vào cookies để lưu trữ một lượng lớn dữ liệu.
---
# II. Session
Trong PHP, session là một cách để lưu trữ thông tin (trong biến) để sử dụng qua nhiều trang. Khác với cookie, thông tin session được lưu trữ trên máy chủ. Điều này làm cho session trở thành một lựa chọn an toàn hơn để lưu trữ thông tin nhạy cảm.
### 1. Cách Hoạt Động của Session
1. **Bắt Đầu Session**: Khi một session được bắt đầu hoặc tiếp tục, PHP sẽ tạo hoặc cập nhật một ID session duy nhất cho mỗi người dùng.
2. **ID Session**: ID này thường được lưu trữ trong một cookie trên máy trình duyệt của người dùng (mặc dù cũng có thể được truyền qua URL).
3. **Lưu Trữ Dữ Liệu**: Thông tin của session được lưu trữ trên máy chủ và có thể bao gồm thông tin như dữ liệu xác thực người dùng, giỏ hàng mua sắm, và các loại dữ liệu tương tự khác.
4. **Truy Cập Thông Tin**: Trong suốt quá trình session, dữ liệu có thể được truy cập và thay đổi qua nhiều trang web.
### 2. Sử Dụng Session trong PHP
1. **Khởi Tạo Session**: Để bắt đầu một session mới hoặc tiếp tục một session hiện tại, sử dụng hàm `session_start()`. Hàm này phải được gọi trước bất kỳ output nào được gửi đến trình duyệt.
```php
session_start();
```
2. **Lưu Trữ Dữ Liệu Session**: Bạn có thể lưu trữ dữ liệu trong session bằng cách sử dụng biến siêu toàn cầu `$_SESSION`.
```php
$_SESSION["username"] = "JohnDoe";
```
3. **Truy Cập Dữ Liệu Session**: Truy cập dữ liệu trong session bằng cách tham chiếu đến các phần tử trong mảng `$_SESSION`.
```php
echo "Welcome " . $_SESSION["username"];
```
4. **Kết Thúc Session**: Khi session không còn cần thiết, bạn có thể xóa dữ liệu session và kết thúc nó.
```php
// Xóa tất cả biến session
session_destroy();
// Hủy session
session_destroy();
```
### Lưu Ý về Bảo Mật
- Hãy luôn khởi tạo session và kiểm tra trạng thái xác thực người dùng trước khi cung cấp quyền truy cập vào các phần nhạy cảm của website.
- Tránh lưu trữ thông tin nhạy cảm trong session vì mặc dù thông tin được lưu trên máy chủ, session ID thường được lưu trên máy trình duyệt và có thể bị đánh cắp thông qua các tấn công như session hijacking.
- Sử dụng session là một cách hiệu quả để giữ thông tin người dùng qua nhiều trang web, giúp tạo ra các ứng dụng web đa trang động và tương tác.
---
# 3. Giới thiệu hệ quản trị CSDL MySQL
MySQL là một hệ quản trị cơ sở dữ liệu (DBMS) quan hệ mã nguồn mở phổ biến. Nó được sử dụng rộng rãi trên toàn thế giới để lưu trữ và quản lý dữ liệu trong các ứng dụng web và các hệ thống thông tin doanh nghiệp. Dưới đây là một số điểm quan trọng về MySQL:
### 1. Đặc Điểm Chính:
- **Mã Nguồn Mở:** MySQL là một hệ quản trị cơ sở dữ liệu mã nguồn mở, điều này có nghĩa là mã nguồn của nó có sẵn và có thể được sửa đổi theo nhu cầu cụ thể của người dùng.
- **CSDL Quan hệ:** MySQL là một hệ quản trị cơ sở dữ liệu quan hệ (RDBMS), tức là nó sử dụng các bảng để tổ chức và lưu trữ dữ liệu.
- **Ngôn Ngữ Truy Vấn:** MySQL sử dụng ngôn ngữ truy vấn SQL (Structured Query Language) để thực hiện các thao tác như truy vấn, chèn, cập nhật và xóa dữ liệu.
- **Hiệu Suất Cao:** MySQL được biết đến với hiệu suất cao và khả năng mở rộng, điều này làm cho nó trở thành lựa chọn phổ biến cho các ứng dụng web và dự án có quy mô lớn.
### 2. Tính Năng Quan Trọng:
- **Khả Năng Mở Rộng:** MySQL có khả năng mở rộng dễ dàng, có thể chia tách dữ liệu trên nhiều máy chủ để đáp ứng nhu cầu về mở rộng.
- **Bảo Mật:** Hỗ trợ các tính năng bảo mật như quyền truy cập và chứng thực, giúp bảo vệ dữ liệu khỏi truy cập trái phép.
- **Giao Tiếp Rộng Rãi:** MySQL hỗ trợ nhiều giao thức giao tiếp như TCP/IP, sockets và named pipes, giúp tích hợp với nhiều loại ứng dụng.
- **Tương Thích ANSI SQL:** MySQL tuân theo các tiêu chuẩn SQL của ANSI, điều này giúp nó tương thích với nhiều hệ thống và ngôn ngữ lập trình.
- **Triggers và Stored Procedures:** MySQL hỗ trợ triggers và stored procedures, giúp thực hiện các hành động tự động dựa trên sự kiện xảy ra trong cơ sở dữ liệu.
### 3. Sử Dụng Trong Các Ứng Dụng:
- **Web Development:** MySQL là một lựa chọn phổ biến cho các ứng dụng web, đặc biệt là trong kết hợp với ngôn ngữ lập trình như PHP.
- **Enterprise Solutions:** MySQL cũng được sử dụng trong các hệ thống thông tin doanh nghiệp và các dự án có quy mô lớn.
- **Embedded Systems:** Được tích hợp trong các hệ thống nhúng và thiết bị di động do kích thước nhỏ và hiệu suất cao.
Để thiết lập kết nối giữa PHP và MySQL, bạn sẽ sử dụng một trong các extension phổ biến của PHP như `mysqli` (MySQL Improved) hoặc `PDO` (PHP Data Objects). Dưới đây là hướng dẫn cơ bản về cách thiết lập kết nối này:
### 4. Kết nối tới MySQL với PHP
MySQLi và PDO (PHP Data Objects) là hai phương thức phổ biến trong PHP để kết nối và tương tác với cơ sở dữ liệu. Mặc dù cả hai đều phục vụ mục đích tương tự, chúng có một số khác biệt quan trọng:
#### 1. MySQLi:
1. **Đặc Điểm:**
- Viết tắt của "MySQL Improved".
- Cung cấp cả giao diện lập trình hướng đối tượng (OOP) và giao diện thủ tục.
2. **Tính Năng:**
- Hỗ trợ prepared statements, giúp tăng cường bảo mật và ngăn chặn SQL Injection.
- Có khả năng hỗ trợ các tính năng cụ thể của MySQL, như stored procedures, transactions, và multiple statements.
3. **Hạn Chế:**
- Chỉ làm việc với cơ sở dữ liệu MySQL.
- Không có nhiều tính năng linh hoạt như PDO.
#### 2. PDO (PHP Data Objects):
1. **Đặc Điểm:**
- Là một extension cung cấp giao diện trừu tượng để làm việc với cơ sở dữ liệu.
- Chỉ hỗ trợ giao diện lập trình hướng đối tượng.
2. **Tính Năng:**
- Hỗ trợ nhiều loại cơ sở dữ liệu khác nhau (như MySQL, PostgreSQL, SQLite, v.v.).
- Hỗ trợ prepared statements và có khả năng tạo mã truy vấn linh hoạt hơn.
3. **Lợi Ích:**
- Tốt cho các ứng dụng cần tương thích với nhiều hệ quản trị cơ sở dữ liệu.
- Cung cấp giao diện trừu tượng, giúp dễ dàng chuyển đổi giữa các loại cơ sở dữ liệu.
#### 3. Khi Nào Sử Dụng MySQLi và PDO:
- **Sử Dụng MySQLi Khi:**
- Bạn cần các tính năng cụ thể của MySQL mà PDO không hỗ trợ.
- Dự án của bạn chỉ tương tác với cơ sở dữ liệu MySQL.
- **Sử Dụng PDO Khi:**
- Bạn muốn có khả năng tương thích với nhiều loại cơ sở dữ liệu.
- Bạn muốn tận dụng lợi thế của một API trừu tượng để dễ dàng chuyển đổi giữa các loại cơ sở dữ liệu khác nhau.
---
# 4. Sử dụng MySQLi trong PHP
## 1. Nguyên tắc chung
Để thực hiện các truy vấn vào cơ sở dữ liệu MySQL, bạn cần làm các bước sau
1. **Kết nối tới MySQL Server:** Đầu tiên, tạo một kết nối đến MySQL server.
2. **Tạo Truy Vấn SQL:** Viết một câu lệnh SQL cho mục đích của bạn.
3. **Thực Thi Truy Vấn:** Sử dụng kết nối `mysqli` để thực thi truy vấn tạo cơ sở dữ liệu.
4. **Kiểm Tra và Xử Lý Lỗi:** Kiểm tra kết quả của việc thực thi truy vấn và xử lý các lỗi có thể xảy ra.
## 1. Tạo một database
Để tạo một cơ sở dữ liệu (database) mới sử dụng `mysqli` trong PHP, bạn cần thực hiện các bước sau:
### Bước 1: Kết Nối tới MySQL
```php
$host = 'localhost'; // Hoặc IP của máy chủ cơ sở dữ liệu
$user = 'username'; // Tên người dùng MySQL
$password = 'password'; // Mật khẩu MySQL
// Tạo kết nối
$conn = new mysqli($host, $user, $password);
// Kiểm tra kết nối
if ($conn->connect_error) {
die("Kết nối thất bại: " . $conn->connect_error);
}
```
### Bước 2: Tạo Truy Vấn SQL
```php
$sql = "CREATE DATABASE myNewDatabase";
```
### Bước 3: Thực Thi Truy Vấn
```php
if ($conn->query($sql) === TRUE) {
echo "Cơ sở dữ liệu đã được tạo thành công";
} else {
echo "Lỗi khi tạo cơ sở dữ liệu: " . $conn->error;
}
```
### Bước 4: Đóng Kết Nối
```php
$conn->close();
```
### Lưu Ý:
- Thay đổi các thông số kết nối (`$host`, `$user`, `$password`) cho phù hợp với môi trường cụ thể của bạn.
- Đảm bảo rằng tài khoản MySQL mà bạn sử dụng có quyền tạo cơ sở dữ liệu.
- `myNewDatabase` là tên cơ sở dữ liệu mới mà bạn muốn tạo. Bạn có thể thay đổi tên này theo yêu cầu của mình.
## 2. Tạo bảng
### Bước 1: Kết Nối tới MySQL
```php
$host = 'localhost'; // Hoặc IP của máy chủ cơ sở dữ liệu
$user = 'username'; // Tên người dùng MySQL
$password = 'password'; // Mật khẩu MySQL
$dbname = 'example_database'; // Tên cơ sở dữ liệu
// Tạo kết nối
$conn = new mysqli($host, $user, $password, $dbname);
// Kiểm tra kết nối
if ($conn->connect_error) {
die("Kết nối thất bại: " . $conn->connect_error);
}
```
### Bước 2: Tạo Truy Vấn SQL
```php
$sql = "CREATE TABLE IF NOT EXISTS MyGuests (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
firstname VARCHAR(30) NOT NULL,
lastname VARCHAR(30) NOT NULL,
email VARCHAR(50),
reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)";
```
### Bước 3: Thực Thi Truy Vấn
```php
if ($conn->query($sql) === TRUE) {
echo "Bảng MyGuests đã được tạo thành công";
} else {
echo "Lỗi khi tạo bảng: " . $conn->error;
}
```
### Bước 4: Đóng Kết Nối
```php
$conn->close();
```
### Lưu Ý:
- Thay đổi các thông số kết nối (`$host`, `$user`, `$password`, `$dbname`) cho phù hợp với môi trường cụ thể của bạn.
- Trong truy vấn SQL, `CREATE TABLE IF NOT EXISTS` đảm bảo rằng bảng sẽ chỉ được tạo nếu nó chưa tồn tại trong cơ sở dữ liệu.
- Hãy chắc chắn rằng bạn có quyền truy cập cần thiết để tạo bảng trong cơ sở dữ liệu.
## 3. SELECT
### Bước 1: Kết Nối tới MySQL
```php
$host = 'localhost'; // Hoặc IP của máy chủ cơ sở dữ liệu
$user = 'username'; // Tên người dùng MySQL
$password = 'password'; // Mật khẩu MySQL
$dbname = 'example_database'; // Tên cơ sở dữ liệu
// Tạo kết nối
$conn = new mysqli($host, $user, $password, $dbname);
// Kiểm tra kết nối
if ($conn->connect_error) {
die("Kết nối thất bại: " . $conn->connect_error);
}
```
### Bước 2: Tạo Truy Vấn SQL
```php
$sql = "SELECT id, firstname, lastname FROM MyGuests";
```
### Bước 3: Thực Thi Truy Vấn
```php
$result = $conn->query($sql);
```
### Bước 4: Xử Lý Kết Quả
```php
if ($result->num_rows > 0) {
// Xử lý dữ liệu của mỗi hàng
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>";
}
} else {
echo "Không tìm thấy kết quả";
}
```
### Bước 5: Đóng Kết Nối
```php
$conn->close();
```
### Các cách trả về dữ liệu từ câu lệnh SELECT
Trong `mysqli` (MySQL Improved), có một số phương thức (methods) để lấy dữ liệu từ kết quả của truy vấn SQL. Dưới đây là một số phương thức fetch thông dụng:
#### 1. `fetch_assoc()`
- Phương thức này trả về **một hàng** dưới dạng mảng kết hợp (associative array), nơi mỗi khóa của mảng tương ứng với tên cột trong cơ sở dữ liệu.
- Ví dụ: `$row = $result->fetch_assoc();`
#### 2. `fetch_row()`
- Phương thức này trả về **một hàng** dưới dạng mảng số (numeric array), nơi mỗi giá trị có thể được truy cập bằng một chỉ số mảng số.
- Ví dụ: `$row = $result->fetch_row();`
#### 3. `fetch_array()`
- Phương thức này kết hợp hai phương thức trên, có thể trả về mảng kết hợp, mảng số hoặc cả hai, tùy thuộc vào tham số được chọn (`MYSQLI_ASSOC`, `MYSQLI_NUM`, `MYSQLI_BOTH`). => **Ít dùng, bỏ qua**
- Ví dụ: `$row = $result->fetch_array(MYSQLI_ASSOC);`
#### 4. `fetch_object()`
- Phương thức này trả về **một đối tượng**, nơi thuộc tính của đối tượng tương ứng với các cột trong hàng.
- Ví dụ: `$obj = $result->fetch_object();`
#### 5. `fetch_all()`
- Trả về **tất cả các hàng trong kết quả** dưới dạng một mảng của các hàng. Mỗi hàng có thể là một mảng kết hợp, mảng số, hoặc cả hai, tùy thuộc vào tham số được chọn.
- Ví dụ: `$allRows = $result->fetch_all(MYSQLI_ASSOC);`
#### 6. `fetch_field()`
- Trả về thông tin của một trường cụ thể trong tập kết quả.
- Ví dụ: `$fieldinfo = $result->fetch_field();`
#### 7. `fetch_field_direct()`
- Lấy thông tin về một trường cụ thể dựa trên chỉ mục.
- Ví dụ: `$fieldinfo = $result->fetch_field_direct($columnNumber);`
#### 8. `fetch_fields()`
- Trả về một mảng các đối tượng đại diện cho thông tin trường của tập kết quả.
- Ví dụ: `$fields = $result->fetch_fields();`
### Nên sử dụng: fetch_all()
Sử dụng `fetch_all` với tham số `MYSQLI_ASSOC` trong `mysqli` giúp bạn lấy tất cả kết quả của một truy vấn dưới dạng một mảng các mảng liên kết, trong đó mỗi mảng liên kết biểu diễn một hàng dữ liệu và bạn có thể truy cập các trường dữ liệu thông qua tên cột của chúng.
#### Ví dụ:
Giả sử bạn có một bảng `users` trong cơ sở dữ liệu MySQL với các cột `id`, `name`, và `email`.
```php
<?php
// Kết nối với cơ sở dữ liệu
$mysqli = new mysqli("localhost", "username", "password", "database");
// Kiểm tra kết nối
if ($mysqli->connect_error) {
echo "Failed to connect to MySQL: " . $mysqli->connect_error;
exit();
}
// Thực hiện truy vấn
$query = "SELECT id, name, email FROM users";
$result = $mysqli->query($query);
// Kiểm tra kết quả truy vấn
if ($result) {
// Lấy tất cả các hàng dưới dạng mảng các mảng liên kết
$rows = $result->fetch_all(MYSQLI_ASSOC);
// Duyệt qua từng hàng
foreach ($rows as $row) {
// Truy cập dữ liệu bằng tên cột
echo "ID: " . $row['id'] . " - Name: " . $row['name'] . " - Email: " . $row['email'] . "<br>";
}
// Giải phóng bộ nhớ cho tập kết quả
$result->free();
} else {
echo "No records found!";
}
// Đóng kết nối cơ sở dữ liệu
$mysqli->close();
?>
```
Trong ví dụ này, `fetch_all(MYSQLI_ASSOC)` trả về một mảng của các mảng liên kết. Mỗi mảng con biểu diễn một hàng dữ liệu từ bảng `users`, và bạn có thể truy cập các trường dữ liệu bằng tên cột, như `$row['id']`, `$row['name']`, và `$row['email']`. Điều này làm cho code trở nên rõ ràng và dễ đọc hơn.
## 8. INSERT, UPDATE, DELETE
Để thực hiện các câu lệnh `INSERT`, `UPDATE`, và `DELETE` sử dụng `mysqli` trong PHP, bạn có thể làm theo các bước dưới đây. Những câu lệnh này được dùng để thêm, cập nhật, và xóa dữ liệu trong cơ sở dữ liệu MySQL.
### 1. Kết Nối tới MySQL
Đầu tiên, tạo một kết nối tới cơ sở dữ liệu MySQL:
```php
$host = 'localhost'; // Hoặc IP của máy chủ cơ sở dữ liệu
$user = 'username'; // Tên người dùng MySQL
$password = 'password'; // Mật khẩu MySQL
$dbname = 'example_database'; // Tên cơ sở dữ liệu
$conn = new mysqli($host, $user, $password, $dbname);
if ($conn->connect_error) {
die("Kết nối thất bại: " . $conn->connect_error);
}
```
### 2. INSERT - Thêm Dữ Liệu
```php
$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com')";
if ($conn->query($sql) === TRUE) {
echo "Bản ghi mới đã được thêm";
} else {
echo "Lỗi: " . $sql . "<br>" . $conn->error;
}
```
#### *Lấy ID tự tăng vừa được tạo*
Ngay sau khi thực hiện truy vấn `INSERT`, sử dụng thuộc tính `insert_id` của đối tượng `mysqli` để lấy ID cuối cùng được chèn:
```php
$last_id = $conn->insert_id;
echo "Last inserted ID is: " . $last_id;
```
### 3. UPDATE - Cập Nhật Dữ Liệu
```php
$sql = "UPDATE MyGuests SET lastname='Doe Updated' WHERE id=2";
if ($conn->query($sql) === TRUE) {
echo "Bản ghi đã được cập nhật";
} else {
echo "Lỗi: " . $sql . "<br>" . $conn->error;
}
```
### 4. DELETE - Xóa Dữ Liệu
```php
$sql = "DELETE FROM MyGuests WHERE id=3";
if ($conn->query($sql) === TRUE) {
echo "Bản ghi đã được xóa";
} else {
echo "Lỗi: " . $sql . "<br>" . $conn->error;
}
```
### 5. Multy query
Trong PHP, phương thức `multi_query` của đối tượng `mysqli` cho phép bạn thực thi nhiều truy vấn SQL cùng một lúc. Điều này hữu ích khi bạn cần thực hiện một loạt các truy vấn, chẳng hạn như cập nhật nhiều bảng hoặc thực hiện một chuỗi các truy vấn liên tiếp.
#### Dưới đây là cách sử dụng `multi_query`:
Tạo một chuỗi chứa nhiều truy vấn, phân tách chúng bằng **dấu chấm phẩy (;)**, và sử dụng `multi_query` để thực thi chúng:
```php
$sql = "INSERT INTO table1 (column1) VALUES ('value1');";
$sql .= "UPDATE table2 SET column2='value2' WHERE id=1;";
$sql .= "DELETE FROM table3 WHERE id=2;";
// Thực hiện multi query
if ($conn->multi_query($sql)) {
echo "Chuỗi câu lệnh đã được thực hiện";
} else {
echo "Error: " . $mysqli->error;
}
```
### 3. Đóng Kết Nối
Sau khi thực hiện các truy vấn, đừng quên đóng kết nối:
```php
$mysqli->close();
```
### 5. Đóng Kết Nối
Sau khi thực hiện các truy vấn, đừng quên đóng kết nối:
```php
$conn->close();
```
## 8. SQL Injection
**SQL Injection** là một loại tấn công bảo mật trong đó kẻ tấn công cố gắng thực hiện các truy vấn SQL độc hại thông qua các đầu vào của người dùng trong một ứng dụng web. Mục đích của tấn công này thường là để truy cập hoặc thao túng cơ sở dữ liệu của ứng dụng.
### 1. Ví dụ về SQL Injection
Giả sử bạn có một ứng dụng web với một trang đăng nhập, nơi người dùng nhập tên người dùng và mật khẩu. Phía server, ứng dụng thực hiện một truy vấn SQL để kiểm tra thông tin đăng nhập:
```php
$username = 'abcd';
# Đúng ra phải làm: $username = str_replace("'", "''", $username);
$sql = "SELECT * FROM users
WHERE username = '$username' AND password = '$password'";
```
Ở đây, `$username` và `$password` là các giá trị nhập vào từ form đăng nhập. Một người dùng thông thường có thể nhập:
```
username: john
password: 12345
```
Tuy nhiên, một kẻ tấn công có thể nhập:
```
username: ' OR '1'='1
password: ' OR '1'='1
```
Điều này biến truy vấn SQL thành:
```sql
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '' OR '1'='1'
```
Vì `'1'='1'` luôn đúng, truy vấn này sẽ trả về tất cả người dùng trong bảng `users`, làm cho kẻ tấn công có thể đăng nhập vào ứng dụng mà không cần biết mật khẩu thực sự.
### 2. Phòng Chống SQL Injection
1. **Sử dụng Prepared Statements**: Trong PHP, điều này có thể được thực hiện thông qua `mysqli` hoặc `PDO` để tránh việc thực thi trực tiếp các giá trị nguy hiểm trong truy vấn SQL.
2. **Validation và Sanitization của Đầu Vào**: Kiểm tra và làm sạch dữ liệu đầu vào để loại bỏ các ký tự đặc biệt hoặc mã độc.
3. **Hạn Chế Quyền Truy Cập Cơ sở Dữ liệu**: Đảm bảo rằng tài khoản cơ sở dữ liệu mà ứng dụng web sử dụng chỉ có những quyền cần thiết để thực hiện các nhiệm vụ của nó.
4. **Sử dụng Các Công Cụ Bảo Mật**: Các công cụ như Web Application Firewalls (WAFs) có thể giúp phát hiện và chặn các nỗ lực tấn công SQL Injection.
Bằng cách thực hiện những bước trên, bạn có thể làm giảm đáng kể nguy cơ bị tấn công SQL Injection.
## 9. Sử dụng Prepared Statements
Sử dụng Prepared Statements trong PHP với mysqli là một cách hiệu quả để truy vấn dữ liệu một cách an toàn, giúp ngăn chặn các cuộc tấn công SQL Injection. Dưới đây là cách sử dụng Prepared Statements để thực hiện các truy vấn SELECT, INSERT, UPDATE, và DELETE.
### 1. Kết Nối tới MySQL
```php
$host = 'localhost'; // Hoặc IP của máy chủ cơ sở dữ liệu
$user = 'username'; // Tên người dùng MySQL
$password = 'password'; // Mật khẩu MySQL
$dbname = 'example_database'; // Tên cơ sở dữ liệu
$conn = new mysqli($host, $user, $password, $dbname);
if ($conn->connect_error) {
die("Kết nối thất bại: " . $conn->connect_error);
}
```
### 2. SELECT - Truy Vấn Dữ Liệu
```php
$stmt = $conn->prepare("SELECT id, firstname, lastname
FROM MyGuests WHERE lastname = ?");
$stmt->bind_param("s", $lastname);
$lastname = 'Doe';
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
echo $row['id'] . ' ' . $row['firstname'] . ' ' . $row['lastname'] . "<br>";
}
$stmt->close();
```
## 10. Sử dụng Prepared Statements trong câu lệnh Insert, Update, Delete
Dưới đây là cách sử dụng Prepared Statements trong PHP với `mysqli` để thực hiện các thao tác thêm (INSERT), sửa (UPDATE), và xoá (DELETE) dữ liệu trong cơ sở dữ liệu.
### 1. Kết Nối MySQL
Trước tiên, bạn cần thiết lập kết nối với MySQL:
```php
$host = 'localhost';
$user = 'username';
$password = 'password';
$dbname = 'your_database';
// Tạo kết nối
$conn = new mysqli($host, $user, $password, $dbname);
// Kiểm tra kết nối
if ($conn->connect_error) {
die("Kết nối thất bại: " . $conn->connect_error);
}
```
### 2. INSERT - Thêm Dữ Liệu
```php
$stmt = $conn->prepare("INSERT INTO table_name (column1, column2) VALUES (?, ?)");
$stmt->bind_param("ss", $value1, $value2);
$value1 = 'Data 1';
$value2 = 'Data 2';
$stmt->execute();
echo "Thêm dữ liệu thành công.";
$stmt->close();
```
### 3. UPDATE - Sửa Dữ Liệu
```php
$stmt = $conn->prepare("UPDATE table_name SET column1 = ?, column2 = ? WHERE id = ?");
$stmt->bind_param("ssi", $value1, $value2, $id);
$value1 = 'Data 1 updated';
$value2 = 'Data 2 updated';
$id = 1; // ID của bản ghi cần cập nhật
$stmt->execute();
echo "Cập nhật dữ liệu thành công.";
$stmt->close();
```
### 4. DELETE - Xoá Dữ Liệu
```php
$stmt = $conn->prepare("DELETE FROM table_name WHERE id = ?");
$stmt->bind_param("i", $id);
$id = 1; // ID của bản ghi cần xoá
$stmt->execute();
echo "Xoá dữ liệu thành công.";
$stmt->close();
```
### 5. Đóng Kết Nối
```php
$conn->close();
```