PHP開発では、データベース接続は基本的かつ重要なリンクです。効率的で安全なデータベース接続クラスは、開発プロセスを簡素化するだけでなく、SQLインジェクションなどのセキュリティリスクを効果的に防ぐこともできます。この記事では、Secure Connect()関数をカプセル化し、SQLインジェクションを防ぐデータベース接続法を実装する方法を紹介します。
ネイティブMySqli_Connect()またはPDOを直接使用してデータベースに接続すると便利ですが、カプセル化がない場合は、コードを繰り返しやすく、メンテナンスが困難です。オブジェクト指向のカプセル化により、実装できます。
データベース接続構成の統一された管理
コードの再利用性を改善します
例外とエラーを中央に処理します
前処理ステートメントによるSQL注入を防ぎます
PHPのデータベース接続インターフェイスとしてPDO(PHPデータオブジェクト)を使用することをお勧めします。
複数のデータベースをサポートし、コードの移植性が高い
SQL注射を防ぐための組み込み前処理ステートメント
完璧な例外処理メカニズム
<?php
class Database {
private $host = 'localhost';
private $dbname = 'testdb';
private $username = 'root';
private $password = 'password';
private $pdo;
private $error;
// コンストラクタ,接続を初期化します
public function __construct() {
$dsn = "mysql:host={$this->host};dbname={$this->dbname};charset=utf8mb4";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // 例外を投げます
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // デフォルトの関連配列
PDO::ATTR_EMULATE_PREPARES => false, // シミュレーション前処理を無効にします,ネイティブの前処理を使用します
];
try {
$this->pdo = new PDO($dsn, $this->username, $this->password, $options);
} catch (PDOException $e) {
$this->error = $e->getMessage();
// ログまたはプロセスエラー
die("データベース接続に失敗しました: " . $this->error);
}
}
// クエリの統一実行(SELECT)
public function query($sql, $params = []) {
$stmt = $this->pdo->prepare($sql);
$stmt->execute($params);
return $stmt->fetchAll();
}
// 追加、削除、修正の統一された実行(INSERT/UPDATE/DELETE)
public function execute($sql, $params = []) {
$stmt = $this->pdo->prepare($sql);
return $stmt->execute($params);
}
// 最後の挿入物を取得しますID
public function lastInsertId() {
return $this->pdo->lastInsertId();
}
}
?>
<?php
$db = new Database();
// セキュリティクエリの例:防ぐ SQL 注射
$userId = 123;
$result = $db->query("SELECT * FROM users WHERE id = :id", ['id' => $userId]);
// 安全な挿入例
$name = 'チャン・サン';
$email = 'zhangsan@m66.net';
$insertSql = "INSERT INTO users (name, email) VALUES (:name, :email)";
$db->execute($insertSql, ['name' => $name, 'email' => $email]);
?>
PDOの前処理ステートメントを使用して、SQLステートメントはデータから分離され、ユーザー入力はSQL文字列に直接スプライスされていません
パラメーターバインディングにより、データベースドライバーは特別な文字エスケープを自動的に処理できます
シミュレートされた前処理を無効にし、ネイティブの前処理でセキュリティを強化します
Connect()関数を使用してデータベース接続クラスをカプセル化し、PDOを基礎となる接続として選択し、前処理ステートメントを組み合わせることは、PHPでのSQL注入を防ぐための効率的で安全なソリューションです。このクラスの設計はシンプルで拡張が簡単で、ほとんどのビジネスニーズを満たすことができ、最新のPHP開発に推奨される実践です。