>백엔드 개발 >PHP 튜토리얼 >PDO를 사용하여 배열 값을 MySQL IN 문에 올바르게 바인딩하는 방법은 무엇입니까?

PDO를 사용하여 배열 값을 MySQL IN 문에 올바르게 바인딩하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-04 22:27:11608검색

How to Properly Bind Array Values to a MySQL IN Statement Using PDO?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.