PDO MySQL: 하나의 쿼리에 여러 행 삽입
PDO를 사용하여 단일 쿼리에 여러 행을 삽입하는 것은 어려운 작업일 수 있습니다. 그러나 준비된 문의 기능을 활용하면 이 프로세스를 단순화하고 일반적인 오류를 피할 수 있습니다.
문제: 배열을 문자열로 변환
" 여러 행이 포함된 INSERT 쿼리를 실행하려고 할 때 "배열을 문자열로 변환" 오류가 발생하면 PDO 문이 개별 값 대신 자리 표시자에 배열을 바인딩하려고 시도했을 가능성이 높습니다.
해결 방법: 바인딩 개별 값
이 문제를 해결하려면 각 행의 값을 반복하고 이를 준비된 문에 개별적으로 바인딩해야 합니다. 이는 PDO 문 개체의 binParam() 메서드를 사용하여 달성할 수 있습니다.
예를 들어 다음 코드를 고려해보세요.
$query = "INSERT INTO $table (key1, key2, key3) VALUES (:key1, :key2, :key3)"; $stmt = $pdo->prepare($query); foreach ($data as $item) { $stmt->bindParam(':key1', $item['key1']); $stmt->bindParam(':key2', $item['key2']); $stmt->bindParam(':key3', $item['key3']); $stmt->execute(); }
이 코드는 $data 배열의 각 값을 다음과 같이 바인딩합니다. 준비된 문의 해당 자리 표시자를 사용하여 배열의 각 행에 대해 하나씩 쿼리를 여러 번 실행합니다.
대체 솔루션: 배열 바인딩 사용
또는 일부 PDO 드라이버는 배열 바인딩을 지원하므로 전체 값 배열을 단일 자리 표시자에 바인딩할 수 있습니다. 그러나 이 기능은 보편적으로 지원되지 않으며 모든 경우에 사용 가능하지 않을 수 있습니다.
개선된 코드 예
다음은 multipleInsert() 함수의 향상된 버전입니다. 준비된 문을 사용하고 값을 개별적으로 바인딩합니다.
public function multipleInsert($table, $data = array()) { if (count($data) > 1) { $fieldnames = array_keys($data[0]); $query = "INSERT INTO $table (`" . implode('`, `', $fieldnames) . "`) VALUES "; $query .= implode(', ', array_fill(0, count($data), "(:" . implode(', :', $fieldnames) . ")")); $stmt = $this->start->prepare($query); $i = 1; foreach ($data as $item) { foreach ($item as $key => $value) { $stmt->bindParam(":$key$i", $item[$key]); $i++; } } $stmt->execute(); $return['status'] = true; $return['lastid'] = $this->start->lastInsertId(); return $return; } else { die('$data is less than two arrays, use single insert instead.'); } }
위 내용은 PDO를 사용하여 단일 MySQL 쿼리에 여러 행을 삽입하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!