01/10/2018, 16:53

Bài 06: Insert nhiều records bằng PHP

Trong bài viết trước chúng ta được được học thêm mới dữ liệu vào MySQL sử dụng PHP thông qua hàm INSERT INTO. Thì MySQL cung cấp khả năng khá hay cho phép chúng ta thêm nhiều records trong một câu query. Trong thư viện MySQLi hỗ trợ hai hàm dùng để thực hiện nhiều câu lệnh truy vấn đó là hàm ...

Trong bài viết trước chúng ta được được học thêm mới dữ liệu vào MySQL sử dụng PHP thông qua hàm INSERT INTO. Thì MySQL cung cấp khả năng khá hay cho phép chúng ta thêm nhiều records trong một câu query.

Trong thư viện MySQLi hỗ trợ hai hàm dùng để thực hiện nhiều câu lệnh truy vấn đó là hàm mysqli_multi_query() đối với trường hợp dùng Procedural và phương thức multi_query() đối với trường hợp dùng Object-oriented.

Riêng đối với PDO thì ta phải thực hiện khác chút xíu đó là phải hợp transaction và mỗi lần mỗi câu truy vấn chứ không phải là chạy cùng lúc.

Dùng MySQLi Object-oriented.

$host = "localhost";
$username = "root";
$password = "";
$dbName = "MySQLDemo";

// Tạo kết nối
$dbconn = new mysqli($host, $username, $password, $dbName);

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

// Câu lệnh Insert
$sql = "INSERT INTO News (title, slug, intro)
VALUES ('Học lập trình PHP', 'hoc-lap-trinh-php', 'Giới thiệu về học lập trình PHP');";
$sql .= "INSERT INTO MyGuests (title, slug, intro)
VALUES ('Học lập trình PHP', 'hoc-lap-trinh-mysql', 'Giới thiệu về học lập trình MySQL');";
$sql .= "INSERT INTO MyGuests (title, slug, intro)
VALUES ('Học lập trình JQuery', 'hoc-lap-trinh-jquery', 'Giới thiệu về học lập trình JQuery')";

// Thực hiện
if ($dbconn->multi_query($sql) === TRUE) {
    echo "Thêm mới thành công";
} else {
    echo "Lỗi: " . $sql . "<br>" . $dbconn->error;
}

// Ngắt kết nối
$dbconn->close();

Lưu ý: Mỗi một câu lệnh INSERT INTO phải cách nhau bởi một dấu ;

Dùng MySQLi Procedural.

$host = "localhost";
$username = "root";
$password = "";
$dbName = "MySQLDemo";

// Tạo kết nối
$dbconn = mysqli_connect($host, $username, $password, $dbName);

// Kiểm tra kết nối
if(!$dbconn){
	die("Kết nối thất bại: " . mysqli_connect_error());
} 

// Câu lệnh Insert
$sql = "INSERT INTO News (title, slug, intro)
VALUES ('Học lập trình PHP', 'hoc-lap-trinh-php', 'Giới thiệu về học lập trình PHP');";
$sql .= "INSERT INTO MyGuests (title, slug, intro)
VALUES ('Học lập trình PHP', 'hoc-lap-trinh-mysql', 'Giới thiệu về học lập trình MySQL');";
$sql .= "INSERT INTO MyGuests (title, slug, intro)
VALUES ('Học lập trình JQuery', 'hoc-lap-trinh-jquery', 'Giới thiệu về học lập trình JQuery')";

// Thực hiện
if (mysqli_multi_query($dbconn,$sql) === TRUE) {
	echo "Thêm mới thành công";
} else {
	echo "Lỗi: " . $sql . "<br>" . mysqli_errno($dbconn);
}

// Ngắt kết nối
mysqli_close($dbconn);

Dùng PDO.

Trong quá trình insert nhiều dữ liệu nếu một câu lệnh insert nào đó bị lỗi dẫn đến quá trình insert bị dừng ngay tại thời điểm đó. Lúc này thì những records vừa mới được insert sẽ không có cách nào quay lại được trạng thái như trước lúc chạy câu lệnh INSERT. Những trường hợp thế này rất là nguy hiểm nên các hệ quản trị CSDL đưa ra khái niệm transaction, với transaction thì chỉ cần một thao tác bị lỗi là lập tức nó sẽ rollback lại toàn bộ trạng thái ban đầu.

$host = "localhost";
$username = "root";
$password = "";
$dbName = "MySQLDemo";

try {
    // Kết nối
    $dbconn = new PDO("mysql:host=$host;dbname=$dbName", $username, $password);
    
	// Thiết lập exception
    $dbconn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
    // Bắt đầu transaction
    $dbconn->beginTransaction();
     
    // Thực thi từng câu truy vấn
    $dbconn->exec("INSERT INTO News (title, slug, intro)
	VALUES ('Học lập trình PHP', 'hoc-lap-trinh-php', 'Giới thiệu về học lập trình PHP')");
    $dbconn->exec("INSERT INTO MyGuests (title, slug, intro)
	VALUES ('Học lập trình PHP', 'hoc-lap-trinh-mysql', 'Giới thiệu về học lập trình MySQL'))");
 
    // Nếu mọi thứ thành công thì commit
    $dbconn->commit();
     
    echo "Thêm mới thành công";
} 
catch (PDOException $e) {
    // Nếu xuất hiện lỗi thì rollback lại các thao tác
    $dbconn->rollback();
    echo "Lỗi: " . $e->getMessage();
}
 
// Ngắt kết nối
$dbconn = null;

Tổng kết.

Như vậy mình đã trình bày xong cách thêm nhiều records vào CSDL MySQL sử dụng PHP. Hy vọng bài viết thực sự có ích đối với các bạn.

0