MySQL IN 문에 대한 PDO 바인딩 값
PDO를 사용하여 값 배열을 MySQL IN에 바인딩할 때 문제가 발생합니다. 성명. 목표는 다음과 같이 쿼리를 실행하는 것입니다.
SELECT users.id FROM users JOIN products ON products.user_id = users.id WHERE products IN (1,2,3,4,5,6,7,8)
그러나 PDO는 바인딩된 값을 쉼표로 구분된 문자열로 변환하여 다음과 같은 잘못된 쿼리가 발생합니다.
SELECT users.id FROM users JOIN products ON products.user_id = users.id WHERE products IN ('1,2,3,4,5,6,7,8')
쿼리 자체 내에서 쉼표로 구분된 문자열을 분할하기 위해 사용자 정의 함수를 사용해 보았지만 이는 최적의 방법이 아닙니다. 솔루션.
해결책 1: 쿼리를 수동으로 구성
이전 질문에서 제안한 것처럼 각 IN 절 값에 대한 자리 표시자를 연결하여 쿼리를 수동으로 구성할 수 있습니다. 예:
$products = array(1,2,3,4,5,6,7,8); $placeholders = array_fill(0, count($products), '?'); $sql = "SELECT users.id FROM users JOIN products ON products.user_id = users.id WHERE products IN (" . implode(',', $placeholders) . ")"; $stmt = $pdo->prepare($sql); $stmt->execute($products);
해결책 2: find_in_set() 사용
find_in_set() 함수를 사용하여 쉼표로 구분된 문자열과 값을 일치시킬 수 있습니다. 그러나 이 접근 방식은 테이블의 모든 값을 문자 유형으로 변환해야 하기 때문에 대규모 데이터세트에서는 성능 문제가 발생할 수 있습니다.
$products = array(1,2,3,4,5,6,7,8); $sql = "SELECT users.id FROM users JOIN products ON products.user_id = users.id WHERE find_in_set(cast(products.id as char), '" . implode(',', $products) . "') > 0"; $stmt = $pdo->prepare($sql); $stmt->execute();
해결책 3: 사용자 정의 함수 만들기
가장 좋은 해결책은 쉼표로 구분된 문자열을 분할하는 사용자 정의 함수(UDF)를 만드는 것입니다. 이는 비교적 복잡한 솔루션이지만 가변 크기 목록이 있는 IN 절에 대해 최상의 성능을 제공합니다.
UDF 생성 지침은 제공된 링크를 참조하세요.
위 내용은 PDO를 사용하여 배열 값을 MySQL IN 문에 올바르게 바인딩하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!