>데이터 베이스 >MySQL 튜토리얼 >PHP SQL 준비된 문을 사용할 때 코드 반복을 피하는 방법은 무엇입니까?

PHP SQL 준비된 문을 사용할 때 코드 반복을 피하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-29 03:22:10415검색

How to Avoid Code Repetition When Using PHP SQL Prepared Statements?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.