PDO를 사용하면 값 배열과 함께 IN 절이 포함된 SQL 문을 실행할 수 있습니다. 이 접근 방식은 문자열 연결(implode())에 적합하지만 자리 표시자를 사용할 때 문제가 발생할 수 있습니다.
문제 식별
다음 코드는 자리 표시자, 예상되는 모든 항목을 반환하지 않음:
$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();
이 코드는 my_value가 다음과 같은 항목만 반환합니다. 다른 요소(2와 3)가 아닌 $in_array의 첫 번째 요소(1).
위치 자리 표시자용 솔루션
PDO에서는 자리 표시자가 있는 문자열을 동적으로 생성해야 합니다. 평소처럼 배열 값을 바인딩하면서 쿼리에 삽입합니다. 위치 자리 표시자의 경우 이 솔루션이 작동합니다.
$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();
명명된 자리 표시자에 대한 솔루션
명명된 자리 표시자에 대한 접근 방식에는 일련의 자리 표시자(예: :id0, :id1, :id2) 값을 키-값 배열로 수집합니다. 예는 다음과 같습니다.
$ids = [1,2,3]; $in = ""; $i = 0; 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(["foo" => "foo", "bar" => "bar"], $in_params)); // merge two arrays $data = $stm->fetchAll();
이러한 솔루션을 따르면 값 배열이 포함된 IN 절과 함께 PDO를 성공적으로 사용할 수 있습니다.
위 내용은 PHP에서 IN 절 및 배열과 함께 PDO를 올바르게 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!