Tìm hiểu cơ sở dữ liệu trong PHP
Kết nối và tương tác với cơ sở dữ liệu là một phần quan trọng của lập trình PHP. PHP cung cấp nhiều cách để làm việc với cơ sở dữ liệu, phổ biến nhất là sử dụng MySQL hoặc MariaDB thông qua phần mở rộng PDO.
Kết nối với cơ sở dữ liệu
Sử dụng PDO
PDO (PHP Data Objects) là một phần mở rộng cung cấp một giao diện nhất quán để truy cập nhiều cơ sở dữ liệu khác nhau.
Kết nối với cơ sở dữ liệu
$dsn = "mysql:host=localhost;dbname=database";
$username = "username";
$password = "password";
try {
$pdo = new PDO($dsn, $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected successfully";
} catch (PDOException $e) {
echo "Connection failed: " . $e->getMessage();
}
Thực hiện các truy vấn cơ sở dữ liệu
Thực hiện truy vấn SELECT
$sql = "SELECT id, name, email FROM users";
$stmt = $pdo->query($sql);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo "id: " . $row["id"]. " - Name: " . $row["name"]. " - Email: " . $row["email"]. "<br>";
}
Thực hiện truy vấn INSERT
$sql = "INSERT INTO users (name, email) VALUES (:name, :email)";
$stmt = $pdo->prepare($sql);
$stmt->execute(['name' => 'John Doe', 'email' => 'john@example.com']);
echo "New record created successfully";
Sử dụng các tham số chuẩn bị (Prepared Statements)
Sử dụng PDO
$sql = "INSERT INTO users (name, email) VALUES (:name, :email)";
$stmt = $pdo->prepare($sql);
$stmt->execute(['name' => 'John Doe', 'email' => 'john@example.com']);
echo "New record created successfully";
Đóng kết nối cơ sở dữ liệu
Sử dụng PDO
$pdo = null;
Demo
<?php
class Database {
private $host = "localhost";
private $dbname = "your_database";
private $username = "your_username";
private $password = "your_password";
private $pdo;
// Constructor to establish database connection
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);
$this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (PDOException $e) {
die("Connection failed: " . $e->getMessage());
}
}
// Create (Insert) operation
public function createUser($name, $email) {
try {
$sql = "INSERT INTO users (name, email) VALUES (:name, :email)";
$stmt = $this->pdo->prepare($sql);
// $stmt->bindParam(':name', $name);
$stmt->execute([
':name' => $name,
':email' => $email
]);
return $this->pdo->lastInsertId();
} catch (PDOException $e) {
throw new Exception("Error creating user: " . $e->getMessage());
}
}
// Read (Select) operation
public function getUser($id) {
try {
$sql = "SELECT * FROM users WHERE id = :id";
$stmt = $this->pdo->prepare($sql);
$stmt->execute([':id' => $id]);
return $stmt->fetch();
} catch (PDOException $e) {
throw new Exception("Error fetching user: " . $e->getMessage());
}
}
// Read all records
public function getAllUsers() {
try {
$sql = "SELECT * FROM users ORDER BY name ASC";
$stmt = $this->pdo->prepare($sql);
$stmt->execute();
return $stmt->fetchAll();
} catch (PDOException $e) {
throw new Exception("Error fetching users: " . $e->getMessage());
}
}
// Update operation
public function updateUser($id, $name, $email) {
try {
$sql = "UPDATE users SET name = :name, email = :email WHERE id = :id";
$stmt = $this->pdo->prepare($sql);
return $stmt->execute([
':id' => $id,
':name' => $name,
':email' => $email
]);
} catch (PDOException $e) {
throw new Exception("Error updating user: " . $e->getMessage());
}
}
// Delete operation
public function deleteUser($id) {
try {
$sql = "DELETE FROM users WHERE id = :id";
$stmt = $this->pdo->prepare($sql);
return $stmt->execute([':id' => $id]);
} catch (PDOException $e) {
throw new Exception("Error deleting user: " . $e->getMessage());
}
}
// Close connection
public function __destruct() {
$this->pdo = null;
}
}
// Example usage
try {
$db = new Database();
// Create a new user
$newUserId = $db->createUser("John Doe", "john@example.com");
echo "New user created with ID: " . $newUserId . "\n";
// Read a single user
$user = $db->getUser($newUserId);
print_r($user);
// Read all users
$users = $db->getAllUsers();
print_r($users);
// Update user
$db->updateUser($newUserId, "John Updated", "john.updated@example.com");
echo "User updated successfully\n";
// Delete user
$db->deleteUser($newUserId);
echo "User deleted successfully\n";
} catch (Exception $e) {
echo "Error: " . $e->getMessage();
}
?>
<!-- Example HTML form to interact with the database -->
<form method="POST" action="">
<input type="text" name="name" placeholder="Enter name" required>
<input type="email" name="email" placeholder="Enter email" required>
<button type="submit">Add User</button>
</form>
<?php
// Handle form submission
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
try {
$db = new Database();
$db->createUser($_POST['name'], $_POST['email']);
echo "User added successfully!";
} catch (Exception $e) {
echo "Error: " . $e->getMessage();
}
}
?>
Best Practices to Avoid SQL Injection
Sử dụng Prepared Statements
Prepared Statements là cách tốt nhất để tránh SQL Injection. Chúng đảm bảo rằng các biến được truyền vào truy vấn SQL được xử lý đúng cách.
Ví dụ với PDO
$sql = "SELECT * FROM users WHERE email = :email";
$stmt = $pdo->prepare($sql);
$stmt->execute(['email' => 'john@example.com']);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo $row['name'];
}
Validate and Sanitize User Input
Luôn luôn kiểm tra và làm sạch dữ liệu đầu vào của người dùng trước khi sử dụng nó trong truy vấn SQL.
Ví dụ
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if ($email === false) {
die("Invalid email address");
}
Kết luận
Kết nối và tương tác với cơ sở dữ liệu là một phần quan trọng của lập trình PHP. Bằng cách hiểu và sử dụng phần mở rộng PDO, bạn có thể thực hiện các thao tác cơ sở dữ liệu một cách hiệu quả và an toàn. Sử dụng các tham số chuẩn bị (Prepared Statements) cũng giúp bảo vệ ứng dụng của bạn khỏi các cuộc tấn công SQL Injection.