# LESSON 3
## 1. Giới thiệu về PDO và Prepared Statements
PDO (PHP Data Objects) là một thư viện cung cấp giao diện chung để làm việc với nhiều hệ quản trị cơ sở dữ liệu khác nhau như MySQL, PostgreSQL, SQLite, v.v.
Prepared Statements giúp ngăn chặn SQL Injection và tối ưu hóa hiệu suất khi thực hiện truy vấn nhiều lần với các giá trị khác nhau.
## 2. Cấu hình kết nối đến cơ sở dữ liệu
Trước khi chèn dữ liệu, chúng ta cần tạo kết nối đến cơ sở dữ liệu MySQL bằng PDO.
``` PHP
<?php
$host = 'localhost';
$dbname = 'testdb';
$username = 'root';
$password = '';
try {
// Tạo kết nối PDO
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password);
// Thiết lập chế độ lỗi để hiển thị lỗi PDO
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Kết nối thành công!";
} catch (PDOException $e) {
die("Lỗi kết nối: " . $e->getMessage());
}
?>
```
## 3. Chèn dữ liệu bằng Prepared Statements
### Bước 1: Tạo bảng users trong MySQL
``` SQL
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
age INT NOT NULL
);
```
### Bước 2: Viết mã PHP để chèn dữ liệu
``` PHP
<?php
// Kết nối đến cơ sở dữ liệu
$host = 'localhost';
$dbname = 'testdb';
$username = 'root';
$password = '';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Câu lệnh SQL sử dụng Prepared Statement
$sql = "INSERT INTO users (name, email, age) VALUES (:name, :email, :age)";
// Chuẩn bị truy vấn
$stmt = $pdo->prepare($sql);
// Dữ liệu cần chèn
$name = "Nguyen Van A";
$email = "nguyenvana@example.com";
$age = 25;
// Gán giá trị vào các tham số
$stmt->bindParam(':name', $name);
$stmt->bindParam(':email', $email);
$stmt->bindParam(':age', $age);
// Thực thi câu lệnh
if ($stmt->execute()) {
echo "Thêm dữ liệu thành công!";
} else {
echo "Thêm dữ liệu thất bại!";
}
} catch (PDOException $e) {
die("Lỗi: " . $e->getMessage());
}
?>
```
## 4. Chèn dữ liệu từ biểu mẫu (Form)
### 4.1 Tạo Form
``` HTML
<form action="insert.php" method="POST">
<label>Họ và Tên:</label>
<input type="text" name="name" required>
<label>Email:</label>
<input type="email" name="email" required>
<label>Tuổi:</label>
<input type="number" name="age" required>
<button type="submit">Thêm</button>
</form>
```
### 4.2 Lấy dữ liệu từ form và chèn vào database
``` PHP
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
try {
$pdo = new PDO("mysql:host=localhost;dbname=testdb;charset=utf8", "root", "");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "INSERT INTO users (name, email, age) VALUES (:name, :email, :age)";
$stmt = $pdo->prepare($sql);
// Lấy dữ liệu từ form
$name = $_POST['name'];
$email = $_POST['email'];
$age = $_POST['age'];
// Gán giá trị và thực thi
$stmt->execute(['name' => $name, 'email' => $email, 'age' => $age]);
echo "Thêm dữ liệu thành công!";
} catch (PDOException $e) {
die("Lỗi: " . $e->getMessage());
}
}
?>
```
## 5 Phong cách OOP
### 5.1 Tạo ra lớp Database
``` PHP
<?php
class Database
{
private $host = "localhost";
private $dbname = "testdb";
private $username = "root";
private $password = "";
private $pdo;
public function __construct()
{
try {
$this->pdo = new PDO("mysql:host={$this->host};dbname={$this->dbname};charset=utf8", $this->username, $this->password);
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("Lỗi kết nối: " . $e->getMessage());
}
}
public function getConnection()
{
return $this->pdo;
}
}
```
### Tạo ra lớp User
``` PHP
class User
{
private $pdo;
public function __construct(Database $database)
{
$this->pdo = $database->getConnection();
}
public function insertUser($name, $email, $age)
{
try {
$sql = "INSERT INTO users (name, email, age) VALUES (:name, :email, :age)";
$stmt = $this->pdo->prepare($sql);
$stmt->execute(['name' => $name, 'email' => $email, 'age' => $age]);
return "Thêm dữ liệu thành công!";
} catch (PDOException $e) {
return "Lỗi: " . $e->getMessage();
}
}
}
```
### Dữ liệu từ Form
``` PHP
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$database = new Database();
$user = new User($database);
$name = $_POST['name'] ?? '';
$email = $_POST['email'] ?? '';
$age = $_POST['age'] ?? '';
echo $user->insertUser($name, $email, $age);
}
```