スキップしてメイン コンテンツに移動

PHP8 PDOで安全MySQL

PHP8 PDOで安全MySQL

PHP8とPDOで安全なデータベース接続

PHP8ではPDO(PHP Data Objects)が標準で強化され、MySQLへの接続がより簡潔に記述できます。以下のようにDSN(Data Source Name)を設定し、例外モードを有効にすることで、接続エラーを即座に検知できます。

$dsn = 'mysql:host=localhost;dbname=sample_db;charset=utf8mb4';
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];
try {
    $pdo = new PDO($dsn, 'user', 'pass', $options);
} catch (PDOException $e) {
    die('接続失敗: ' . $e->getMessage());
}

この設定により、データベース接続は安全かつ高速に行われ、後続のクエリ実行に備えた環境が整います。

プリペアドステートメントとbindValueでSQLインジェクション対策

プリペアドステートメントは、SQL文を事前にコンパイルし、パラメータをバインドすることで、SQLインジェクションを防止します。bindValueメソッドを使うと、型を明示できるため、さらに安全性が高まります。

$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$stmt->bindValue(':email', $email, PDO::PARAM_STR);
$stmt->execute();
$rows = $stmt->fetchAll();

上記のように、プレースホルダーに対してbindValueを使用すると、ユーザー入力がそのままSQLに埋め込まれるリスクが排除されます。これにより、データベースは常に安全に保たれ、SQLインジェクション対策が確実に実装されます。

トランザクションを使ったデータ取得と一貫性

複数のクエリをまとめて実行する場合、トランザクションを利用するとデータの一貫性を保証できます。以下は、トランザクションを開始し、成功時にコミット、失敗時にロールバックする例です。

$pdo->beginTransaction();
try {
    $pdo->exec('UPDATE accounts SET balance = balance - 100 WHERE id = 1');
    $pdo->exec('UPDATE accounts SET balance = balance + 100 WHERE id = 2');
    $pdo->commit();
} catch (Exception $e) {
    $pdo->rollBack();
    echo 'エラー: ' . $e->getMessage();
}

トランザクションを使うことで、データ取得や更新が途中で失敗した場合でも、データベースは元の状態に戻ります。これにより、データベースの整合性が保たれ、信頼性の高いアプリケーションを構築できます。

この記事はAIによって作成されました。

コメント