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 referencePDOStatement::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,'张三');