PDO bindParam 과 bindValue 의 차이

메뉴얼에 설명이 있긴 한데 좀 글로 이해하려니 저는 좀 어려웠습니다. 스택오버플로에서 아래 예제를 보니 좀 이해가 되더군요.

$sex = 'male';
$stmt = $db->prepare('SELECT name FROM students WHERE sex = :sex');
$stmt->bindParam(':sex', $sex); // 변수에 바인딩하기 위해 bindParam을 사용
$sex = 'female';
$stmt->execute(); // WHERE sex = 'female' 로 실행됩니다.

bindParam은 레퍼런스를 바인딩한거라 바인딩 한 이후에 값을 변경할 수 있습니다. 반면 bindValue는 값 자체를 바인딩합니다. 그래서 아래와 같이 변수에 새로운 값을 넣어도 반영되지 않습니다.

$sex = 'male';
$stmt = $db->prepare('SELECT name FROM students WHERE sex = :sex');
$stmt->bindValue(':sex', $sex); // 변수값에 바인딩하기 위해 bindValue를 사용
$sex = 'female';
$stmt->execute(); // WHERE sex = 'male' 로 실행됩니다.

파라미터 값만 계속 변경되는 반복작업을 처리할 때는 bindParam 으로 하는게 더 좋을 수 있다고 합니다. 자세히는 모르지만 데이터베이스에서 더 효율적으로 처리한다는 것 같아요.

$stmt = $db->prepare('SELECT name FROM students WHERE id = :id');
$stmt->bindParam(':id', $id);
foreach($ids as $id) {
    $stmt->execute();
    //do something else
}

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.