Quản lý cơ sở dữ liệu (database) trong PHP
- 11-03-2023
- Toanngo92
- 0 Comments
Các ứng dụng web PHP hầu như sẽ đều phải cần làm việc dữ liệu. Ứng dụng giỏ hàng trong trang bán hàng, hiển thị và xử lý biểu mẫu đăng nhập, ứng dụng đặt lịch, xem phim … là những ví dụ phổ biến sẽ cần làm việc với dữ liệu.
Dữ liệu này sẽ được lưu trữ trong cơ sở dữ liệu với mục đích lưu trữ, truy xuất và duy trì dữ liệu đó thông qua các tập lệnh, PHP hỗ trợ nhiều hệ thống quản lý cơ sở dữ liệu bao gồm MySQL, MariaDB, Db2, MongoDB, Oracle, PostgreSQL, SQLite.
Mục lục
Giới thiệu database MySQL
Được phát triển đầu tiên bởi Oracle, MySQL là một Hệ thống quản lý cơ sở dữ liệu quan hệ (RDBMS), là một phần mềm mã nguồn mở và miễn phí. MySQL chủ yếu sử dụng SQL tiêu chuẩn và chạy trên máy chủ cùng với việc được sử dụng trong phát triển ứng dụng Web. Đặc biệt nhanh, dễ sử dụng và đáng tin cậy, nó giúp tổ chức dữ liệu trong cơ sở dữ liệu và là lựa chọn lý tưởng cho các ứng dụng lớn và nhỏ.
Trong MySQL, dữ liệu được lưu trữ trong các bảng. Một bảng có thể được định nghĩa là một tập hợp dữ liệu có các hàng và cột. Cơ sở dữ liệu có thể lưu trữ thông tin một cách phân loại. Ví dụ: cơ sở dữ liệu của một công ty có thể có các bảng khác nhau như Nhân sự, Khách hàng, Sản phẩm, Đơn hàng, v.v.
Điều kiện sử dụng Cơ sở dữ liệu trong PHP
Điều kiện tiên quyết để sử dụng cơ sở dữ liệu MySQL trong PHP 8 là phải hỗ trợ mysqli. Thông thường, nếu cài đặt xampp thành công, chỉ cần start 2 dịch vụ apache và mysql trên giao diện là có thể sử dụng. Nếu mysql không được cấu hình theo mặc định và máy đã cài đặt PHP và MySQL thủ công, người dùng có thể định cấu hình php.ini như sau:
Xác định vị trí dòng extension=mysqli và bỏ ký tự ghi chú “;”
Tìm dòng mysqli.default_port và đặt thành 3306 ( xác định cổng dịch vụ mysql đang chạy) và lưu tập tin.
Sau đó, khởi động lại php, web server và mysql.
Xác minh thông qua phpMyAdmin rằng MySQL đang chạy. Nếu đã cài đặt xampp, mặc định phpMyAdmin đã được cài đặt sẵn, chúng ta truy cập thông qua đường dẫn:
http://localhost/phpmyadmin
Hướng dẫn chi tiết cài đặt xampp và kiểm tra mySQL, phpMyAdmin chi tiết: https://hocvietcode.com/huong-dan-dat-xampp-tren-may-tinh-chi-tiet-tung-buoc/
Kết nối cơ sở dữ liệu MySQL thông qua PHP script
Để thiết lập kết nối thành công với MySQL để làm việc với PHP, người dùng sẽ yêu cầu tên người dùng và mật khẩu. Các tập lệnh PHP với MySQL có thể được viết bằng các cách tiếp cận khác nhau. Sau đây là những cách chính để làm việc với MySQL và PHP:
- MySQLi: Đây là một phần mở rộng được cập nhật hoặc cải tiến được sử dụng để truy cập và làm việc với cơ sở dữ liệu MySQL. MySQLi cung cấp hai loại giao diện, hướng đối tượng (dựa trên khái niệm đối tượng) và thủ tục (dựa trên lập trình có cấu trúc hoặc thủ tục).
- PHP Data Object (PDO): Đây là một phần mở rộng sử dụng một lớp trừu tượng cơ sở dữ liệu để hỗ trợ MySQL và cung cấp interface (lớp giao tiếp/giao diện) cho người dùng làm việc với nhiều cơ sở dữ liệu. Nó cung cấp thêm tính linh hoạt trong cách dữ liệu được trả về. Cách tiếp cận này nhằm mục đích tạo ra một API chung cho tất cả các truy cập cơ sở dữ liệu.
Hàm mysqli_connect()
Trước PHP 8, tiện ích mở rộng mysql_connect() đã được sử dụng để hoạt động với các tập lệnh PHP. Tuy nhiên, kể từ phiên bản 8, hàm này đã deprecated. Giờ đây, Tiện ích mở rộng được cải tiến của MySQL (MySQLi), là trình điều khiển cơ sở dữ liệu hỗ trợ làm cầu nối giữa cơ sở dữ liệu MySQL và tập lệnh PHP được khuyến nghị sử dụng.
Hàm mysqli_connect() trong PHP được sử dụng để kết nối với cơ sở dữ liệu MySQL. Nó có thể trả về một tài nguyên, tùy thuộc vào việc kết nối không có giá trị hay được thiết lập thành công.
Xem thêm: https://www.php.net/function.mysqli-connect
Cú pháp:
resource mysqli_connect (username, servername, password)
Trong đó, tên người dùng là tên tài khoản của người dùng sẽ được sử dụng để kết nối với cơ sở dữ liệu, máy chủ là tên máy chủ hoặc địa chỉ IP và mật khẩu là mật khẩu MySQL để xác thực kết nối. Các tham số truyền vào hàm mysqli_connect() được gọi chung là chuỗi kết nối. Điều này bao gồm tên người dùng, tên máy chủ và mật khẩu. Số cổng và tên cơ sở dữ liệu cũng có thể được cung cấp trong chuỗi kết nối nếu được yêu cầu.
Ví dụ:
$host = "localhost";
$username = "root";
$password = "root";
$conn = mysqli_connect($host, $username, $password);
if (!$conn) {
die("Could not connect to database: " . mysqli_connect_error());
}
echo "Connection to database is successful";
mysqli_close($conn);
Trong đoạn mã trên hàm mysqli_connect() dựng sẵn của PHP được sử dụng để kết nối với cơ sở dữ liệu. Các biến máy chủ, tên người dùng và mật khẩu được truyền vào. Ở đây, không có cơ sở dữ liệu cụ thể nào được đề cập trong chuỗi kết nối, do đó, kết nối được thiết lập với instance cơ sở dữ liệu (có thể hiểu là đã thiết lập một kết nối nhưng chưa chạy lệnh use database).
Nếu cổng MySQL khác với cổng mặc định là 3306, người dùng phải cung cấp số cổng làm tham số, sau tên cơ sở dữ liệu.
Cần đảm bảo các giá trị là chính xác, kết nối với cơ sở dữ liệu sẽ được thiết lập. Mặt khác, hàm die() bên trong câu lệnh if được gọi và thông báo lỗi Không thể kết nối với cơ sở dữ liệu.
Ngoài ra, có thể sử dụng cách dưới (viết theo phong cách hướng đối tượng) để làm tác vụ tương tự là thiết lập kết nối với CSDL như sau:
<?php
// database credentials
$host = "localhost";
$username = "root";
$password = "root";
// mysqli object-oriented approach
$conn = new mysqli($host, $username, $password);
// check if connection is successful
if ($conn->connect_error) {
die("Could not connect to database: " . $conn->connect_error);
} else {
echo "Connection to database is successful";
}
// close database connection
$conn->close();
?>
Ngoài ra, có thể sử dụng PDO để kết nối CSDL, Ví dụ:
$host = 'localhost';
// $dbname = 'mydatabase';
$username = 'root';
$password = '';
try {
$conn = new PDO("mysql:host=$host", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected successfully";
dd($conn);
} catch(PDOException $e) {
echo "Connection failed: " . $e->getMessage();
}
Tạo và xóa database MySQL bằng PHP
Tạo database MySQL
Để tạo cơ sở dữ liệu MySQL bằng cách sử dụng câu lệnh CREATE DATABASE
Ví dụ theo phong cách functional
<?php
// Define connection credentials
$servername = "localhost";
$username = "root";
$password = "";
// Create connection
$conn = mysqli_connect($servername, $username, $password);
// Check connection
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully";
// Create database
$sql = "CREATE DATABASE myDB";
$result = mysqli_query($conn, $sql);
if ($result) {
echo "Database created successfully";
} else {
echo "Error creating database: " . mysqli_error($conn);
}
mysqli_close($conn);
?>
Hoặc sử dụng theo phong cách hướng đối tượng, từ các ví dụ sau, mình sẽ sử dụng phong cách này để demo:
<?php
// Define connection credentials
$servername = "localhost";
$username = "root";
$password = "";
// Create connection
$conn = new mysqli($servername, $username, $password);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";
// Create database
$sql = "CREATE DATABASE myDB";
$res = $conn->query($sql);
if ($res === TRUE) {
echo "Database created successfully";
} else {
echo "Error creating database: " . $conn->error;
}
$conn->close();
?>
Trong ví dụ trên, trước tiên chúng ta xác định thông tin đăng nhập kết nối như tên máy chủ, tên người dùng và mật khẩu. Sau đó, chúng ta tạo một đối tượng MySQLi mới và truyền các thông tin xác thực mới khai báo phía trên làm tham số để thiết lập kết nối.
Sau đó, chúng ta kiểm tra kết nối, nếu không thành công, chúng ta sẽ chấm dứt tập lệnh bằng cách in ra giá trị hàm die(), nếu kết nối được thiết lập thành công thì nó sẽ hiển thị “Đã kết nối thành công”.
Cuối cùng, chúng ta chạy truy vấn trên đối tượng $sql bằng phương thức query() để tạo cơ sở dữ liệu “myDB” trong máy chủ MySQL của phpMyAdmin. Tham số truyền vào phương thức query() này là chuỗi lệnh theo cú pháp kịch bản SQL hợp lệ. Nếu thực thi thành công, giá trị trả về true mang ý nghĩa truy vấn thành công, nếu không sẽ trả về false.
Xóa database MySQL
Tương tự với tạo database, chúng ta có thể xóa database thông qua lệnh DROP DATABASE của MySQL.
Ví dụ phía dưới mô phỏng giải pháp để xóa database, ở đây có sự khác biệt khi kết nối với CSDL. Với tình huống tạo database, chúng ta chỉ truyền vào hàm khởi tạo mysqli 3 tham số, với tình huống này là 4 tham số, với tham số cuối là tên database. Điều này tương tự với nghiệp vụ kết nối CSDL sau đó use database khi tương tác với CSDL trực tiếp. Ngoài cách này ra, chúng ta vẫn có thể sử dụng cách sau:
$conn = new mysqli($servername, $username, $password);
$conn->select_db("db_name");
Ví dụ:
// Define connection credentials
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "myDB";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// Drop database
$sql = "DROP DATABASE myDB";
if ($conn->query($sql) === TRUE) {
echo "Database dropped successfully";
} else {
echo "Error dropping database: " . $conn->error;
}
$conn->close();
Tạo bảng trong database MySQL
Sử dụng câu lệnh CREATE TABLE để tạo bảng trong MySQL.
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "myDB";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// Create table
$sql = "CREATE TABLE users (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30) NOT NULL,
email VARCHAR(50) NOT NULL,
password VARCHAR(255) NOT NULL,
registerdate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)";
if ($conn->query($sql) === TRUE) {
echo "Table users created successfully";
} else {
echo "Error creating table: " . $conn->error;
}
$conn->close();
?>
Chèn dữ liệu và truy xuất dữ liệu vào/từ database MySQL
Khi bảng và database đã được tạo trong MySQL, người dùng có thể chèn thêm dữ liệu vào và truy xuất dữ liệu từ cơ sở dữ liệu MySQL bằng MySQLi.
Chèn dữ liệu vào cơ sở dữ liệu MySQL
Để thêm các bản ghi mới vào bảng MySQL, có thể sử dụng câu lệnh INSERT INTO.
Cú pháp:
INSERT INTO table_name (column1, column2, column3,...)
VALUES (value1, value2, value3,...)
Ví dụ:
<?php
// Create a new mysqli instance and connect to the database
$conn = new mysqli('localhost', 'root', '', 'mydb');
// Check for connection errors
if ($conn->connect_errno) {
echo "Failed to connect to MySQL: " . $conn->connect_error;
exit();
}
// Set the values of the variables to be used in the query
$name = "John Doe";
$email = "john@example.com";
$password = password_hash("mypassword", PASSWORD_DEFAULT);
// Prepare the SQL statement with placeholders for the values
$query = "INSERT INTO users (name, email, password) VALUES ('$name', '$email', '$password')";
$conn->query($query);
// Check for insertion errors
if ($conn->errno) {
echo "Failed to insert new user: " . $conn->error;
exit();
}
echo "New user inserted successfully";
// Close the prepared statement and database connection
$conn->close();
Ví dụ sử dụng bind param để tăng bảo mật:
<?php
// Create a new mysqli instance and connect to the database
$conn = new mysqli('localhost', 'username', 'password', 'database');
// Check for connection errors
if ($conn->connect_errno) {
echo "Failed to connect to MySQL: " . $conn->connect_error;
exit();
}
// Prepare the SQL statement with placeholders for the values
$query = "INSERT INTO users (name, email, password) VALUES (?, ?, ?)";
// Create a prepared statement object
$stmt = $conn->prepare($query);
// Set the values of the variables to be used in the query
$name = "John Doe";
$email = "john@example.com";
$password = password_hash("mypassword", PASSWORD_DEFAULT);
// Bind the values to the prepared statement parameters as strings
$stmt->bind_param("sss", $name, $email, $password);
// Execute the insert query
$stmt->execute();
// Check for insertion errors
if ($stmt->errno) {
echo "Failed to insert new user: " . $stmt->error;
exit();
}
echo "New user inserted successfully";
// Close the prepared statement and database connection
$stmt->close();
$conn->close();
Trong một ứng dụng thực tế, các giá trị đầu vào sẽ được lấy bằng các biểu mẫu HTML, thay vì code cứng như ví dụ trên. Các giá trị này sẽ được ghi lại thông qua tập lệnh PHP và sẽ được thêm vào bảng MySQL. Có thể kiểm tra các hàng được chèn vào bảng bằng cách đăng nhập vào phpMyAdmin và kiểm tra các bảng cơ sở dữ liệu.
Chèn nhiều bản ghi vào database
Khi người dùng có nhiều câu lệnh SQL cần thực thi, họ có thể sử dụng hàm mysqli_multi_query() theo phong cách functional hoặc phương thức multi_query() theo phong cách hướng đối tượng. Ví dụ:
<?php
//connect to your database first
$host = "localhost";
$username = "yourusername";
$password = "yourpassword";
$dbname = "yourdbname";
$conn = new mysqli($host, $username, $password, $dbname);
//check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
//create your SQL query for inserting multiple rows of data
$sql = "INSERT INTO users (name, email, password)
VALUES ('John','john@example.com','john123'),
('Jane','jane@example.com','jane123'),
('Billy','billy@example.com', 'billy456')";
//execute the multi_query method
if ($conn->multi_query($sql) === TRUE) {
echo "Multiple records created successfully";
} else {
echo "Error creating records: " . $conn->error;
}
//close the connection
$conn->close();
?>
Lấy ra ID bản ghi sau khi chèn dữ liệu vào database
Nếu thao tác chèn hoặc cập nhật trên bảng được thực hiện cùng với trường AUTO_INCREMENT, thì có thể lấy ngay ID của bản ghi được chèn hoặc cập nhật lần cuối (lần gần nhất).
Ví dụ:
<?php
// Establish a connection to the database.
$conn = new mysqli('localhost', 'root', '', 'a2209g');
// Check for errors.
if ($conn->connect_error) {
die('Connect Error (' . $conn->connect_errno . ') '
. $conn->connect_error);
}
// Run your query to insert data into the table
$query = "INSERT INTO users(name, email, password) VALUES('value1', 'value2', 'value3')";
if ($conn->query($query)) {
// Retrieve the last inserted ID.
$id_inserted = $conn->insert_id;
echo "The last inserted ID is: " . $id_inserted;
} else {
echo "Error: " . $query . "<br>" . $conn->error;
}
// Close the connection.
$conn->close();
Truy xuất dữ liệu từ database MySQL
PHP cho phép người dùng truy xuất dữ liệu từ cơ sở dữ liệu MySQL. Câu lệnh SELECT có thể được sử dụng trong tập lệnh PHP để chọn và tìm nạp dữ liệu từ một hoặc nhiều bảng.
Hàm mysqli_fetch_array(),mysqli_fetch_assoc() theo phong cách functional được sử dụng để truy vấn, với phong cách hướng đội tượng . Trong hàm này, hàng được trả về dưới dạng một mảng số hoặc một mảng kết hợp. Trong một số trường hợp, hàng được trả về dưới dạng cả mảng số và mảng kết hợp. Trong trường hợp không còn bản ghi nào nữa, MySQL sẽ trả về giá trị false.
Cả mysqli_fetch_assoc() và mysqli_fetch_array() đều có thể được sử dụng để tìm nạp các hàng từ bảng cơ sở dữ liệu MySQL. Tuy nhiên, chúng có sự khác nhau trong cách triển khai:
mysqli_fetch_assoc(): trả về một mảng kết hợp của hàng đã tìm nạp. Điều này có nghĩa là bạn có thể truy cập từng giá trị trường theo tên cột của nó. Ví dụ:
$result = mysqli_query($conn, "SELECT name, age FROM users WHERE id=1");
$row = mysqli_fetch_assoc($result);
echo $row['name']; // output: the name of the user with id=1
mysqli_fetch_array(): trả về một mảng chứa cả khóa số và khóa kết hợp cho hàng được tìm nạp. Điều này có nghĩa là bạn có thể truy cập từng giá trị trường theo tên cột hoặc chỉ mục số của nó. Bạn cũng có thể chỉ định loại mảng sẽ trả về bằng các tham số tùy chọn ($resulttype), các tùy chọn có thể là MYSQLI_BOTH, MYSQLI_NUM, MYSQLI_ASSOC. Ví dụ:
$result = mysqli_query($conn, "SELECT name, age FROM users WHERE id=1");
$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
echo $row['name']; // output: the name of the user with id=1
$row = mysqli_fetch_array($result, MYSQLI_NUM);
echo $row[0]; // output: the name of the user with id=1
Ví dụ:
SELECT column_name(s) FROM table_name
// or
SELECT * FROM table_name
Ví dụ theo phong cách functional:
// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
// Construct the SQL statement
$sql = "SELECT id, name, email FROM users";
// Execute the query and get result set
$result = mysqli_query($conn, $sql);
// Check if any rows were returned
if (mysqli_num_rows($result) > 0) {
// Loop through each row in the result set
while ($row = mysqli_fetch_assoc($result)) {
echo "id: " . $row["id"] . " - Name: " . $row["name"] . " - Email: " . $row["email"] . "<br>";
}
} else {
echo "No results found.";
}
// Close the database connection
mysqli_close($conn);
Ví dụ theo phong cách OOP:
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "myDB";
// Create a new mysqli object
$conn = new mysqli($servername, $username, $password, $dbname);
// Check if connection was successful
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// Construct the SQL statement
$sql = "SELECT id, name, email FROM users";
// Execute the query
$result = $conn->query($sql);
// Check if any rows were returned
if ($result->num_rows > 0) {
// Loop through each row in the result set
// while ($row = $result->fetch_assoc()) {
// echo "id: " . $row["id"] . " - Name: " . $row["name"] . " - Email: " . $row["email"] . "<br>";
// }
// cach 2
$lstRecord = $result->fetch_all(MYSQLI_ASSOC);
foreach($lstRecord as $record){
echo "id: " . $record["id"] . " - Name: " . $record["name"] . " - Email: " . $record["email"] . "<br>";
}
} else {
echo "No results found.";
}
// Close the database connection
$conn->close();
Cập nhật dữ liệu trong database MySQL
Để cập nhật dữ liệu vào bảng MySQL, người dùng có thể thực thi câu lệnh UPDATE thông qua hàm PHP mysqli_query.
Ví dụ:
// Create a new mysqli object
$conn = new mysqli($servername, $username, $password, $dbname);
// Check if connection was successful
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// Construct the SQL statement
$sql = "UPDATE users SET name='John Doe', email='john.doe@example.com' WHERE id=1";
// Execute the query
if ($conn->query($sql) === TRUE) {
echo "Record updated successfully";
} else {
echo "Error updating record: " . $conn->error;
}
// Close the database connection
$conn->close();
Để xác nhận việc dữ liệu được cập nhật thành công, có thể chuyển tới bảng trong phpMyAdmin để xác minh bản ghi đã cập nhật.
Backup database bằng PHP
Thường xuyên sao lưu cơ sở dữ liệu là một phương pháp lý tưởng cho người dùng. Để sao lưu cơ sở dữ liệu MySQL, có ba tùy chọn để backup database như sau:
- Sử dụng lệnh SQL thông qua PHP
- Sử dụng mysqldump nhị phân MySQL thông qua PHP
- Sử dụng giao diện người dùng phpmyadmin
Backup database thông qua PHP
Để lấy toàn bộ kết xuất cơ sở dữ liệu, sẽ có yêu cầu viết truy vấn riêng cho các bảng khác nhau. Mỗi bảng này sẽ được lưu trữ trong một tệp văn bản duy nhất.
Ví dụ:
// Connection settings
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "mydatabase";
// Tables to backup
$tables = array("users", "orders", "products");
// File to write backup to
$backup_file = "backup.sql";
// Connect to database
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// Set charset
$conn->set_charset("utf8mb4");
// Backup each table
foreach ($tables as $table) {
// Construct query to get table structure and data
$query = "SELECT * INTO OUTFILE '$backup_file' FROM `$table`";
// Execute query
if (!$conn->query($query)) {
die("Error backing up table `$table`: " . $conn->error);
}
echo "Table `$table` backed up successfully.<br>";
}
// Close connection
$conn->close();
Mã này kết nối với máy chủ và cơ sở dữ liệu MySQL của bạn và thiết lập một mảng các bảng để sao lưu. Sau đó, nó lặp qua từng bảng, xây dựng một truy vấn để kết xuất cấu trúc bảng và dữ liệu vào một tệp bên ngoài (trong trường hợp này là biến $backup_file) và thực hiện truy vấn. Nếu có bất cứ điều gì sai, nó sẽ chết với một thông báo lỗi. Nếu không, nó lặp lại một thông báo thành công. Cuối cùng, nó đóng kết nối với máy chủ MySQL.
Bạn có thể sửa đổi biến $backup_file để chỉ định đường dẫn cho tệp đầu ra, chẳng hạn như “../backups/backup.sql” để ghi tệp sao lưu vào thư mục có tên backups cao hơn thư mục hiện tại một cấp.
Lưu ý rằng ví dụ này không bao gồm bất kỳ quá trình lọc hoặc đánh giá nào đối với các tên bảng đã chỉ định, cũng như bất kỳ hoạt động làm sạch dữ liệu nào đối với đường dẫn tệp hoặc đầu vào của người dùng. Đảm bảo xác thực và làm sạch tất cả đầu vào trong quá trình triển khai thực tế của bạn.
Restore database thông qua PHP
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = file_get_contents('path/to/backup.sql');
if ($conn->multi_query($sql) === TRUE) {
while ($conn->more_results() && $conn->next_result()) { /* Do nothing with remaining results */ }
echo 'Database restored successfully';
} else {
echo "Error restoring database: " . $conn->error;
}
$conn->close();
Backup database bằng mysqldump thông qua PHP
MySQL cung cấp tiện ích dòng lệnh mysqldump, để thực hiện sao lưu cơ sở dữ liệu. Sử dụng tiện ích này người dùng có thể triển khai kết xuất cơ sở dữ liệu hoàn chỉnh trong một lệnh.
<?php
$dbhost = "localhost"; // fixed the typo in localhos!
$username = "root";
$password = "root";
$dbname = "sample2DB"; // corrected variable name
$backup_file = $dbname . date("Y-m-d-H-i-s") . '.gz';
// constructed full mysqldump command with variables directly
$command = "mysqldump --opt -h{$dbhost} -u{$username} -p{$password} $dbname | gzip > {$backup_file}";
system($command);
echo "Data backed up successfully";
?>
Trong ví dụ trên, mysqldump để thực hiện sao lưu cơ sở dữ liệu trong một lệnh duy nhất. Tại đây, máy chủ, người dùng và mật khẩu của cơ sở dữ liệu sample2DB đang được chuyển và dữ liệu trong cơ sở dữ liệu được sao lưu vào một tệp. system() là một hàm PHP để thực thi các lệnh bên ngoài. Vì mysqldump là một tiện ích dòng lệnh bên ngoài thường chạy từ môi trường dòng lệnh, nên để gọi nó qua PHP, người dùng phải gọi system(). Tệp sao lưu được tạo trong chuỗi backup_file sẽ được thay thế trong chuỗi lệnh sau đó được truyền đến hàm system.
Backup database bằng giao diện thông qua phpMyAdmin
Nếu giao diện người dùng phpMyAdmin có sẵn, để thực hiện sao lưu CSDL, hãy nhấp vào liên kết export trên trang chính của phpMyadmin. Từ các tùy chọn có sẵn, chọn bất kỳ tùy chọn cơ sở dữ liệu nào mà người dùng muốn sao lưu, và nên xem qua các tùy chọn SQL khác nhau và nhập tên tệp sao lưu .
Chọn và lọc dữ liệu từ bảng trong MySQL
Việc thêm bộ lọc vào truy vấn đảm bảo rằng chỉ những dữ liệu bắt buộc mới được hiển thị trong kết quả truy vấn. Sắp xếp giúp sắp xếp các hàng trong kết quả truy vấn theo thứ tự mang lại ý nghĩa cho dữ liệu sẽ được sử dụng. Mệnh đề LIMIT giúp giới hạn kết quả và phân trang bằng SQL và rất hữu ích khi làm việc trên các bảng lớn.
Ba mệnh đề được sử dụng cho các mục đích này:
- WHERE
- ORDER BY
- LIMIT
Mệnh đề WHERE
Mệnh đề WHERE được sử dụng trong truy vấn MySQL để lọc các bản ghi và giữ khóa chính trong bảng. Khi một trường dữ liệu cụ thể được tìm nạp, thì một tên trường khác có giá trị của một bảng sẽ được cung cấp. Điều này đảm bảo rằng cơ sở dữ liệu có thể tìm kiếm và tìm phần tử hàng mà nó phải tìm nạp hoặc chọn. Chỉ những bản ghi đáp ứng các điều kiện cụ thể mới được trích xuất bởi mệnh đề WHERE.
Cú pháp:
SELECT column_name(s) FROM table_name WHERE column_name
Ví dụ:
// Database connection variables
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "example_db";
// Create database connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check for errors
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT * FROM users WHERE age >= 18";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"] . " - Name: " . $row["name"] . " - Email: " . $row["email"] . " - Age: " . $row["age"] . "<br>";
}
} else {
echo "0 results";
}
Mệnh đề ORDER BY
Cú pháp:
SELECT column_name(s) FROM table name ORDER BY column_name(s) ASC | DESC
Ví dụ:
// Create a mysqli object with credentials: host, username, password, and database name
$conn = new mysqli("localhost", "username", "password", "my_database");
// Check for connection errors
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// Prepare SQL query
$sql = "SELECT * FROM my_table ORDER BY column_name DESC";
// Execute the SQL query
$result = $conn->query($sql);
// Check if result has one or more rows
if ($result->num_rows > 0) {
// Loop through the rows in the result set
while($row = $result->fetch_assoc()) {
echo "Column 1: " . $row["column_name_1"] . "<br>";
echo "Column 2: " . $row["column_name_2"] . "<br>";
// Output additional columns as needed
}
} else {
echo "0 results";
}
// Close the database connection
$conn->close();
Mệnh đề LIMIT
Khi một số lượng lớn bản ghi được trả về, nó có thể ảnh hưởng đến hiệu suất tổng thể. Mệnh đề LIMIT được sử dụng để giới hạn các hàng được trả về trong truy vấn MySQL ở một số cụ thể. Mệnh đề LIMIT hữu ích khi làm việc với các bảng lớn, vì việc giúp cho việc hiển thị kết quả trải nghiệm tốt hơn cho người dùng.
Ví dụ:
// connect to the database
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
$conn = new mysqli($servername, $username, $password, $dbname);
// check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// select data with LIMIT
$sql = "SELECT * FROM myTable LIMIT 10";
$result = $conn->query($sql);
// output data of each row
while($row = $result->fetch_assoc()) {
echo "ID: " . $row["id"]. " - Name: " . $row["name"]. " - Email: " . $row["email"]. "<br>";
}
$conn->close();
Giả sử rằng người dùng muốn chọn bản ghi từ 11-20. Trong trường hợp này, hãy sử dụng OFFSET. Truy vấn SQL sau chỉ định rằng nó sẽ chỉ trả về 10 bản ghi, bắt đầu từ bản ghi 11 (OFFSET 10).
<?php
// Database connection variables
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "mydb";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// Set the offset and limit variables
$offset = 10;
$limit = 10;
// Construct the query using OFFSET and LIMIT
$sql = "SELECT * FROM mytable OFFSET $offset LIMIT $limit";
// Execute the query and fetch the results
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// Output data of each row
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - Name: " . $row["name"]. "<br>";
}
} else {
echo "0 results";
}
// Close the database connection
$conn->close();
?>
Ngoài ra, có thể sử dụng cú pháp ngắn hơn như sau:
<?php
// Database connection variables
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "mydb";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// Set the offset and limit variables
$offset = 10;
$limit = 10;
// Construct the query using OFFSET and LIMIT
$sql = "SELECT * FROM mytable LIMIT $offset, $limit";
// Execute the query and fetch the results
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// Output data of each row
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - Name: " . $row["name"]. "<br>";
}
} else {
echo "0 results";
}
// Close the database connection
$conn->close();
?>
Bài tập
Bài1:
In ra bảng QLSV với yêu cầu sau:
- Tạo kết nối với CSDL, tạo database có tên QLSV
- Tạo 3 bảng sinhvien,lop,monhoc với các cột tương ứng bằng PHP, lưu ý: sinhvien có khóa ngoại cột class_id tham chiếu đến bảng lop.
- Môt bảng chung student_subject thể hiện mqh nhiều nhiều giữa student và subjects
- Khi người dùng bấm vào thêm môn và thêm lớp, chuyển sang trang themmon.php và themlop.php đêể ng dùng có thể thêm lớp học và môn học mới
- Thêm 3 bản ghi vào CSDL cho mỗi bảng bằng PHP
- Sử dụng vòng lặp để duyệt và in ra html bảng sinh viên
- Khi bấm vào nút thêm SV (sử dụng kiêến thức bài get hoặc post) thêm 1 hàng sinh viên vào CSDL.