PHP SQL 준비된 문으로 코드 반복을 피하는 방법
SQL 주입 공격을 방지하려면 준비된 문이 중요합니다. 그러나 특히 열 수가 많은 경우 과도한 코드 중복이 발생할 수 있습니다. 이 문제를 해결하기 위해 반복을 최소화하는 몇 가지 접근 방식이 있습니다.
1. 원시 PHP
이 접근 방식은 위치 자리 표시자를 활용하고 쿼리에서 필드 이름 절을 생략하며 누락된 필드의 기본값을 사용합니다. 예:
$data = [$taskName, $startDate, $completedDate]; $sql = 'INSERT INTO tasks VALUES(null, ?, ?, ?)'; $db->prepare($sql)->execute($data);
2. 도우미 함수
필드 이름을 키로, 값을 값으로 사용하여 테이블 이름과 데이터 배열을 받아들이는 도우미 함수를 만들 수 있습니다. 함수는 SQL 주입 방지를 위해 필드 이름을 올바르게 이스케이프하기 위해 도우미 함수를 활용해야 합니다.
function prepared_insert($conn, $table, $data) { $keys = array_map('escape_mysql_identifier', array_keys($data)); $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)); } // Usage: prepared_insert($db, 'tasks', [ 'task_name' => $taskName, 'start_date' => $startDate, 'completed_date' => $completedDate, ]);
3. Baby ORM
이 접근 방식은 객체 지향 프로그래밍을 사용하여 반복을 더욱 줄입니다. 프로토타입 클래스는 모든 테이블에 대한 공통 메소드로 생성되며, 특정 테이블 클래스는 테이블 이름과 열 목록으로 정의됩니다. 삽입 코드는 다음과 같습니다.
$data = [ 'email' => 'email', 'password' => 123, 'name' => 'Fooster', ]; $userGateway = new UserGateway($pdo); $id = $userGateway->create($data); echo "Create: $id\n";
프로토타입 클래스:
class BasicTableGateway { 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']; }
위 내용은 PHP SQL 준비된 문을 사용할 때 코드 반복을 피하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!