PHP pdo에서 PDOStatement 클래스의 BindParam과 BindValue 메소드의 차이점

WBOY
풀어 주다: 2016-08-08 09:25:24
원래의
1206명이 탐색했습니다.

PDOStatement 클래스의 두 가지 메소드에 대한 구체적인 설명은 다음과 같습니다.

bool PDOStatement::bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] )<pre name="code" class="php">bool PDOStatement::bindValue ( mixed $parameter , mixed $value [, int $data_type = PDO::PARAM_STR ] )
로그인 후 복사
로그인 후 복사
로그인 후 복사

차이점 1:bindParam은 매개 변수를 지정된 변수 이름에 바인딩하는 반면,bindValue는 매개변수에 값을 바인딩

<pre name="code" class="php">$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass');
$st = $db->prepare('select * from tabletest where id = ?');
$id = 1;
$st->bindParam(1,$id,PDO::PARAM_INT);
//$st->bindValue(1,$id,PDO::PARAM_INT);
로그인 후 복사
로그인 후 복사
로그인 후 복사
위의 코드에서는bindParam이든,bindValue이든 정상적으로 실행이 가능하지만, 다음 코드로 바꾸면 $db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass'); $st = $db->prepare('select * from tabletest where id = ?'); $st->bindParam(1,1,PDO::PARAM_INT); //$st->bindValue(1,1,PDO::PARAM_INT);

차이점 2:

Fatal error: Cannot pass parameter 2 by reference
로그인 후 복사
PDOStatement::bindValue()

, PDOStatement::bindParam()과 다릅니다. 변수는 다음과 같이 바인딩됩니다. 참조이며 해당 값은 PDOStatement::execute()가 호출될 때만 사용됩니다. 먼저 $id에 1의 값을 할당하고, binParam은 변수를 바인딩하고, 실행하기 전에 $id를 2로 변경합니다. 이때 얻은 결과 집합은 id가 1일 때의 질의 결과가 아니라 id = 2일 때의 질의 결과이다. 이는 참고용 변수에 대한 설명으로, 실행하기 전에 이 변수를 대체할 수 있다. 이며, 실행 작업을 실행할 때 대체되는 변수 값은 해당 변수의 마지막으로 변경된 값입니다.

$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass');
$st = $db->prepare('select * from tabletest where id = ?');
$id = 1;
$st->bindParam(1,$id,PDO::PARAM_INT);
$id = 2;
$st->execute();
$rs = $st->fetchAll();
print_r($rs);
로그인 후 복사
하지만 bindValue를 사용하여 변수를 바인딩한 후에는 Execution을 실행하기 전에 변수의 값이 변경되더라도 결과는 변경되지 않습니다. 예를 들어 위의 예에서 $id를 2로 변경하더라도 최종 실행 결과는 $id =1일 때 결과를 출력합니다. 왜냐하면bindValue는 변수에 대한 참조에 바인딩되지 않고 변수로 변경되지 않기 때문입니다. 변화. 정수 ID와 문자열 이름이라는 두 개의 필드가 있는 데이터 테이블과 전처리를 사용하여 삽입할 준비가 된 데이터 배열 $params = array(1,'Zhang San')이 있다고 가정합니다.

$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass');
$st = $db->prepare('select * from tabletest where id = ?');
$id = 1;
$st->bindValue(1,$id,PDO::PARAM_INT);
$id = 2;
$st->execute();
$rs = $st->fetchAll();
print_r($rs);
로그인 후 복사
일반적으로 실행되는 sql 문은

이어야 합니다. 실제로 실제로 실행되는 sql 문은

이기 때문입니다. BindParam의 변수는 참조가 바인딩되어 있으므로 각 필드에 삽입된 값이 마지막 필드의 값이 됩니다. 이 예에서 설명해야 할 또 다른 점은 인덱스 배열과 결합된 물음표 자리 표시자를 사용하는 경우 바인딩 값(이 메서드의 첫 번째 매개 변수)의 매개 변수 식별자에 특별한 주의를 기울여야 한다는 것입니다. 인덱스 배열이 시작됩니다. 기본적으로 0부터 시작하며, BindValue 매개변수 식별자는 1로 시작합니다. 인덱스 배열의 첨자 0을 직접 삽입하면 프로그램에서 오류가 발생하므로 주의해야 합니다.

$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass');
$st = $db->prepare('insert into tabletest(id,name) values(?,?)');
$params = array(1,'张三');
foreach($params as $k => $v){
    $index = $k + 1;
    $st->bindParam($index,$v);
}
$st->execute();
로그인 후 복사

위 내용은 관련 내용을 포함하여 php pdo에 있는 PDOStatement 클래스의 binParam과 binValue 메소드의 차이점을 소개하고 있으며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

insert into tabletest(id,name) values(1,'张三');
로그인 후 복사

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!