문제

데이터 유형의 선언이 무엇인지 궁금합니다. bindParam() (또는 bindValue())는 ...

내 말은, 나는 정수 인수를 정의하면 (PDO::PARAM_INT), 인수는 정수로 변환되어야합니다.

$delete->bindParam(1, $kill, PDO::PARAM_INT);
// should work like
$delete->bindParam(1, (int)$kill);

또는 인수가 선언 된 유형이 아닌 경우 적어도 오류를 던집니다. 그러나 이것은 사실이 아닙니다.

Googling 주변에서는 Php.net 아카이브에서 다음을 발견했습니다.

안녕하세요,

나는 현재 PDO에서 일하고 있습니다. BindParam () 함수에서 정확히. 세 번째 매개 변수 data_type는 값의 유형을 강요하기 위해 여기에있는 것 같습니다. 하지만 내가 시도 할 때 :

$sql = "INSERT INTO produit (idproduit, nom, marque) VALUES (NULL, :nom, :marque)";
$stmt = $dbh->prepare($sql);
$nom = 'Testarossa'; $marque = 'Ferrari' ;
$stmt->BindValue(':marque',$marque) ;
$stmt->BindParam(':nom',$nom,PDO::PARAM_INT) ;

$stmt->execute(); $nom = '250 GTO' ;
$stmt->execute(); ?>

데이터베이스에 PHP 오류 또는 인터저기가있을 것으로 예상했습니다. 그러나 내 DB에는 다음과 같습니다.

22 Testarossa Ferrari 23 250 GTO Ferrari

세 번째 매개 변수가 있든 없든 변경되지 않았다는 것을 의미합니다. 아니면 아마도 뭔가 그리워요. 누군가 나를 더 가질 수 있습니까? 아니면 누군가가 내가 그것에 대한 정보를 찾을 수있는 곳을 나에게 말할 수 있습니까?

문안 인사,

사이러스

그것이 바로 내 상황입니다. 내 생각은 어디에서 잘못되고 있습니까?

도움이 되었습니까?

해결책

다른 언어로 된 다른 DB 추상화 프레임 워크에서는 라이닝 값 (적절한 바운드 매개 변수를 지원하지 않는 드라이버)을 위해 적절한 탈출을하고 숫자를 확인하여 네트워크 효율성을 향상시키는 것과 같은 일에 사용할 수 있습니다. 이진이 적절하게 포장 (프로토콜 지원이 제공). PDO에서는 것처럼 보이지만 많이하지 않습니다.

   if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_STR && param->max_value_len <= 0 && ! ZVAL_IS_NULL(param->parameter)) {
                if (Z_TYPE_P(param->parameter) == IS_DOUBLE) {
                        char *p;
                        int len = spprintf(&p, 0, "%F", Z_DVAL_P(param->parameter));
                        ZVAL_STRINGL(param->parameter, p, len, 0);
                } else {
                        convert_to_string(param->parameter);
                }
        } else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_INT && Z_TYPE_P(param->parameter) == IS_BOOL) {
                convert_to_long(param->parameter);
        } else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_BOOL && Z_TYPE_P(param->parameter) == IS_LONG) {
                convert_to_boolean(param->parameter);
        }

따라서 STR이라고 말하면 (또는 기본값으로 전혀 말하지 않으면) 데이터의 내부 유형이 더블이면 하나의 메소드를 사용하여 문자열로 전환됩니다. 다른 방법을 사용하여 문자열로 변환합니다.

당신이 그것이 int라고 말하면 실제로는 bool이면 그것을 오래 전환합니다.

당신이 그것이 부울이라고 말하면 실제로 숫자라고한다면 그것은 그것을 진정한 부울로 변환합니다.

이것은 내가 STMT 소스를보고 (빨리) 본 전부입니다. 매개 변수를 드라이버로 전달하면 추가 마법을 할 수 있다고 생각합니다. 그래서, 나는 당신이 얻는 모든 것이 약간의 옳고 동인들 사이의 많은 행동 모호성과 분산을하는 것이라고 생각합니다.

다른 팁

그래서 나는 PHP 소스 코드로 뛰어 들기로 결정했고 이것이 내가 찾은 것입니다.

static int really_register_bound_param ext/pdo/pdo_stmt.c에서 5.2.9의 329 행

if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_STR && param->max_value_len <= 0 && ! ZVAL_IS_NULL(param->parameter)) {
    if (Z_TYPE_P(param->parameter) == IS_DOUBLE) {
        char *p;
        int len = spprintf(&p, 0, "%F", Z_DVAL_P(param->parameter));
        ZVAL_STRINGL(param->parameter, p, len, 0);
    } else {
        convert_to_string(param->parameter);
    }
} else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_INT && Z_TYPE_P(param->parameter) == IS_BOOL) {
    convert_to_long(param->parameter);
} else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_BOOL && Z_TYPE_P(param->parameter) == IS_LONG) {
    convert_to_boolean(param->parameter);
}

이들은 PDO가 바인딩하는 동안하는 전환입니다.

  • PDO :: Param_str는 NULL을 제외한 문자열로 제공하는 모든 것을 변환합니다.
  • pdo :: param_int는 부울을 오랫동안 변환합니다
  • PDO :: PARAM_BOOL은 오랫동안 BOOLS로 변환합니다

그게 다야. 다른 것은 변환되지 않습니다. PDO는 Param 플래그를 사용하여 데이터 유형을 캐스팅하지 않도록 SQL을 포맷합니다.

pdo :: param_int가 끼워 넣다 쿼리 : 부울 값은 0 또는 1으로 변환됩니다.

$i = true;
$stmt->bindParam(':i', $v, PDO::PARAM_INT);

pdo_stmt.c :

else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_INT && Z_TYPE_P(param->parameter) == IS_BOOL) {
        convert_to_long(param->parameter);
}

나는 BindValue로 동일한 것을 시도했고 같은 결과를 얻었으므로 당신이보고있는 동작은 bindparam에만 국한되지 않습니다.

$stmt->BindValue(':marque', $marque) ;
$stmt->BindValue(':nom', $nom, PDO::PARAM_INT) ;

$stmt->execute();
$nom = '250 GTO';
$stmt->BindValue(':nom', $nom, PDO::PARAM_INT) ;
$stmt->execute(); 
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top