배치 업데이트는 데이터베이스 작업에 PHP를 사용할 때 일반적인 요구 사항입니다. 여러 개의 별도 업데이트 문을 직접 실행하는 것은 비효율적 일뿐 만 아니라 데이터베이스의로드를 증가시킵니다. MySQLI_STMT :: 준비 방법을 사용하여 전처리 문 및 매개 변수 바인딩은 배치 업데이트의 성능 및 보안을 크게 향상시킬 수 있습니다.
이 기사는 MySQLI_STMT :: 배치 업데이트 작업을 구현하고 특정 효율성 최적화 제안을 제공하는 방법을 자세히 소개합니다.
전처리 진술은 매우 안전합니다 <br> 전처리 명세서는 SQL 주입의 위험을 피하고 파라미터를 바인딩하여 SQL 문에서 별도의 사용자 입력을 피할 수 있습니다.
개선 된 실행 효율 <br> 동일한 전처리 명령문은 한 번만 컴파일되며 여러 번 실행되며 매개 변수 만 교체하여 데이터베이스 파싱 시간이 줄어 듭니다.
간결한 코드와 유지 관리가 쉬운 <br> 배치 작동 로직 포장 및 멀티플렉싱에 적합한 명확한 구조
사용자 ID를 기반으로 한 배치로 상태를 업데이트 해야하는 사용자 테이블이 있다고 가정합니다. 전통적인 관행은 다음과 같습니다.
UPDATE users SET status = 'active' WHERE id = 1;
UPDATE users SET status = 'inactive' WHERE id = 2;
...
그러나 여러 SQL 문을 실행하는 오버 헤드는 높으며 개선 솔루션은 다음과 같습니다.
사전 컴파일 된 업데이트 명령문 템플릿.
차례로 다른 매개 변수를 바인딩하여 실행하십시오.
다음은 MySQLI_STMT :: 준비를 사용하여 배치 업데이트를 구현하는 데모 코드입니다.
<?php
$mysqli = new mysqli("gitbox.net", "username", "password", "database");
// 연결을 확인하십시오
if ($mysqli->connect_error) {
die("연결이 실패했습니다: " . $mysqli->connect_error);
}
// 전처리 SQL,장소 보유자를 설정하십시오
$sql = "UPDATE users SET status = ? WHERE id = ?";
$stmt = $mysqli->prepare($sql);
if (!$stmt) {
die("전처리失败: " . $mysqli->error);
}
// 배치 업데이트 데이터를 시뮬레이션합니다
$updateData = [
['status' => 'active', 'id' => 1],
['status' => 'inactive', 'id' => 2],
['status' => 'pending', 'id' => 3],
];
// 바인딩 매개 변수
foreach ($updateData as $data) {
// 'si' 첫 번째 매개 변수는 문자열임을 나타냅니다,두 번째 매개 변수는 정수입니다
$stmt->bind_param('si', $data['status'], $data['id']);
$stmt->execute();
if ($stmt->error) {
echo "실행 실패: " . $stmt->error . "\n";
}
}
$stmt->close();
$mysqli->close();
?>
거래 처리 <br> 트랜잭션 수를 줄이기 위해 여러 업데이트 명세서를 거래에 넣습니다.
$mysqli->begin_transaction();
foreach ($updateData as $data) {
$stmt->bind_param('si', $data['status'], $data['id']);
$stmt->execute();
}
$mysqli->commit();
배치 업데이트 병합 <br> 업데이트 필드가 동일하고 데이터 볼륨이 크면 명령문이 한 번에 여러 레코드를 업데이트하는 경우 케이스를 사용할 수 있습니다.
$ids = array_column($updateData, 'id');
$ids_list = implode(',', $ids);
$sql = "UPDATE users SET status = CASE id ";
foreach ($updateData as $data) {
$status = $mysqli->real_escape_string($data['status']);
$sql .= "WHEN {$data['id']} THEN '{$status}' ";
}
$sql .= "END WHERE id IN ($ids_list)";
$mysqli->query($sql);
이 방법은 한 번에 대규모 배치 업데이트에 적합하지만 전처리 문의 유연성과 보안을 잃습니다.
적절한 연결과 자원을 준비하십시오 <br> 리소스 병목 현상으로 인한 성능 병목 현상을 피하기 위해 데이터베이스 연결이 올바르게 구성되어 있는지 확인하십시오.
MySQLI_STMT :: 배치 업데이트를 달성하기 위해 준비하면 운영의 보안을 보장 할뿐만 아니라 실행 효율성을 향상시킬 수 있습니다. 트랜잭션 관리와 합리적인 SQL 구성 방법을 결합하면 성능을 더욱 최적화 할 수 있으며 대부분의 PHP+MySQL 애플리케이션 시나리오에 적합합니다.
위의 예제 코드 및 기술을 사용하면 효율적이고 안전한 배치 업데이트 작업을 효과적으로 달성 할 수 있습니다.