You are a helpful assistant.
system
Phát triển tập lệnh PHP kết nối với cơ sở dữ liệu MySQL và truy xuất tất cả các bản ghi từ bảng có tên "sản phẩm", đồng thời tích hợp xử lý lỗi, phân trang, và tùy chọn lọc, hiển thị dữ liệu trong bảng HTML với các tùy chọn định dạng đa dạng và chú thích cho sự rõ ràng, đồng thời sử dụng các câu lệnh đã chuẩn bị để tăng cường bảo mật.
user
Để phát triển một tập lệnh PHP kết nối với cơ sở dữ liệu MySQL và truy xuất tất cả các bản ghi từ bảng "sản phẩm", đồng thời tích hợp xử lý lỗi, phân trang, và tùy chọn lọc, bạn có thể làm theo hướng dẫn dưới đây. Tập lệnh này cũng sử dụng các câu lệnh đã chuẩn bị để tăng cường bảo mật.

```php
<?php
// Thông tin kết nối cơ sở dữ liệu
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "database_name";

// Kết nối đến cơ sở dữ liệu
$conn = new mysqli($servername, $username, $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);
}

// Thiết lập phân trang
$limit = 10; // Số bản ghi trên mỗi trang
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$start = ($page - 1) * $limit;

// Tùy chọn lọc
$filter = isset($_GET['filter']) ? $_GET['filter'] : '';

// Câu lệnh SQL với lọc và phân trang
$sql = "SELECT * FROM sản phẩm WHERE tên_sản_phẩm LIKE ? LIMIT ?, ?";
$stmt = $conn->prepare($sql);
$filter_param = "%" . $filter . "%";
$stmt->bind_param("sii", $filter_param, $start, $limit);

// Thực thi câu lệnh
$stmt->execute();
$result = $stmt->get_result();

// Hiển thị dữ liệu trong bảng HTML
echo "<table border='1'>
<tr>
<th>ID</th>
<th>Tên sản phẩm</th>
<th>Giá</th>
<th>Mô tả</th>
</tr>";

while ($row = $result->fetch_assoc()) {
    echo "<tr>";
    echo "<td>" . htmlspecialchars($row['id']) . "</td>";
    echo "<td>" . htmlspecialchars($row['tên_sản_phẩm']) . "</td>";
    echo "<td>" . htmlspecialchars($row['giá']) . "</td>";
    echo "<td>" . htmlspecialchars($row['mô_tả']) . "</td>";
    echo "</tr>";
}
echo "</table>";

// Tính tổng số trang
$sql_total = "SELECT COUNT(*) FROM sản phẩm WHERE tên_sản_phẩm LIKE ?";
$stmt_total = $conn->prepare($sql_total);
$stmt_total->bind_param("s", $filter_param);
$stmt_total->execute();
$result_total = $stmt_total->get_result();
$total_records = $result_total->fetch_array()[0];
$total_pages = ceil($total_records / $limit);

// Hiển thị phân trang
for ($i = 1; $i <= $total_pages; $i++) {
    echo "<a href='?page=$i&filter=" . urlencode($filter) . "'>$i</a> ";
}

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

### Giải thích:
1. **Kết nối cơ sở dữ liệu**: Sử dụng `mysqli` để kết nối với cơ sở dữ liệu MySQL.
2. **Phân trang**: Sử dụng biến `$limit` để xác định số bản ghi trên mỗi trang và tính toán vị trí bắt đầu của bản ghi cho mỗi trang.
3. **Tùy chọn lọc**: Sử dụng tham số `filter` để lọc các sản phẩm theo tên.
4. **Câu lệnh đã chuẩn bị**: Sử dụng `prepare` và `bind_param` để bảo vệ chống lại SQL Injection.
5. **Hiển thị dữ liệu**: Dữ liệu được hiển thị trong bảng HTML với các cột tương ứng.
6. **Phân trang**: Tính toán tổng số trang và tạo liên kết để chuyển đổi giữa các trang.

Hãy đảm bảo thay thế các thông tin kết nối cơ sở dữ liệu (`$servername`, `$username`, `$password`, `$dbname`) bằng thông tin thực tế của bạn.
assistant