概要
プリペアド ステートメントは、SQL インジェクション攻撃を防ぐ強力な手法を提供しますクエリのパフォーマンスも向上します。ただし、以下に例を示すように、プリペアド ステートメントを作成する従来の方法では、フィールド名の指定にかなりの冗長性が生じます。この冗長性は、特にコードを変更したり保守したりするときにイライラする可能性があります。この記事では、この繰り返しを軽減し、プリペアド ステートメント コードの可読性を向上させる 3 つの異なるアプローチについて説明します。
$sql = 'INSERT INTO tasks(task_name, start_date, completed_date) VALUES(:task_name, :start_date, :completed_date)'; $stmt = $this->pdo->prepare($sql); $stmt->execute([ ':task_name' => $taskName, ':start_date' => $startDate, ':completed_date' => $completedDate, ]);
Raw PHP
基本的な挿入の場合、1 つの簡単なテクニックとして、以下を省略します。クエリ内のフィールド句と位置プレースホルダーの使用:
このアプローチは単純ではありますが、そうではない可能性があります。
$data = [$taskName, $startDate, $completedDate]; $sql = 'INSERT INTO tasks VALUES(null, ?, ?, ?)'; $db->prepare($sql)->execute($data);
Helper Function
もう 1 つの方法は、挿入処理専用のヘルパー関数を作成することです。この関数は、指定されたフィールド名と値に基づいてクエリを動的に生成できます:
このヘルパー関数を使用すると、挿入プロセスが簡素化されます:
function prepared_insert($conn, $table, $data) { $keys = array_keys($data); $fields = implode(",", $keys); $placeholders = str_repeat('?,', count($keys) - 1) . '?'; $sql = "INSERT INTO $table ($fields) VALUES ($placeholders)"; $conn->prepare($sql)->execute(array_values($data)); }
prepared_insert($db, 'tasks',[ 'task_name' => $taskName, 'start_date' => $startDate, 'completed_date' => $completedDate, ]);
最も先進的なアプローチには、オブジェクト指向プログラミング (OOP) ソリューションの実装が含まれます。一般に「ベイビー ORM」と呼ばれます。このアプローチでは、テーブル操作の共通メソッドを持つ基本クラスと個々のテーブルの特定のクラスを定義します:
この設定では、フィールド名を明示的に指定せずに挿入を実行できます:
class UserGateway extends BasicTableGateway { protected $table = 'gw_users'; protected $fields = ['email', 'password', 'name', 'birthday']; }
OOP ソリューションは、コードの保守性を大幅に向上させ、繰り返しを減らし、全体的な開発エクスペリエンスを向上させることができます。
以上がPHP SQL プリペアドステートメントを使用するときにコードの繰り返しを減らすにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。