Bài 22: PHP – Một Số Kỹ Thuật Xử Lý Dữ Liệu MySQL
Insert dữ liệu vào MySQL Dữ liệu có thể được đưa vào bảng bằng câu lệnh INSERT của MySQL và được đưa vào trong hàm của PHP là mysql_query. EX: ở bài trước ta đã tạo table employee, bây giờ đưa dữ liệu vào bảng này. <?php $dbhost = ‘localhost:3036’; ...
Insert dữ liệu vào MySQL
Dữ liệu có thể được đưa vào bảng bằng câu lệnh INSERT của MySQL và được đưa vào trong hàm của PHP là mysql_query.
EX: ở bài trước ta đã tạo table employee, bây giờ đưa dữ liệu vào bảng này.
<?php
$dbhost = ‘localhost:3036’;
$dbuser = ‘root’;
$dbpass = ‘rootpassword’;
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die(‘Could not connect: ‘ . mysql_error());
}
$sql = ‘INSERT INTO employee ‘.
‘(emp_name,emp_address, emp_salary, join_date) ‘.
‘VALUES ( “Ku Tin”, “XYZ”, 2000, NOW() )’;
mysql_select_db(‘test_db’);
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die(‘Could not enter data: ‘ . mysql_error());
}
echo “Entered data successfully ”;
mysql_close($conn);
?>
Trong ứng dụng thực sự thì tất cả giá trị sẽ được lấy từ form HTML và sau đó các giá trị này sẽ sử dụng script PHP để insert chúng vào bảng database.
Trong khi đưa dử liệu vào, cách tốt nhất là ta sử dụng hàm get_magic_quotes_qpc() để kiễm tra cấu hình hiện tại trong php.ini là magic_quotes_qpc có được bật lên hay không(nếu kết quả trả về false) thì ta sẽ sử dụng hàm addslashes() để thêm dấu / trước dấu nháy. Nếu cấu hình magic_quotes_qpc đã bật rồi thì khi các bạn đưa dữ liệu vào bảng , các dấu nháy đơn, nháy kép sẽ được tự động có thêm dấu trước nó, vì nếu không có dấu thì dấu nháy sẽ bị MySQL định dạng và gây ra lổi insert, và một số lổi, lổ hổng sẽ bị tấn công SQL Injection. Phần SQL Injection sẽ có một bài học riêng cũng trong serial PHP Tutorial.
Giả sử bạn muốn lưu một chuỗi có dạng:
What does “yolo” mean?
Như vậy thì làm sao có luôn dấu “yolo” , bạn phải kèm dấu vào thì mới được, tức là
What does ”yolo” mean?
Và hàm addslashes của PHP sẽ giúp bạn làm điều này.
<!DOCTYPE html>
<html>
<body>
<?php
$str = addslashes(‘What does “yolo” mean?’);
echo($str);
?>
</body>
</html>
Bây giờ ta tiến hành tạo một file để đưa dữ liệu vào bảng có cả form HTML.
<html>
<head>
<title>Add New Record in MySQL Database</title>
</head>
<body>
<?php
if(isset($_POST[‘add’])) {
$dbhost = ‘localhost:3036’;
$dbuser = ‘root’;
$dbpass = ‘rootpassword’;
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die(‘Could not connect: ‘ . mysql_error());
}
if(! get_magic_quotes_gpc() ) {
$emp_name = addslashes ($_POST[’emp_name’]);
$emp_address = addslashes ($_POST[’emp_address’]);
}else {
$emp_name = $_POST[’emp_name’];
$emp_address = $_POST[’emp_address’];
}
$emp_salary = $_POST[’emp_salary’];
$sql = “INSERT INTO employee “. “(emp_name,emp_address, emp_salary,
join_date) “. “VALUES(‘$emp_name’,’$emp_address’,$emp_salary, NOW())”;
mysql_select_db(‘test_db’);
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die(‘Could not enter data: ‘ . mysql_error());
}
echo “Entered data successfully ”;
mysql_close($conn);
}else {
?>
<form method = “post” action = “<?php $_PHP_SELF ?>”>
<table awidth = “400” border = “0” cellspacing = “1”
cellpadding = “2”>
<tr>
<td awidth = “100”>Employee Name</td>
<td><input name = “emp_name” type = “text”
id = “emp_name”></td>
</tr>
<tr>
<td awidth = “100”>Employee Address</td>
<td><input name = “emp_address” type = “text”
id = “emp_address”></td>
</tr>
<tr>
<td awidth = “100”>Employee Salary</td>
<td><input name = “emp_salary” type = “text”
id = “emp_salary”></td>
</tr>
<tr>
<td awidth = “100”> </td>
<td> </td>
</tr>
<tr>
<td awidth = “100”> </td>
<td>
<input name = “add” type = “submit” id = “add”
value = “Add Employee”>
</td>
</tr>
</table>
</form>
<?php
}
?>
</body>
</html>
Lấy Dữ Liệu Từ MySQL
Dữ liệu có thể được lấy từ các bảng MySQL bằng cách thực thi câu phát biểu SELECT SQL xuyên qua hàm PHP mysql_query.
Có rất nhiều tùy chọn định dạng kết quả trả về, hầu hết thì người ta hay dùng mysql_fetch_array(). Hàm này trả về dòng dữ liệu như một mảng kết hợp, một mảng số hoặc cả 2. Hàm này trả về FALSE nếu không có dòng dữ liệu nào.
Bây giờ ta thử lấy dữ liệu bảng employee.
<?php
$dbhost = ‘localhost:3036’;
$dbuser = ‘root’;
$dbpass = ‘rootpassword’;
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die(‘Could not connect: ‘ . mysql_error());
}
$sql = ‘SELECT emp_id, emp_name, emp_salary FROM employee’;
mysql_select_db(‘test_db’);
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die(‘Could not get data: ‘ . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
echo “EMP ID :{$row[’emp_id’]} <br> “.
“EMP NAME : {$row[’emp_name’]} <br> “.
“EMP SALARY : {$row[’emp_salary’]} <br> “.
“——————————–<br>”;
}
echo “Fetched data successfully ”;
mysql_close($conn);
?>
Nội dung của mổi dòng sẽ được phân công cho biến $row và giá trị sau đó được in ra.
Trong ví dụ ở trên hằng số MYSQL_ASSOC được sử dụng như đối số thứ 2 của hàm mysql_fetch_array(), để nó trả về dòng như một mảng kết hợp. Với mảng kết hợp thì bạn có thể truy cập các field bằng việc sử dụng tên của chúng thay vì sử dụng index (chỉ số).
PHP cung cấp thêm một hàm khác gọi là mysql_fetch_assoc() cũng trả về dòng như một mảng liên kết.
EX: sử dụng mysql_fetch_assoc()
<?php
$dbhost = ‘localhost:3036’;
$dbuser = ‘root’;
$dbpass = ‘rootpassword’;
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die(‘Could not connect: ‘ . mysql_error());
}
$sql = ‘SELECT emp_id, emp_name, emp_salary FROM employee’;
mysql_select_db(‘test_db’);
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die(‘Could not get data: ‘ . mysql_error());
}
while($row = mysql_fetch_assoc($retval)) {
echo “EMP ID :{$row[’emp_id’]} <br> “.
“EMP NAME : {$row[’emp_name’]} <br> “.
“EMP SALARY : {$row[’emp_salary’]} <br> “.
“——————————–<br>”;
}
echo “Fetched data successfully ”;
mysql_close($conn);
?>
Bạn cũng có thể dùng hằng số MYSQL_NUM làm đối số thứ 2 trong mysql_fetch_array(), sẽ trả về một mảng với số index.
Ví dụ sử dụng MYSQL_NUM.
<?php
$dbhost = ‘localhost:3036’;
$dbuser = ‘root’;
$dbpass = ‘rootpassword’;
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die(‘Could not connect: ‘ . mysql_error());
}
$sql = ‘SELECT emp_id, emp_name, emp_salary FROM employee’;
mysql_select_db(‘test_db’);
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die(‘Could not get data: ‘ . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_NUM)) {
echo “EMP ID :{$row[0]} <br> “.
“EMP NAME : {$row[1]} <br> “.
“EMP SALARY : {$row[2]} <br> “.
“——————————–<br>”;
}
echo “Fetched data successfully ”;
mysql_close($conn);
?>
Note: các bạn đừng lầm tưởng $retval = mysql_query($sql,$conn); là đã cho về kết quả rồi, vì như bạn đã truyền một truy vấn select của sql, nếu câu truy vấn này chạy thẳng vào phpmyadmin thì nó cho bạn thấy kết quả hiễn thị. Tuy nhiên trên PHP thì kết quả tại chổ này sẽ là một đối tượng, rồi bạn phải dùng hàm mysql_fetch_array để lấy nó, và mổi lần đọc thì con trỏ sẽ đọc dòng đầu tiên, sau đó dịch chuyển xuống dòng kế tiếp cho đến hết, cho nên nó phải nằm trong while(….).
Giải Phóng Bộ Nhớ
Các tốt để làm việc là giải phóng con trỏ bộ nhớ ở cuối mổi phát biểu select. Dể dàng hơn với hàm PHP mysql_free_result().
<?php
$dbhost = ‘localhost:3036’;
$dbuser = ‘root’;
$dbpass = ‘rootpassword’;
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die(‘Could not connect: ‘ . mysql_error());
}
$sql = ‘SELECT emp_id, emp_name, emp_salary FROM employee’;
mysql_select_db(‘test_db’);
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die(‘Could not get data: ‘ . mysql_error());
}
while($row = mysql_fetch_array($retval, MYSQL_NUM)) {
echo “EMP ID :{$row[0]} <br> “.
“EMP NAME : {$row[1]} <br> “.
“EMP SALARY : {$row[2]} <br> “.
“——————————–<br>”;
}
mysql_free_result($retval);
echo “Fetched data successfully ”;
mysql_close($conn);
?>
Update, Delete
Cũng bằng cách truyền vào câu phát biểu sql rồi thực thi bằng hàm mysql_query của php, bạn sẽ dể dàng cập nhật dữ liệu, xóa dữ liệu, cũng như thay đổi, xóa table, database vv…
Sử dụng PHP để backup database MySQL
Có 3 cách đơn giản để backup Database:
- Sử dụng lệnh SQL từ PHP
- Sử dụng giao diện từ phpMyAdmin
- Sử dụng MySQL binary mysqldump thông qua PHP
Sử dụng SQL Comman
Bạn có thể thực thi phát biểu SQL select để backup bất kỳ table. Và để backup toàn bộ database thì bạn cần ghi mổi query khác nhau cho các table khác nhau. Mổi table sẽ được lưu trử vào các file văn bản khác nhau.
<?php
$dbhost = ‘localhost:3036’;
$dbuser = ‘root’;
$dbpass = ‘rootpassword’;
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die(‘Could not connect: ‘ . mysql_error());
}
$table_name = “employee”;
$backup_file = “/tmp/employee.sql”;
$sql = “SELECT * INTO OUTFILE ‘$backup_file’ FROM $table_name”;
mysql_select_db(‘test_db’);
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die(‘Could not take data backup: ‘ . mysql_error());
}
echo “Backedup data successfully ”;
mysql_close($conn);
?>
Nếu bạn cần restore dữ liệu mà đã backup trước đó vào lại table thì ta dùng LOAD DATA INFILE
<?php
$dbhost = ‘localhost:3036’;
$dbuser = ‘root’;
$dbpass = ‘rootpassword’;
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ) {
die(‘Could not connect: ‘ . mysql_error());
}
$table_name = “employee”;
$backup_file = “/tmp/employee.sql”;
$sql = “LOAD DATA INFILE ‘$backup_file’ INTO TABLE $table_name”;
mysql_select_db(‘test_db’);
$retval = mysql_query( $sql, $conn );
if(! $retval ) {
die(‘Could not load data : ‘ . mysql_error());
}
echo “Loaded data successfully ”;
mysql_close($conn);
?>
Sử dụng phpMyAdmin
Vào phpMyAdmin, click nút export rồi chọn database bạn muốn backup và tiến hành “Go”, thế là xong.
Sử dụng mysqldump
MySQL cung cấp một hữu ích để thực hiện backup dữ liệu, sử dụng loại này bạn sẽ backup toàn bộ db bằng 1 câu lệnh duy nhất
<?php
$dbhost = ‘localhost:3036’;
$dbuser = ‘root’;
$dbpass = ‘rootpassword’;
$backup_file = $dbname . date(“Y-m-d-H-i-s”) . ‘.gz’;
$command = “mysqldump –opt -h $dbhost -u $dbuser -p $dbpass “. “test_db | gzip > $backup_file”;
system($command);
?>
Rồi và đó là kết thúc cho các thao tác cơ bản giữa PHP và Cơ sở dữ liệu MySQL, lập trình chỉ cần thế thôi là bạn có thể làm chủ được cơ sở dữ liệu bằng PHP rồi.