2011-04-26 4 views
10

SQL 문에 매개 변수를 바인딩 할 때 PDO::PARAM_STR과 같은 매개 변수 유형을 제공 할 수 있습니다. 그렇지 않은 경우 기본값을 PDO::PARAM_STR으로 입력하십시오. 각 매개 변수의 유형을 구체적으로 설정해야하는 이유는 무엇입니까? PDO :: PARAM_STR은 최소한 MySQL에서 알고있는 모든 매개 변수와 함께 작동합니다. 나는 심지어 PDO :: PARAM_STR을 BLOB 컬럼에서도 사용할 수 있다고 생각한다.PDO에 강력하게 매개 변수를 입력하는 이유는 무엇입니까?

아직 준비된 쿼리가 있으므로 PDO :: PARAM_STR은 SQL 주입을 도입하지 않습니다.

답변

7

PARAM_STR 항상 MySQL을 implicitly converts values to the correct type where it can 때문에 열 값에 일을 어떻게 사용하지만,이 쿼리 예를 들면 실패합니다

$limit = 1; 

$dbh->prepare("SELECT * FROM items LIMIT :limit"); 
$dbh->bindParam(":limit", $limit, PDO::PARAM_STR); 
    // Will throw "You have an error in your SQL syntax..." 
이 이

하나가 절대적으로 PARAM_INT를 사용해야 적절한 경우 - 위의 같은 경우에, 그리고 예상보다 엄격한 mySQL 이외의 데이터베이스 엔진을 준비하십시오. 어쨌든 나는 자리에서 유형을 정의하는 것을 선호 것 때문에

$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

, 그것은 LIMIT의 경우 자동으로

을 감지 것 :

+0

+1 저, 훌륭한 사례. SQL 주입뿐만 아니라 사용자에게 원시 MySQL 오류 메시지를 표시하는 것이 매력적이지 않고 전문적이지 않기 때문에 개발자 **는 항상 유형 안전을 구현해야합니다. –

+0

@ N.B. 나에게 그것은 너무 지루하다. 반복적으로이 바인딩을 반복하는 것보다 간결한 코드를 선호합니다. –

+0

뭘 할 지 너무 지루합니까? –

5

개인적으로 나는만큼 당신이이 속성 세트를 가지고, 이유를 볼 수 없습니다 바인딩 기능이 아닙니다.

그러나 PDO 사용 경험은 그리 강하지 않습니다. 난 그냥 그것을 밖으로 시도하고 다시 일반 mysql로 ​​돌아 가기로 결정했습니다.

관련 문제