PDO (PHP Data Objects)는 다중 데이터베이스 관리 시스템 (DBMS)과 통합 방식으로 상호 작용할 수있는 데이터베이스에 액세스하는 인터페이스입니다. PDO를 사용하는 주요 기능은 준비된 문을 통해 쿼리를 실행하는 기능입니다. 이 접근법은 성능을 향상시킬뿐만 아니라 SQL 주입 공격을 효과적으로 방지합니다.
전처리 진술의 실행은 일반적으로 두 단계로 나뉩니다.
사전 컴파일 : SQL 문을 사용하여 쿼리에서 PDOSTATEMENT 객체를 생성하고 사전 컴파일 매개 변수 자리 표시자를 생성합니다.
실행 : 자리 표시 자 대신 실제 데이터를 사용하여 execute () 메소드를 호출하여 쿼리를 실행합니다.
<span><span><span class="hljs-comment">// 만들다 PDO 예</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-string">'mysql:host=localhost;dbname=test'</span></span><span>, </span><span><span class="hljs-string">'root'</span></span><span>, </span><span><span class="hljs-string">''</span></span><span>);
</span><span><span class="hljs-comment">// 사전 컴파일 SQL 성명</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM users WHERE id = :id"</span></span><span>);
</span><span><span class="hljs-comment">// 매개 변수를 바인딩하고 쿼리를 실행하십시오</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>([</span><span><span class="hljs-string">'id'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>]);
</span></span>
execute ()를 호출하기 전에 매개 변수 바인딩을 사용하는 방법을 이해하는 것이 매우 중요합니다. PDO는 두 공통 자리 표시자를 제공합니다.
이름이 지정된 장소 보유자 : 예를 들어 : ID , 코드의 가독성과 유지 관리를 향상시킬 수 있습니다.
질문 마크 자리 표시 자 : 예를 들어 , 위치를 통해 매개 변수를 바인딩합니다.
<span><span><span class="hljs-comment">// 지명 된 자리 표시자를 사용합니다</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM users WHERE id = :id"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>([</span><span><span class="hljs-string">'id'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>]);
</span><span><span class="hljs-comment">// 물음표 자리 소유자를 사용하십시오</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM users WHERE id = ?"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>([</span><span><span class="hljs-number">1</span></span><span>]);
</span></span>
Execute ()를 호출 할 때 오류 처리가 특히 중요합니다. PDO는 기본적으로 경고 형태로 오류를 던지지 만 PDO :: Attr_erRMode를 설정하여 동작을 예외로 변경할 수 있습니다. 프로그램의 견고성을 보장하려면 오류 처리에 예외 모드를 사용하는 것이 좋습니다.
<span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-string">'mysql:host=localhost;dbname=test'</span></span><span>, </span><span><span class="hljs-string">'root'</span></span><span>, </span><span><span class="hljs-string">''</span></span><span>);
</span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">setAttribute</span></span><span>(PDO::</span><span><span class="hljs-variable constant_">ATTR_ERRMODE</span></span><span>, PDO::</span><span><span class="hljs-variable constant_">ERRMODE_EXCEPTION</span></span><span>);
</span></span>
이러한 방식으로, 실행 중에 오류가 발생하면 (예 : SQL 오류 또는 매개 변수 바인딩 문제) PDO는 프로그래머가 잡아서 처리 할 수있는 예외를 던집니다.
<span><span><span class="hljs-keyword">try</span></span><span> {
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM users WHERE id = :id"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>([</span><span><span class="hljs-string">'id'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>]);
} </span><span><span class="hljs-keyword">catch</span></span><span> (PDOException </span><span><span class="hljs-variable">$e</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Error: "</span></span><span> . </span><span><span class="hljs-variable">$e</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}
</span></span>
Execute () 메소드에 전달 된 매개 변수가 SQL 문의 데이터 유형과 일치하는지 확인하십시오. 예를 들어, 데이터베이스 테이블의 필드가 정수 유형 인 경우 파라미터를 바인딩 할 때 정수 유형의 데이터도 전달되어야합니다.
<span><span><span class="hljs-comment">// 실수:정수 대신 문자열을 통과하십시오</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM users WHERE id = :id"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>([</span><span><span class="hljs-string">'id'</span></span><span> => </span><span><span class="hljs-string">'one'</span></span><span>]);
</span><span><span class="hljs-comment">// 옳은:传递옳은的数据类型</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM users WHERE id = :id"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>([</span><span><span class="hljs-string">'id'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>]);
</span></span>
때로는 결합 매개 변수가 다르다는 점을 제외하고 동일한 SQL 문을 여러 번 실행해야합니다. 이 경우 execute ()를 사용하여 각 쿼리를 다른 매개 변수로 반복적으로 실행할 수 있지만, 실행 ()가 실행 될 때마다 이전 바인딩 정보를 지우는 것입니다. 따라서 동일한 SQL을 여러 번 실행할 때 매번 매개 변수를 다시 반드하는 것이 좋습니다.
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM users WHERE age = :age"</span></span><span>);
</span><span><span class="hljs-variable">$ages</span></span><span> = [</span><span><span class="hljs-number">20</span></span><span>, </span><span><span class="hljs-number">30</span></span><span>, </span><span><span class="hljs-number">40</span></span><span>];
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$ages</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$age</span></span><span>) {
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>([</span><span><span class="hljs-string">'age'</span></span><span> => </span><span><span class="hljs-variable">$age</span></span><span>]);
</span><span><span class="hljs-comment">// 처리 결과</span></span><span>
}
</span></span>
execute () 메소드의 리턴 값은 쿼리가 성공했는지 여부를 나타냅니다. 선택 쿼리의 경우 일반적으로 쿼리 결과를 얻으려면 Fetch 또는 FetchAll 메소드를 사용해야합니다.
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM users WHERE id = :id"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>([</span><span><span class="hljs-string">'id'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>]);
</span><span><span class="hljs-comment">// 단일 라인 결과를 얻으십시오</span></span><span>
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetch</span></span><span>(PDO::</span><span><span class="hljs-variable constant_">FETCH_ASSOC</span></span><span>);
</span><span><span class="hljs-comment">// 모든 결과를 얻으십시오</span></span><span>
</span><span><span class="hljs-variable">$results</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetchAll</span></span><span>(PDO::</span><span><span class="hljs-variable constant_">FETCH_ASSOC</span></span><span>);
</span></span>
execute () 는 쿼리 결과를 자동으로 반환하지 않습니다. SQL 문을 실행할 책임이 있으며 실제 결과 획득은 후속 Fetch 또는 Fetchall을 통해 전달되어야합니다.
execute ()를 사용하는 경우 프로그래머는 다음과 같은 일반적인 오류가 발생하기 쉽습니다.
매개 변수 유형 불일치 : SQL의 데이터 유형이 바운드 매개 변수의 데이터 유형과 일치하는지 확인하십시오.
매개 변수 바인딩을 잊어 버렸습니다 . Execute ()를 실행할 때 모든 자리 표시 자의 매개 변수를 바인딩하는 것을 잊어 버리면 오류가 발생할 수 있습니다. SQL 문 및 execute () 매개 변수가 하나씩 해당하는지 확인하십시오.
잘못된 SQL 구문 : 특히 자리 표시자를 사용할 때 SQL 구문이 올바른지 확인하십시오.
execute ()를 여러 번 호출 할 때 매개 변수를 잊어 버렸습니다 .
이러한 문제를 피하려면 Execute ()를 호출하기 전에 SQL 문, 매개 변수 바인딩 및 데이터 유형을 신중하게 확인하는 것이 좋습니다.
pdostatement :: execute ()를 호출하기 전에 전처리 문의 작동 원리, 매개 변수 바인딩 방법, 오류 처리 및 매개 변수 유형의 사용을 이해하는 것이 매우 중요합니다. 이 지식을 마스터하면 코드의 보안 및 성능을 향상시킬 수있을뿐만 아니라 일반적인 오류의 발생을 줄이고 코드의 유지 관리 가능성을 향상시킬 수 있습니다. 이러한 오류를 피함으로써 개발자는보다 효율적이고 강력한 데이터베이스 작업 코드를 작성할 수 있습니다.