레이블이 bindValue인 게시물을 표시합니다. 모든 게시물 표시
레이블이 bindValue인 게시물을 표시합니다. 모든 게시물 표시

2015년 1월 5일 월요일

bindParam / foreach, for 문등의 반복문 사용시 주의점

mysql_query 등 mysql_* 함수를 PDO로 변경하면서 bindParam 사용시 주의점.
bindParam의 변수 평가 시점에 따라 원하지 않은 결과가 나올 수 있다.

참고 : bindParam / bindValue 차이점 - (PHP PDO)


함수에서 배열로 변수를 받아 반복문 사용시 실수 하는 부분이다.(잘못된 예제)
$a['a'] = ':0';
$a['b'] = ':1';
$a['c'] = ':2';
$sth = $sth->prepare('SELECT name FROM students WHERE number_idx IN(".implode(",",$a).")');
foreach($a as $key=>$value) {
  $sth->bindParam($value,$key,PDO::PARAM_INT); 
} 
$sth->execute();

반복문을 실행시키더라도 execute(); 구문에서 변수가 평가되어 결과적으로 예상하지 않은 결과과 나오게 된다. bindValue로 변경시 원하는 결과를 얻을 수 있다.

2014년 10월 31일 금요일

bindParam / bindValue 차이점 - (PHP PDO)

메뉴얼에도 잘 나와있지만 bindParam과 bindValue 의 차이점에 대한 좋은 예이다.

$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' 

동일한 함수이지만 변수의 평가되는 시점에 차이가 있다.
http://stackoverflow.com/questions/1179874/pdo-bindparam-versus-bindvalue

참고
mysql_connect 등의 함수는 PHP 5.5.0부터 폐기되며, 향수 제거될 예정이라고 한다.
mysql_* 등의 함수는 MySQLi 또는 PDO_MYSQL로 사용해야 한다.
http://kr1.php.net/manual/en/function.mysql-connect.php