다량의 데이터 삽입 작업을 처리 할 때 삽입 문을 통해 루프가 덜 효율적입니다. 성능을 향상시키기 위해 MySQLI :: STMT_INIT BIND_PARAM () 과 결합하여 사전 처리 된 문의 배치 실행을 구현하는 데 사용될 수 있으며, 이는 실행 효율을 향상시킬뿐만 아니라 SQL 주입 위험을 방지 할 수 있습니다. 이 기사에서는 예제를 통해이 작업을 효율적으로 수행하는 방법을 설명합니다.
준비 + bind_param 의 사용은 기존 문자열 스 플라이 싱 방법보다 안전하며 특히 동적 매개 변수가있는 상황에 특히 적합합니다. 장점은 다음과 같습니다.
SQL 주입을 피하십시오.
실행 효율을 향상시키기 위해 SQL의 반복적 인 컴파일을 피하십시오.
좋은 가독성과 명확한 구조.
우리는 간단한 사용자 정보 테이블 사용자를 예로 들고 그 구조는 다음과 같습니다.
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50),
email VARCHAR(100)
);
여러 사용자 레코드를 삽입해야한다고 가정하십시오. 다음은 전체 PHP 구현입니다.
<?php
// 데이터베이스 연결 구성
$mysqli = new mysqli("localhost", "db_user", "db_pass", "db_name");
// 연결을 확인하십시오
if ($mysqli->connect_errno) {
die("연결이 실패했습니다: " . $mysqli->connect_error);
}
// 명령문 객체를 초기화하십시오
$stmt = $mysqli->stmt_init();
// 준비하다 SQL 성명
$sql = "INSERT INTO users (username, email) VALUES (?, ?)";
if (!$stmt->prepare($sql)) {
die("전처리가 실패했습니다: " . $stmt->error);
}
// 바인딩 매개 변수(변수는 참조됩니다)
$stmt->bind_param("ss", $username, $email);
// 삽입 할 데이터를 시뮬레이션합니다
$data = [
["alice", "alice@m66.net"],
["bob", "bob@m66.net"],
["charlie", "charlie@m66.net"]
];
// 배치 삽입을 수행하십시오
foreach ($data as $row) {
$username = $row[0];
$email = $row[1];
if (!$stmt->execute()) {
echo "삽입 실패: " . $stmt->error . "<br>";
}
}
$stmt->close();
$mysqli->close();
?>
$ mysqli-> repay () 약어를 직접 사용할 수는 있지만 stmt_init을 사용하여 프로세스를 명시 적으로 표현하는데, 이는 복잡하거나 대규모 프로젝트에 더 적합합니다.
bind_param은 변수에 대한 참조를 바인딩하므로 루프에서 변수의 값을 변경할 수 있으며 매번 반창 할 필요가 없습니다.
각 execution () 후 리턴 값을 확인하면 삽입에 실패한 레코드를 신속하게 찾는 데 도움이 될 수 있습니다.
배치 제출 : 대량의 데이터 삽입의 경우 배치로 처리 할 수 있습니다 (예 : 1,000 항목 당 하나의 그룹).
자동 커밋 ( $ mysqli-> autocommit (false) )을 끄고 배치가 처리 된 후 균일하게 트랜잭션을 제출하십시오.
다중 값 삽입 구문을 사용하여 테스트 성능 차이를 비교하십시오 (... 값 (...), (...), ...)에 삽입하십시오.
mysqli :: stmt_init 및 bind_param ()을 사용하면 배치 삽입의 효율성을 향상시킬뿐만 아니라 응용 프로그램의 보안 및 유지 보수 가능성을 향상시킬 수 있습니다. 이 방법은 많은 양의 사용자 데이터 또는 로깅과 같은 시나리오를 처리 할 때 특히 권장됩니다.