PHP SQL プリペアド ステートメントでのコードの繰り返しの回避
ほとんどの PHP SQL プリペアド ステートメントの例では、フィールド名が複数回繰り返されます。変更が必要な場合、この繰り返しは冗長になり、エラーが発生しやすくなります。冗長性を最小限に抑えるための解決策をいくつか示します。
Raw PHP
クエリ内のフィールド句を省略し、位置プレースホルダーを使用することで、冗長性を減らすことができます。 Null またはデフォルト値であっても、テーブルのすべての列に値があることを確認します。
$data = [$taskName, $startDate, $completedDate]; $sql = 'INSERT INTO tasks VALUES(null, ?, ?, ?)'; $db->prepare($sql)->execute($data);
ヘルパー関数
挿入用のヘルパー関数を作成すると、コード。この関数は、フィールド名による SQL インジェクションに注意する必要があります。
function prepared_insert($conn, $table, $data) { $keys = array_keys($data); $keys = array_map('escape_mysql_identifier', $keys); $fields = implode(",", $keys); $table = escape_mysql_identifier($table); $placeholders = str_repeat('?', count($keys) - 1) . '?'; $sql = "INSERT INTO $table ($fields) VALUES ($placeholders)"; $conn->prepare($sql)->execute(array_values($data)); }
Baby Object-Relational Mapper (ORM)
このアプローチでは、オブジェクト指向プログラミングを使用して自動化します。インサートの作成。基本クラスには共通のメソッドが含まれており、特定のテーブルは子クラスとして定義されます。
public function create($data): int { $fields = $this->makeFieldList($data); $placeholders = str_repeat('?', count($data) - 1) . '?'; $sql = "INSERT INTO `$this->table` ($fields) VALUES ($placeholders)"; $this->sql($sql, array_values($data)); return $this->db->lastInsertId(); }
class UserGateway extends BasicTableGateway { protected $table = 'gw_users'; protected $fields = ['email', 'password', 'name', 'birthday']; } $data = [ 'email' => '[email protected]', 'password' => 123, 'name' => 'Fooster', ]; $userGateway = new UserGateway($pdo); $id = $userGateway->create($data); echo "Create: $id", PHP_EOL;
これらのソリューションは、使用するコードを減らし、フィールド名の重複を避けることで冗長性を排除します。
以上がPHP SQL プリペアドステートメントを使用するときにコードの繰り返しを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。