在PHP 中, mysqli::stmt_init是mysqli擴展中的一個函數,主要用於初始化一個新的mysqli_stmt對象。這對於執行預處理語句(Prepared Statements)非常重要。通過使用預處理語句,我們可以避免SQL 注入等安全問題,並提高數據庫查詢的效率。
在MVC 架構中,數據庫操作通常位於Model 層。 Model 負責處理數據的獲取和存儲,而Controller 層則負責處理用戶請求並調用相應的Model 方法。在我們的案例中,我們將在Model 層中使用mysqli::stmt_init進行數據庫操作。
假設我們有一個簡單的用戶管理系統,我們希望在數據庫中插入用戶信息。我們的數據庫表結構如下:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
);
我們將在Model層創建一個方法來處理插入用戶數據的操作。
首先,我們需要創建一個數據庫連接類,用於與數據庫進行連接。假設我們將數據庫連接信息存儲在一個單獨的類中。
class Database {
private $host = 'localhost';
private $username = 'root';
private $password = '';
private $database = 'test_db';
public $conn;
public function __construct() {
$this->conn = new mysqli($this->host, $this->username, $this->password, $this->database);
if ($this->conn->connect_error) {
die("Connection failed: " . $this->conn->connect_error);
}
}
}
接下來,我們創建一個UserModel類,負責處理與用戶相關的數據庫操作。在這裡,我們將使用mysqli::stmt_init函數初始化預處理語句,並插入用戶數據。
class UserModel {
private $db;
public function __construct() {
$this->db = new Database();
}
public function addUser($username, $email) {
// 初始化準備語句
$stmt = $this->db->conn->stmt_init();
// 檢查準備語句是否成功
if ($stmt->prepare("INSERT INTO users (username, email) VALUES (?, ?)")) {
// 綁定參數
$stmt->bind_param("ss", $username, $email);
// 執行語句
if ($stmt->execute()) {
echo "User added successfully!";
} else {
echo "Error: " . $stmt->error;
}
// 關閉語句
$stmt->close();
} else {
echo "Prepare failed: " . $this->db->conn->error;
}
}
}
在Controller 層,我們通過調用UserModel類的方法來執行數據庫操作。我們將獲取用戶輸入的數據,並將其傳遞給addUser方法。
class UserController {
private $model;
public function __construct() {
$this->model = new UserModel();
}
public function createUser($username, $email) {
// 調用 UserModel 類的方法插入用戶數據
$this->model->addUser($username, $email);
}
}
最後,在前端頁面中,我們提供一個簡單的表單,供用戶輸入數據。表單數據將通過Controller 層提交給Model 進行數據庫操作。
<form method="POST" action="create_user.php">
<label for="username">Username:</label>
<input type="text" id="username" name="username" required>
<label for="email">Email:</label>
<input type="email" id="email" name="email" required>
<button type="submit">Create User</button>
</form>
在create_user.php文件中,我們通過Controller 創建用戶:
include 'UserController.php';
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$username = $_POST['username'];
$email = $_POST['email'];
$controller = new UserController();
$controller->createUser($username, $email);
}
在MVC 架構中,正確使用mysqli::stmt_init函數進行數據庫操作,可以提高代碼的安全性和效率。通過使用預處理語句,避免了SQL 注入的風險,並使得代碼更加清晰和易於維護。在本例中,我們將數據庫操作封裝在Model 層,Controller 層負責與前端交互,確保了各層職責的分離。
通過這種方式,你可以在MVC 架構中優雅地處理數據庫操作,並為未來的擴展提供良好的基礎。