Trong các ứng dụng hiện nay, cơ sở dữ liệu (CSDL) luôn đóng một vai trò rất quan trọng trong việc lưu trữ và quản lý dữ liệu. Việc cấu hình và tương tác với các CSDL một cách hợp lý sẽ mang lại một trải nghiệm tốt hơn cho khách hàng. Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu về CSDL trong PHP, cách tương tác với nó trong PHP, một ngôn ngữ lập trình phổ biến trong phát triển web.

1. Tại sao lại sử dụng MySQL trong PHP

Hiện nay, rất nhiều lập trình viên vẫn đang tin dùng CSDL MySQL. Một phần vì sự thuận tiện, đồng thời cũng là sự thân thiện dễ tiếp cận mà nó mang lại cho các lập trình viên. Sau đây, chúng ta sẽ cùng nhau tìm hiểu một số lý do mà chúng ta nên sử dụng MySQL trong PHP:

  • Miễn phí và mã nguồn mở: Vì là một hệ quản trị cơ sở dữ liệu mã nguồn mở, chúng ta hoàn toàn có thể sử dụng MySQL mà không cần phải trả bất kỳ chi phí nào. Điều này là một trong những lý do quan trọng để nó trở thành lựa chọn hàng đầu đối với các dự án có ngân sách hạn chế.
  • Phổ biến và ổn định: Là một trong những CSDL ra đời và được tin dùng từ lâu. Việc tìm hiểu tài liệu về MySQL rất dễ dàng, đi kèm với đó là một cộng đồng sử dụng lớn và hỗ trợ kỹ thuật đáng tin cậy. Chúng khiến cho MySQL ngày càng được tin tưởng và khó thay thế.
  • Tương thích với nhiều ngôn ngữ lập trình: Với việc có khả năng tương thích với nhiều ngôn ngữ lập trình ngoài PHP, nó mang lại sự linh hoạt khi cần phát triển các hệ thống hay ứng dụng đa nền tảng.
  • Hiệu suất cao: Đi kèm với sự thuận tiện, MySQL cũng được thiết kế để đạt được hiệu suất cao và có khả năng xử lý hàng nghìn truy vấn mỗi giây. Điều này giúp các lập trình viên có thể xử lý các dữ liệu lớn và phức tạp một cách dễ dàng hơn.
  • Hỗ trợ ACID: MySQL hỗ trợ các tính chất ACID (Atomicity, Consistency, Isolation, Durability), giúp đảm bảo tính nhất quán và an toàn của dữ liệu trong quá trình thực hiện các giao dịch.
  • Cộng đồng lớn và hỗ trợ: Với sự tin tưởng lớn của rất nhiều lập trình viên, đồng thời nó mang lại cho MySQL các cộng đồng với các diễn đàn, tài liệu và nguồn thông tin trực tuyến để các lập trình viên có thể giải quyết vấn đề và nắm vững việc sử dụng MySQL một cách dễ dàng hơn.

Phía trên là một số những lý do mà chúng ta nên tìm hiểu, sử dụng MySQL như một CSDL chính trong ứng dụng của chúng ta. Ngoài những gì cơ bản mà CSDL mang lại thì MySQL mang lại một sự tin tưởng và an toàn nhờ cộng đồng hỗ trợ lớn mà nó mang lại. Tiếp theo, chúng ta sẽ cùng nhau tìm hiểu cách kết nối với MySQL trong PHP.

>>> Xem thêm các bài viết trong chuỗi bài về ngôn ngữ lập trình PHP:

2. Kết nối MySQL trong PHP

Trong PHP có rất nhiều cách để chúng ta có thể kết nối đến CSDL MySQL với PHP, chúng ta có một số cách phổ biến, an toàn và thường được sử dụng là dùng extension mysqli (MySQL Improved) hoặc PDO (PHP Data Objects). Sau đây ta sẽ tìm hiểu cách sử dụng chúng để có thể kết nối với CSDL MySQL trong PHP.

2.1. Sử dụng MySQLi (MySQL Improved) trong PHP

<?php
$server = "localhost"; // IP hoặc domain kết nối để CSDL
$username = "username"; // Người dùng sử dụng để kết nối đến CSDL với PHP
$password = "password"; // Mật khẩu sử dụng để kết nối đến CSDL với PHP
$database = "database"; // Tên database

// Kết nối đến MySQL với PHP sử dụng MySQLi
$conn = new mysqli($server, $username, $password, $database);

// Kiểm tra kết nối
if ($conn->connect_error) {
    die("Kết nối thất bại: " . $conn->connect_error);
}

echo "Kết nối thành công";

// Thực hiện các truy vấn và công việc khác ở đây

// Đóng kết nối
$conn->close();

2.2. Sử dụng PDO (PHP Data Objects) trong PHP

<?php
$server = "localhost"; // IP hoặc domain kết nối để CSDL
$username = "username"; // Người dùng sử dụng để kết nối đến CSDL với PHP
$password = "password"; // Mật khẩu sử dụng để kết nối đến CSDL với PHP
$database = "database"; // Tên database

try {
    // Kết nối đến MySQL với PHP sử dụng PDO
    $conn = new PDO("mysql:host=$server;dbname=$database", $username, $password);

    // Thiết lập chế độ lỗi và ngoại lệ
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Kết nối thành công";

    // Thực hiện các truy vấn và công việc khác ở đây

    // Đóng kết nối
    $conn = null;
} catch (PDOException $e) {
    echo "Kết nối thất bại: " . $e->getMessage();
}

2.3. Sự khác biệt chính giữa MySQLi và PDO

 

MySQLi

PDO

Loại CSDL hỗ trợChủ yếu được thiết kế để hoạt động với CSDL MySQLHoạt động với 12 hệ thống CSDL khác nhau (MySQL, PostgreSQL, SQLite, MSSQL, ...)
Cú phápSử dụng cú pháp hướng đối tượng (Object-Oriented) và cú pháp dựa trên thủ tục (Procedural)Sử dụng cú pháp hướng đối tượng
Tính năng- Hỗ trợ prepared statements và transactions
- Cung cấp nhiều tính năng mạnh mẽ như multiple statements trong một lần thực thi
-Hỗ trợ prepared statements và transactions
- Đồng nhất với một API cho nhiều loại cơ sở dữ liệu
Bảo mậtCả hai đều hỗ trợ prepared statements, giúp ngăn chặn tấn công như SQL injection. Điều này làm cho cả hai extension đều có khả năng bảo mật tốt nếu được sử dụng đúng cách 
Hiệu SuấtThường thì MySQL được đánh giá là nhanh hơn so với PDO vì nó thiết kế để tương thích nhiều hơn với MySQLKhông tận dụng được hết tính năng của từng hệ quản trị cơ sở dữ liệu
Khả Năng Mở RộngHạn chế mở rộng với các loại CSDL khác ngoài MySQLLinh hoạt chuyển đổi giữa các loại CSDL có thể sử dụng

Bảng trên là một số những sự khác biệt giữa MySQLiPDO thông thường việc chọn cách nào để kết nối đến CSDL với PHP là hoàn toàn tùy thuộc vào định hướng phát triển của mỗi dự án. Trong hướng dẫn này chúng ta sẽ làm việc với MySQLi cách kết nối phổ biến hơn và luôn được ưu tiên tiếp cận cho những người mới bắt đầu trong việc kết nối CSDL MySQL trong PHP.

3. Chèn dữ liệu vào trong cơ sở dữ liệu

Trong PHP chúng ta có thể chèn dữ liệu vào bảng theo 2 cách sau đây:

- Chèn dữ liệu vào bảng

<?php
// Dữ liệu cần thêm
$company = "Stringee";
$email = "info@stringee.com";
$year = 2023;

// Truy vấn INSERT
$sql = "INSERT INTO information (company, email, year) VALUES ('$company', '$email', $year)";
$result = $conn->query($sql);

if ($result === TRUE) {
    echo "Inserted";
} else {
    echo "Error: " . $conn->error;
}

- Chèn dữ liệu vào bảng sử dụng Prepared statement

<?php
// Dữ liệu cần thêm
$company = "Stringee";
$email = "info@stringee.com";
$year = 2023;

// Truy vấn INSERT
$sql = "INSERT INTO information (company, email, year) VALUES (?, ?, ?)";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ssi", $company, $email, $year);

if ($stmt->execute()) {
    echo "Inserted";
} else {
    echo "Error: " . $stmt->error;
}

// Close statement
$stmt->close();

4. Cập nhật dữ liệu trong cơ sở dữ liệu

- Cập nhật dữ liệu

<?php
// Dữ liệu cần cập nhật
$id = 1;
$new_year = 2024;

// Truy vấn UPDATE
$sql = "UPDATE information SET year = $new_year WHERE id = $id";
$result = $conn->query($sql);

if ($result === TRUE) {
    echo "Updated";
} else {
    echo "Error: " . $conn->error;
}

- Cập nhật dữ liệu sử dụng Prepared statement

<?php
// Dữ liệu cần cập nhật
$id = 1;
$new_year = 2024;

// Truy vấn UPDATE với Prepared Statement
$sql = "UPDATE information SET year = ? WHERE id = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("ii", $new_year, $id);

if ($stmt->execute()) {
    echo "Updated";
} else {
    echo "Error: " . $stmt->error;
}

// Đóng statement
$stmt->close();

5. Truy vấn dữ liệu trong cơ sở dữ liệu

- Truy vấn dữ liệu

<?php
// Truy vấn SELECT
$sql = "SELECT id, company, email, year FROM information";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    // Xuất dữ liệu từ mỗi hàng
    while ($row = $result->fetch_assoc()) {
        echo "ID: " . $row["id"]. " - Company: " . $row["company"]. " - Email: " . $row["email"]. " - Năm: " . $row["year"]. "<br>";
    }
} else {
    echo "No data";
}

- Truy vấn dữ liệu sử dụng Prepared Statement

<?php
// Dữ liệu cần tìm kiếm
$year = 2020;

// Truy vấn SELECT với WHERE clause và Prepared Statement
$sql = "SELECT id, company, email, year FROM information WHERE year > ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $year);
$stmt->execute();
$result = $stmt->get_result();

if ($result->num_rows > 0) {
    // Xuất dữ liệu từ mỗi hàng
    while ($row = $result->fetch_assoc()) {
        echo "ID: " . $row["id"]. " - Company: " . $row["company"]. " - Email: " . $row["email"]. " - Year: " . $row["year"]. "<br>";
    }
} else {
    echo "No data";
}

// Đóng statement
$stmt->close();

6. Xóa dữ liệu trong cơ sở dữ liệu

- Xóa dữ liệu

<?php
// ID của dữ liệu cần xóa
$id = 1;

// Truy vấn DELETE
$sql = "DELETE FROM information WHERE id = $id";
$result = $conn->query($sql);

if ($result === TRUE) {
    echo "Deleted";
} else {
    echo "Error: " . $conn->error;
}

- Xóa dữ liệu sử dụng Prepared Statement

<?php
// ID của dữ liệu cần xóa
$id = 1;

// Truy vấn DELETE với Prepared Statement
$sql = "DELETE FROM information WHERE id = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $id);

if ($stmt->execute()) {
    echo "Deleted";
} else {
    echo "Error: " . $stmt->error;
}

// Đóng statement
$stmt->close();

7. Một số lưu ý quan trọng khi truy vấn dữ liệu trong PHP

  • Sử dụng Prepared Statements: Luôn luôn sử dụng Prepared Statements là một việc rất quan trọng để ngăn chặn tấn công SQL injection. Điều này giúp bảo vệ ứng dụng khỏi những sự tấn công từ những người dùng có ác ý thông qua phương pháp SQL injection.
  • Kiểm tra lỗi: Cần đặt hàm kiểm tra lỗi ở những vị trí thích hợp để đảm bảo không có lỗi xảy ra trong quá trình thực thi chương trình. Hàm mysqli_error() là một trong những hàm thông dụng trong việc kiểm tra những lỗi này.
  • Đóng kết nối đúng cách: Thông thường các lập trình viên thường xuyên bỏ quên, hay xem nhẹ việc đóng kết nối đến CSDL khi đã sử dụng xong. Chúng ta nên sử dụng hàm $conn->close() để thực hiện việc đóng kết nối để đảm bảo giải phóng tài nguyên đã sử dụng và tránh rò rỉ bộ nhớ.
  • Xử lý kết quả: Luôn kiểm tra kết quả được trả ra từ câu truy vấn. Sử dụng các hàm như mysqli_num_rows() để kiểm tra số hàng được trả về hoặc mysqli_fetch_assoc() để lấy dữ liệu từ mỗi hàng.
  • Xử lý dữ liệu đầu vào: Việc người dùng nhập liệu vào những dữ liệu độc hại cho hệ thống là một việc sẽ thường xuyên gặp phải trong quá trình làm việc với hệ thống. Việc sử dụng các hàm như mysqli_real_escape_string() có thể giúp chúng ta giảm thiểu được tình trạng này xảy ra cho ứng dụng của mình.
  • Bảo mật mật khẩu: Chúng ta không nên lưu trực tiếp mật khẩu CSDL trong mã nguồn chương trình. Thông thường những dữ liệu nhạy cảm này sẽ được lưu trong các file cấu hình riêng, bằng cách này sẽ giúp giảm thiểu việc lộ thông tin kết nối trực tiếp đến CSDL.
  • Tối ưu hóa truy vấn: Tuy CSDL đã được tối ưu hóa rất nhiều qua các phiên bản. Nhưng, việc sử dụng các cột một các có tính toán, đồng thời là đặt các index cho các cột thường xuyên sử dụng, và xử lý kích thước trang kết quả sẽ giúp cho việc truy vấn trở nên tối ưu hơn.

Tổng kết

Kết nối đến CSDL trong PHP là một bước rất quan trọng trong quá trình phát triển ứng dụng web. Việc nắm vững cách thức kết nối cũng như thao tác sẽ giúp lập trình viên có thể tăng hiệu suất ứng dụng, đồng thời còn tăng độ tin cậy cũng như tính bảo mật cho ứng dụng của bản thân. Hy vọng thông qua những thông tin trên sẽ giúp các bạn có thể tiếp cận tốt hơn với CSDL trong PHP. Hẹn gặp lại các bạn trong các bài viết sắp tới.


Stringee Communication APIs là giải pháp cung cấp các tính năng giao tiếp như gọi thoại, gọi video, tin nhắn chat, SMS hay tổng đài CSKH cho phép tích hợp trực tiếp vào ứng dụng/website của doanh nghiệp nhanh chóng. Nhờ đó giúp tiết kiệm đến 80% thời gian và chi phí cho doanh nghiệp bởi thông thường nếu tự phát triển các tính năng này có thể mất từ 1 - 3 năm.

Bộ API giao tiếp của Stringee hiện đang được tin dùng bởi các doanh nghiệp ở mọi quy mô, lĩnh vực ngành nghề như TPBank, VOVBacsi24, VNDirect, Shinhan Finance, Ahamove, Logivan, Homedy,  Adavigo, bTaskee…

Quý bạn đọc quan tâm xin mời đăng ký NHẬN TƯ VẤN TẠI ĐÂY: