>백엔드 개발 >PHP 튜토리얼 >PDO의 IN 절이 배열 매개변수와 함께 작동하지 않는 이유는 무엇이며 어떻게 해결할 수 있습니까?

PDO의 IN 절이 배열 매개변수와 함께 작동하지 않는 이유는 무엇이며 어떻게 해결할 수 있습니까?

DDD
DDD원래의
2024-12-26 14:17:09844검색

Why Doesn't PDO's IN Clause Work with Array Parameters, and How Can I Fix It?

IN 절 배열과 함께 PDO 사용

PDO를 사용하여 해당 값에 배열을 사용하는 IN 절이 있는 명령문을 실행할 때 예상치 못한 동작이 발생할 수 있습니다. 이 문서에서는 특정 접근 방식이 작동하지 않는 이유를 설명하고 대체 솔루션을 제공합니다.

예:

$in_array = array(1, 2, 3);
$in_values = implode(',', $in_array);
$my_result = $wbdb->prepare("SELECT * FROM my_table WHERE my_value IN ($in_values)");
$my_result->execute();
$my_results = $my_result->fetchAll();

이 코드는 예상대로 작동합니다. 그러나 IN 절과 함께 명명된 매개 변수를 사용하려고 하면 다음 코드는 다음과 같은 작업을 수행하지 않습니다.

$in_array = array(1, 2, 3);
$in_values = implode(',', $in_array);
$my_result = $wbdb->prepare("SELECT * FROM my_table WHERE my_value IN (:in_values)");
$my_result->execute(array(':in_values' => $in_values));
$my_results = $my_result->fetchAll();

설명:

PDO는 IN 절을 처리하는 데 어려움이 있습니다. 배열. 대신 자리 표시자가 있는 문자열을 생성하고 이를 쿼리에 삽입하여 일반적인 방법으로 배열 값을 바인딩해야 합니다.

대안:

위치 사용 자리 표시자

자리 표시자가 있는 문자열을 동적으로 생성하여 쿼리:

$in  = str_repeat('?,', count($in_array) - 1) . '?';
$sql = "SELECT * FROM my_table WHERE my_value IN ($in)";
$stm = $db->prepare($sql);
$stm->execute($in_array);
$data = $stm->fetchAll();

이름이 지정된 자리 표시자 사용

array_merge() 함수를 사용하여 이름이 지정된 자리 표시자를 포함하여 모든 변수를 단일 배열로 결합할 수 있습니다.

// Other parameters that are going into query
$params = ["foo" => "foo", "bar" => "bar"];

$ids = [1, 2, 3];
$in = "";
$i = 0; // Using an external counter because actual array keys could be dangerous
foreach ($ids as $item) {
    $key = ":id" . $i++;
    $in .= ($in ? "," : "") . $key; // :id0,:id1,:id2
    $in_params[$key] = $item; // Collecting values into a key-value array
}

$sql = "SELECT * FROM table WHERE foo=:foo AND id IN ($in) AND bar=:bar";
$stm = $db->prepare($sql);
$stm->execute(array_merge($params, $in_params)); // Just merge two arrays
$data = $stm->fetchAll();

위 내용은 PDO의 IN 절이 배열 매개변수와 함께 작동하지 않는 이유는 무엇이며 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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