PHP開発では、データベース操作は不可欠な部分であり、一般的な操作には追加、削除、変更、および検索が含まれます。ただし、従来のデータベース相互作用方法には、コード冗長性、SQLインジェクションの脆弱性、パフォーマンスボトルネックなどの問題がしばしばあります。データベースの相互作用効率を改善し、コードの再利用性を高めるために、 MySQLI :: STMT_INITメソッドを使用して、一般的なデータベース操作クラスをカプセル化できます。このようにして、効率を改善できるだけでなく、SQL注入の脆弱性も防ぐことができます。
この記事では、 MySQLI :: STMT_INIT関数を使用して共通のデータベース操作クラスを作成する方法を詳細に紹介し、データベースのインタラクションをより効率的かつ安全にして、合理的なカプセル化を通じて安全にします。
mysqli :: stmt_initは、 mysqli_stmtオブジェクトを初期化するためのmysqli拡張機能のメソッドです。 MySQLI_STMTオブジェクトは、特に複数の同様のSQLクエリを実行する必要がある場合、SQLクエリを実行するときに従来のクエリメソッドよりも効率的な準備されたSQLステートメントを表します。前処理ステートメントは、SQL解析の時間を短縮し、実行効率を改善することができます。
パフォーマンスの改善:Preprocessingステートメントを通じて、MySQLは毎回解析することなくSQLクエリをコンパイルおよび最適化します。
SQLインジェクションの防止:結合パラメーターにより、ユーザーの入力データが直接挿入され、SQL注入攻撃が効果的に防止されます。
コードの再利用性:データベース操作クラスをカプセル化した後、コードの再利用性を改善するために、さまざまな場所で再利用できます。
まず、 MySQLI :: STMT_INITを使用してデータベース接続クラスを作成し、SQL操作をカプセル化する必要があります。
class Database {
private $mysqli;
public function __construct($host, $username, $password, $dbname) {
// データベース接続を作成します
$this->mysqli = new mysqli($host, $username, $password, $dbname);
// 接続を確認してください
if ($this->mysqli->connect_error) {
die("Connection failed: " . $this->mysqli->connect_error);
}
}
// 準備する SQL ステートメントと実行
public function executeQuery($sql, $params = []) {
// 初期化ステートメント
$stmt = $this->mysqli->stmt_init();
// 準備する SQL 声明
if (!$stmt->prepare($sql)) {
die("Error in preparing statement: " . $stmt->error);
}
// バインドパラメーター
if (!empty($params)) {
// パラメータータイプを取得します
$types = str_repeat('s', count($params)); // すべてのパラメーターが文字列タイプであると仮定します
$stmt->bind_param($types, ...$params);
}
// クエリを実行します
if ($stmt->execute()) {
// 結果の結果セットを返します
return $stmt->get_result();
} else {
die("Error in executing statement: " . $stmt->error);
}
}
// データベース接続を閉じます
public function close() {
$this->mysqli->close();
}
}
上記のコードでは、任意のSQLクエリを実行できるデータベース操作クラスデータベースをカプセル化します。それを使用する場合、SQLステートメントとパラメーターに合格する必要があります。
たとえば、データを挿入します。
$db = new Database('localhost', 'root', 'password', 'm66.net');
// データを挿入します
$sql = "INSERT INTO users (name, email) VALUES (?, ?)";
$params = ['John Doe', 'johndoe@m66.net'];
$db->executeQuery($sql, $params);
クエリデータ:
$sql = "SELECT * FROM users WHERE email = ?";
$params = ['johndoe@m66.net'];
$result = $db->executeQuery($sql, $params);
// 出力結果
while ($row = $result->fetch_assoc()) {
echo "Name: " . $row['name'] . ", Email: " . $row['email'] . "<br>";
}
$db->close();
単一のSQLクエリの実行に加えて、カプセル化されたデータベース操作クラスもバッチ操作をサポートできます。クラスにバッチ操作方法を追加することにより、複数のデータ操作を効率的に実行できます。
public function executeBatchQuery($sql, $paramsList) {
// 初期化ステートメント
$stmt = $this->mysqli->stmt_init();
// 準備する SQL 声明
if (!$stmt->prepare($sql)) {
die("Error in preparing statement: " . $stmt->error);
}
// パラメータータイプを取得します
$types = str_repeat('s', count($paramsList[0])); // すべてのパラメーターが文字列タイプであると仮定します
// パラメーターリストを繰り返して実行します
foreach ($paramsList as $params) {
$stmt->bind_param($types, ...$params);
$stmt->execute();
}
return true;
}
バッチにデータを挿入します。