문제

차이점은 무엇입니까? PDOStatement::bindParam() 그리고 PDOStatement::bindValue()?

도움이 되었습니까?

해결책

답은 문서에 있습니다 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'

다른 팁

에서 수동 입력 PDOStatement::bindParam:

와 함께 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'

여기에 내가 생각할 수있는 몇 가지가 있습니다.

  • 와 함께 bindParam, 당신은 변수 만 전달할 수 있습니다. 값이 아닙니다
  • ~와 함께 bindValue, 당신은 둘 다 (값, 분명히, 변수)를 전달할 수 있습니다.
  • bindParam "참조"로 매개 변수가 입력/출력으로 제공 될 수 있으므로 변수와 만 작동합니다. (그리고 값은 PHP에서 유효한 "참조"가 아닙니다) : (매뉴얼 인용) 드라이버에게 유용합니다.

데이터를 출력 매개 변수로 반환하는 저장된 프로 시저의 호출 및 일부는 데이터를 전송하고 수신하도록 업데이트되는 입력/출력 매개 변수로도 지원합니다.

일부 DB 엔진을 사용하면 저장된 절차에는 입력 (PHP에서 프로 시저로의 값을 제공) 및 OUPUT (저장 PROC에서 PHP 로의 값을 반환) 모두에 사용할 수있는 매개 변수가있을 수 있습니다. 이러한 매개 변수를 바인드하려면 BindParam을 사용해야하며 BindValue가 아닙니다.

에서 준비된 진술 및 저장 절차

사용 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();

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

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

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

원천: http://php.net/manual/en/pdostatem.bindparam.php#94711

당신은 더 이상 어려움을 겪을 필요가 없습니다.

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

행동에 의한 암기를위한 관점 (PHP 측면에서)을 관점으로 만드는 가장 간단한 방법 :

  • bindParam: 참조
  • bindValue: 변하기 쉬운
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top