PDO::prepare

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PHP 8,PECL pdo >= 0.1.0)

PDO::prepare — 실행할 명령문을 준비하고 명령문 개체를 반환합니다.


설명

public PDO::prepare(string $query, array $options = []): PDOStatement|false

PDOStatement::execute() 메서드에 의해 실행될 SQL 문을 준비합니다. 명령문 템플릿은 명령문이 실행될 때 실제 값이 대체되는 0개 이상의 명명된(:name) 또는 물음표(?) 매개변수 표시자를 포함할 수 있습니다. 명명된 매개변수 표시문자와 물음표 매개변수 표시문자는 동일한 명령문 템플리트 내에서 사용할 수 없습니다. 하나 또는 다른 매개변수 스타일. 이러한 매개변수를 사용하여 사용자 입력을 바인딩하고 사용자 입력을 쿼리에 직접 포함하지 마십시오.

PDOStatement::execute()를 호출할 때 명령문에 전달하려는 각 값에 대해 고유한 매개변수 표시자를 포함해야 합니다. 에뮬레이션 모드가 켜져 있지 않으면 준비된 명령문에서 동일한 이름의 명명된 매개변수 표시문자를 두 번 이상 사용할 수 없습니다.

메모: 매개변수 마커는 완전한 데이터 리터럴만 나타낼 수 있습니다. 리터럴의 일부도, 키워드도, 식별자도, 임의의 쿼리 부분도 매개변수를 사용하여 바인딩할 수 없습니다. 예를 들어, SQL 문의 IN() 절에 있는 단일 매개변수에 여러 값을 바인딩할 수 없습니다.

다른 매개변수 값으로 여러 번 발행될 명령문에 대해 PDO::prepare()PDOStatement::execute()를 호출하면 드라이버가 쿼리 계획의 클라이언트 및/또는 서버 측 캐싱을 협상할 수 있도록 하여 애플리케이션의 성능을 최적화하고 메타 정보. 또한 PDO::prepare()PDOStatement::execute()를 호출하면 매개변수를 수동으로 인용하고 이스케이프할 필요가 없으므로 SQL 주입 공격을 방지하는 데 도움이 됩니다.

PDO는 기본적으로 지원하지 않는 드라이버에 대해 준비된 명령문/바운드 매개변수를 에뮬레이트하고 드라이버가 한 스타일은 지원하지만 다른 스타일은 지원하지 않는 경우 명명된 또는 물음표 스타일 매개변수 표시자를 더 적절한 것으로 다시 작성할 수도 있습니다.

참고: 에뮬레이트된 준비된 명령문과 명명된 또는 물음표 스타일 매개변수 재작성에 사용되는 구문 분석기는 작은따옴표 및 큰따옴표에 대한 비표준 백슬래시 이스케이프를 지원합니다. 즉, 백슬래시 바로 앞에 오는 종료 따옴표는 그대로 인식되지 않으므로 매개변수를 잘못 감지하여 준비된 명령문이 실행될 때 실패할 수 있습니다. 해결 방법은 이러한 SQL 쿼리에 대해 에뮬레이트된 준비를 사용하지 않고 드라이버에서 기본적으로 지원하는 매개변수 스타일을 사용하여 매개변수를 다시 쓰는 것을 방지하는 것입니다.

PHP 7.4.0부터 물음표를 두 배로 늘려서 이스케이프할 수 있습니다. 즉 ?? 문자열은 ? 쿼리를 데이터베이스에 보낼 때.


매개변수

query
대상 데이터베이스 서버에 유효한 SQL 문 템플릿이어야 합니다.
options
이 배열은 이 메서드가 반환하는 PDOStatement 개체에 대한 속성 값을 설정하기 위해 하나 이상의 키=>값 쌍을 보유합니다. 스크롤 가능한 커서를 요청하기 위해 PDO::ATTR_CURSOR 값을 PDO::CURSOR_SCROLL로 설정하는 데 가장 일반적으로 사용합니다. 일부 드라이버에는 준비 시간에 설정할 수 있는 드라이버별 옵션이 있습니다.

반환 값

데이터베이스 서버가 명령문을 성공적으로 준비하면 PDO::prepare()PDOStatement 객체를 반환합니다. 데이터베이스 서버가 명령문을 성공적으로 준비할 수 없는 경우 PDO::prepare()오류 처리에 따라 false를 반환하거나 PDOException을 내보냅니다.

메모: 에뮬레이트된 준비된 명령문은 데이터베이스 서버와 통신하지 않으므로 PDO::prepare()가 명령문을 확인하지 않습니다.


Examples

예제 #1 명명된 매개변수가 있는 SQL 문 템플릿

                  
<?php
/* Execute a prepared statement by passing an array of values */
$sql = 'SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour';
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute(array('calories' => 150, 'colour' => 'red'));
$red = $sth->fetchAll();
/* Array keys can be prefixed with colons ":" too (optional) */
$sth->execute(array(':calories' => 175, ':colour' => 'yellow'));
$yellow = $sth->fetchAll();
?>
                  
                

예제 #2 물음표 매개변수가 있는 SQL 문 템플릿

                  
<?php
/* Execute a prepared statement by passing an array of values */
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < ? AND colour = ?');
$sth->execute(array(150, 'red'));
$red = $sth->fetchAll();
$sth->execute(array(175, 'yellow'));
$yellow = $sth->fetchAll();
?>
                  
                

예제 #3 물음표가 이스케이프 처리된 SQL 문 템플릿

                  
<?php
/* note: this is only valid on PostgreSQL databases */
$sth = $dbh->prepare('SELECT * FROM issues WHERE tag::jsonb ?? ?');
$sth->execute(['feature']);
$featureIssues = $sth->fetchAll();
$sth->execute(['performance']);
$performanceIssues = $sth->fetchAll();
?>
                  
                

기타

  • PDO::exec() - SQL 문을 실행하고 영향을 받는 행 수를 반환합니다.
  • PDO::query() - 자리 표시자 없이 SQL 문을 준비하고 실행합니다.
  • PDOStatement::execute() - 준비된 명령문을 실행합니다.