Cơ bản về PHP và các vấn đề liên quan đến MySQL

Giới thiệu

Bài viết này sẽ giới thiệu ngắn gọn về các thư viện mở rộng MySQL trong PHP, thư viện MySQLi, việc thực thi SQL theo lô, kiểm soát giao dịch và các khái niệm liên quan.

Thư viện mở rộng MySQL

Dù thư viện MySQL trong PHP đã không còn được hỗ trợ từ phiên bản 5.6 trở lên do vấn đề bảo mật, nhưng việc hiểu rõ cách sử dụng vẫn rất cần thiết. Dưới đây là ví dụ minh họa.

Ví dụ minh họa

Cơ bản để thao tác CSDL gồm các bước: thiết lập kết nối → chọn CSDL → thiết lập mã hóa → gửi câu lệnh SQL → xử lý kết quả → giải phóng tài nguyên và đóng kết nối. Ví dụ xây dựng ứng dụng tra cứu từ điển trực tuyến:


CREATE DATABASE worddb;
CREATE TABLE words (
    id INT PRIMARY KEY AUTO_INCREMENT,
    enword VARCHAR(32) NOT NULL,
    chword VARCHAR(256) NOT NULL
);
INSERT INTO words (enword, chword) VALUES ('boy', '男孩');
INSERT INTO words (enword, chword) VALUES ('school', '学校');

Lớp công cụ xử lý SQL:


<?php
class SqlHelper {
    private $conn;
    private $host = "localhost";
    private $user = "root";
    private $password = "XFAICL1314";
    private $db = "worddb";

    public function __construct() {
        $this->conn = mysql_connect($this->host, $this->user, $this->password);
        if (!$this->conn) {
            die("Kết nối thất bại! ".mysql_error());
        }
        mysql_select_db($this->db, $this->conn);
        mysql_query("set names utf8");
    }

    public function executeQuery($sql) {
        $res = mysql_query($sql) or die(mysql_error());
        return $res;
    }

    public function executeModify($sql) {
        $b = mysql_query($sql, $this->conn);
        if (!$b) {
            return 0;
        } else {
            if (mysql_affected_rows($this->conn) > 0) {
                return 1;
            } else {
                return 2;
            }
        }
    }
}
?>

Thư viện mở rộng MySQLi

MySQLi là phiên bản cải tiến của thư viện MySQL. Dưới đây là ví dụ sử dụng phong cách hướng đối tượng:


<?php
class SqlManager {
    private $mysqli;
    private $host = "localhost";
    private $user = "root";
    private $pass = "XFAICL1314";
    private $db = "day1";

    public function __construct() {
        $this->mysqli = new mysqli($this->host, $this->user, $this->pass, $this->db);
        if ($this->mysqli->connect_error) {
            echo "Kết nối thất bại";
        }
        $this->mysqli->query("set names utf8");
    }

    public function executeQuery($sql) {
        $res = $this->mysqli->query($sql) or die($this->mysqli->error);
        return $res;
    }

    public function executeModify($sql) {
        $res = $this->mysqli->query($sql) or die($this->mysqli->error);
        if (!$res) {
            return 0;
        } else {
            if ($this->mysqli->affected_rows > 0) {
                return 1;
            } else {
                return 2;
            }
        }
    }
}
?>

Thực thi SQL theo lô

Đối với các thao tác DML (INSERT/UPDATE/DELETE), có thể thực thi theo lô như sau:


<?php
$mysqli = new mysqli("localhost", "root", "XFAICL1314", "test");
if ($mysqli->connect_error) {
    echo "Kết nối thất bại";
}

$sql = "INSERT INTO users (name, password) VALUES ('A', MD5('123'));";
$sql .= "INSERT INTO users (name, password) VALUES ('B', MD5('456'));";
$sql .= "INSERT INTO users (name, password) VALUES ('C', MD5('789'));";

$b = $mysqli->multi_query($sql);
if (!$b) {
    echo "Thất bại";
} else {
    echo "Thành công";
}
$mysqli->close();
?>

Kiểm soát giao dịch

Để thực hiện giao dịch, cần cấu hình CSDL sử dụng engine InnoDB:


<?php
$mysqli = new mysqli("localhost", "root", "XFAICL1314", "test");
if ($mysqli->connect_error) {
    echo "Kết nối thất bại";
}

$mysqli->autocommit(false);

$sql1 = "UPDATE accounts SET balance = balance - 100 WHERE id = 1;";
$sql2 = "UPDATE accounts SET balance = balance + 100 WHERE id = 2;";

$b1 = $mysqli->query($sql1);
$b2 = $mysqli->query($sql2);

if (!$b1 || !$b2) {
    $mysqli->rollback();
    echo "Giao dịch thất bại";
} else {
    $mysqli->commit();
    echo "Giao dịch thành công";
}
$mysqli->close();
?>

Thẻ: php mysql MySQLi SQL_Injection Giao_dịch

Đăng vào ngày 25 tháng 6 lúc 03:58