Bindparam과 BindValue의 차이점은 무엇입니까?
문제
차이점은 무엇입니까? 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()
. 물론 이것은 잡기 어려운 미묘한 버그로 이어질 수 있습니다.
당신은 더 이상 어려움을 겪을 필요가 없습니다.
$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]);
행동에 의한 암기를위한 관점 (PHP 측면에서)을 관점으로 만드는 가장 간단한 방법 :
bindParam:
참조bindValue:
변하기 쉬운