bindParam과 bindValue의 차이점은 무엇입니까?


답변:


190

답은 다음 문서에 있습니다 bindParam.

PDOStatement :: bindValue ()와 달리 변수는 참조로 바인딩되며 PDOStatement :: execute ()가 호출 될 때만 평가됩니다.

execute

PDOStatement :: bindParam ()을 호출하여 PHP 변수를 매개 변수 표시 문자에 바인드하십시오. 바운드 변수는 값을 입력으로 전달하고 연관된 매개 변수 표시 문자의 출력값을 수신합니다 (있는 경우).

예:

$value = 'foo';
$s = $dbh->prepare('SELECT name FROM bar WHERE baz = :baz');
$s->bindParam(':baz', $value); // use bindParam to bind the variable
$value = 'foobarbaz';
$s->execute(); // executed with WHERE baz = 'foobarbaz'

또는

$value = 'foo';
$s = $dbh->prepare('SELECT name FROM bar WHERE baz = :baz');
$s->bindValue(':baz', $value); // use bindValue to bind the variable's value
$value = 'foobarbaz';
$s->execute(); // executed with WHERE baz = 'foo'

667

대한 수동 입력에서PDOStatement::bindParam :

[With bindParam]와 달리 PDOStatement::bindValue()변수는 참조로 바인딩되며 PDOStatement::execute()호출 할 때만 평가됩니다 .

예를 들어,

$sex = 'male';
$s = $dbh->prepare('SELECT name FROM students WHERE sex = :sex');
$s->bindParam(':sex', $sex); // use bindParam to bind the variable
$sex = 'female';
$s->execute(); // executed with WHERE sex = 'female'

또는

$sex = 'male';
$s = $dbh->prepare('SELECT name FROM students WHERE sex = :sex');
$s->bindValue(':sex', $sex); // use bindValue to bind the variable's value
$sex = 'female';
$s->execute(); // executed with WHERE sex = 'male'

9
훌륭합니다, 감사합니다! 질문-왜 다른 것을 사용하고 싶습니까? 바인드 매개 변수가 execute () 시간에만 평가되도록하는 것이 언제 유용합니까?
Coldblackice

32
@Coldblackice 다른 데이터로 쿼리를 여러 번 실행 한 경우. 으로 bindValue당신은 데이터마다 바인드를 다시해야 할 것입니다. 함께 bindParam방금 변수를 업데이트해야 할 것입니다. 사용하는 주된 이유는 bindValue리터럴 문자열 또는 숫자와 같은 정적 데이터입니다.
lonesomeday

1
예를 들어, 함수 반환 값과 함께 bindValue를 사용하려고합니다. $ stmt-> bindValue ( ': status', strtolower ($ status), PDO :: PARAM_STR);
paidforbychrist


219

여기 내가 생각할 수있는 것들이 있습니다 :

  • 을 사용하면 bindParam변수 만 전달할 수 있습니다. 값이 아님
  • 을 사용 bindValue하면 (값, 분명히, 변수)를 모두 전달할 수 있습니다
  • bindParam변수는 "reference"에 의해 입력 / 출력으로 매개 변수를 제공 할 수 있기 때문에 변수와 만 작동합니다 (그리고 PHP에서 값은 유효한 "reference"가 아닙니다 ).

데이터를 출력 매개 변수로 리턴하는 저장 프로 시저 호출 및 일부는 데이터를 보내고이를 수신하도록 업데이트되는 입력 / 출력 매개 변수로 호출을 지원합니다.

일부 DB 엔진의 경우 저장 프로 시저에는 입력 (PHP에서 프로 시저로 값 제공) 및 출력 (저장된 프로 시저에서 PHP로 값 반환)에 모두 사용할 수있는 매개 변수가있을 수 있습니다. 이러한 매개 변수를 바인딩하려면 bindValue가 아닌 bindParam을 사용해야합니다.


@PascalMartin 내가 알고 싶은 것은 bindParam으로 값을 바인딩 할 수 있습니까? 건배.
yehuda

1
나는 그것이 정확히 무엇을 의미하는지, 변수가 무엇이며, 값이 무엇인지에 대한 단서가 없습니다. bindParam을 사용하여 값을 자리 표시 자에 바인딩하고 bindValue를 사용하여 동일하게 할 수 있습니다! -적어도 내 예에서 ...
Richard Richard

29

에서 준비된 문 및 저장 프로 시저

bindParam한 번의 바인딩으로 여러 행을 삽입하는 데 사용하십시오 .

<?php

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);

// insert one row
$name = 'one';
$value = 1;
$stmt->execute();

// insert another row with different values
$name = 'two';
$value = 2;
$stmt->execute();

27

가장 일반적인 목적으로을 사용해야합니다 bindValue.

bindParam 두 가지 까다 롭거나 예기치 않은 동작이 있습니다.

  • bindParam(':foo', 4, PDO::PARAM_INT) 변수를 (참조로) 전달해야하므로 작동하지 않습니다.
  • bindParam(':foo', $value, PDO::PARAM_INT)$value실행 후 문자열로 변경 됩니다 execute(). 물론 이것은 잡기 어려운 미묘한 버그로 이어질 수 있습니다.

출처 : http://php.net/manual/en/pdostatement.bindparam.php#94711


4

이것을 완화시키는 방법이있을 때 더 이상 고투 할 필요가 없습니다.

$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]); 

4

행동으로 암기 할 수있는 가장 간단한 방법 (PHP 측면에서) :

  • bindParam: 참고
  • bindValue: 변하기 쉬운
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.