bindParam() vs bindValue() 바인딩에 따른 차이
쉽게 한번만 사용할거냐 여러번 사용할거냐에 대한 차이라고 생각해도 됩니다.
특별한 경우가 아니라면 다목적으로 사용이 가능한 bindParam 를 많이 사용 합니다. 구분해서 사용하려면 또 신경을 써야 하기 때문에 그렇죠
▶ bindParam() (참조 바인딩)
- 변수 자체를 바인딩 (이후 변수 값이 바뀌면 SQL 실행 시 그 값이 적용됨)
- 변수를 직접 전달해야 하고 즉시 값 대입이 불가능
- 반복문에서 같은 변수를 여러 번 사용할 경우 적합. 그리고 파라미터는 상수가 아니라 변수를 넣어줘야 합니다.
△ 비유: 패스트푸드점에서 "세트 메뉴 1번"을 주문하고, 음료는 나중에 결정할 수 있는 방식
$menu = "세트 1번";
$drink = "콜라";
$stmt = $pdo->prepare("INSERT INTO orders (menu, drink) VALUES (:menu, :drink)");
$stmt->bindParam(':menu', $menu); // 메뉴는 고정
$stmt->bindParam(':drink', $drink); // 음료는 나중에 결정 가능
$stmt->execute(); // 첫 번째 주문
$drink = "사이다";
$stmt->execute(); // 두 번째 주문 (음료만 변경됨)
▶ bindValue() (즉시 값 바인딩)
- 변수의 현재 값을 즉시 바인딩 (이후 변수 값이 바뀌어도 SQL에는 영향을 미치지 않음)
- 한 번만 사용할 값이라면 bindValue()가 더 적합
- 즉시 값을 바인딩할 때 직관적이고 안정적
△ 비유: 패스트푸드점에서 "세트 메뉴 1번 + 콜라"를 주문하면, 이후 변경 불가능한 방식
$stmt = $pdo->prepare("INSERT INTO orders (menu, drink) VALUES (:menu, :drink)");
$stmt->bindValue(':menu', "세트 1번");
$stmt->bindValue(':drink', "콜라");
$stmt->execute(); // 한 번만 실행됨
● 관련자료
- MySQLi에서 Named Parameter처럼 사용할 수 있도록 변환하는 사용자 함수 > PHP
- SQL 인젝션이 성공하는 취약한 코드와 안전한 코드 > PHP