전처리 문은 SQL 쿼리의 실행 방법입니다. SQL 쿼리를 두 부분으로 나눕니다.
전처리 단계 : SQL 문의 템플릿을 데이터베이스로 보내면 데이터베이스가 SQL 문을 구문 분석하고 컴파일하지만 쿼리를 실행하지는 않습니다. 현재 쿼리의 변수 부분 (예 : 사용자 입력)은 즉시 SQL에 삽입되지 않고 자리 표시 자 (일반적으로 ? )로 표시됩니다.
실행 단계 : 실행 중에 실제 매개 변수 값은 자리 표시자를 교체 할 수 있도록하고 데이터베이스는 명령문을 실행합니다.
이 접근법의 장점은 데이터베이스가 쿼리를 미리 준비하고 각 쿼리의 매개 변수를 안전하게 검증하여 SQL 주입의 위험을 피할 수 있다는 것입니다.
PHP에서는 MySQLI Extension을 통해 MySQL 데이터베이스를 운영하며 MySQLI_STMT :: __ Compuruct는 전처리 명령문을 작성하는 데 사용되는 MySQLI_STMT 클래스의 생성자입니다.
단계 개요 :
데이터베이스 연결 설정 : 먼저 데이터베이스 연결을 만들려면 MySQLI_CONNECT 또는 NEW MYSQLI ()를 사용해야합니다.
SQL 명세서 준비 : 자리 표시 자와 함께 SQL 문을 정의하십시오.
전처리 성명서 초기화 : mysqli_prepare 또는 mysqli_stmt :: __ construct를 사용하여 전처리 문을 만듭니다.
바인드 매개 변수 : BIND_PARAM 메소드를 사용하여 전처리 명령문에서 가변 값을 자리 표시 자에게 바인딩합니다.
실행 명세서 : Execute 메소드를 사용하여 전처리 명령문을 실행하십시오.
이름, 이메일 및 연령을 포함하여 사용자 데이터를 사용자 테이블에 삽입하려고한다고 가정하면 MySQLI_STMT :: __ 구성을 사용하여 전처리 문을 작성합니다. 특정 코드 예는 다음과 같습니다.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 1. 데이터베이스 연결을 만듭니다</span></span><span>
</span><span><span class="hljs-variable">$servername</span></span><span> = </span><span><span class="hljs-string">"localhost"</span></span><span>;
</span><span><span class="hljs-variable">$username</span></span><span> = </span><span><span class="hljs-string">"root"</span></span><span>;
</span><span><span class="hljs-variable">$password</span></span><span> = </span><span><span class="hljs-string">""</span></span><span>;
</span><span><span class="hljs-variable">$dbname</span></span><span> = </span><span><span class="hljs-string">"test"</span></span><span>;
</span><span><span class="hljs-variable">$conn</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-variable">$servername</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$dbname</span></span><span>);
</span><span><span class="hljs-comment">// 연결을 확인하십시오</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$conn</span></span><span>->connect_error) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Connection failed: "</span></span><span> . </span><span><span class="hljs-variable">$conn</span></span><span>->connect_error);
}
</span><span><span class="hljs-comment">// 2. 자리 표시 자 정의 SQL 성명</span></span><span>
</span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"INSERT INTO users (name, email, age) VALUES (?, ?, ?)"</span></span><span>;
</span><span><span class="hljs-comment">// 3. 创建预处理성명</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$conn</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-variable">$sql</span></span><span>);
</span><span><span class="hljs-comment">// 전처리가 성공했는지 확인하십시오</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">'Error preparing statement: '</span></span><span> . </span><span><span class="hljs-variable">$conn</span></span><span>->error);
}
</span><span><span class="hljs-comment">// 4. 바인딩 매개 변수</span></span><span>
</span><span><span class="hljs-variable">$name</span></span><span> = </span><span><span class="hljs-string">"John Doe"</span></span><span>;
</span><span><span class="hljs-variable">$email</span></span><span> = </span><span><span class="hljs-string">"[email protected]"</span></span><span>;
</span><span><span class="hljs-variable">$age</span></span><span> = </span><span><span class="hljs-number">25</span></span><span>;
</span><span><span class="hljs-comment">// "sss" 경계를 나타내는 변수 유형입니다,문자열에 해당합니다、끈、정수</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"ssi"</span></span><span>, </span><span><span class="hljs-variable">$name</span></span><span>, </span><span><span class="hljs-variable">$email</span></span><span>, </span><span><span class="hljs-variable">$age</span></span><span>);
</span><span><span class="hljs-comment">// 5. 执行预处理성명</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>()) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"New record created successfully"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Error: "</span></span><span> . </span><span><span class="hljs-variable">$stmt</span></span><span>->error;
}
</span><span><span class="hljs-comment">// 关闭성명和连接</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-variable">$conn</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>데이터베이스 연결 생성 : 새 MySQLI () 메소드를 사용하여 데이터베이스에 연결하십시오. 연결이 실패하면 프로그램이 중지되고 오류 메시지가 표시됩니다.
SQL 문 : 자리 표시자가 사용자 (이름, 이메일, 연령) 값 (?,?,?)에 삽입하여 SQL 문을 정의하십시오. 자리 표시자는 다음과 같습니다. 즉, 후속 단계를 통해 데이터를 동적으로 삽입합니다.
준비 명세서 : $ conn-> repay ($ sql) 메소드를 통해 전처리 명세서를 만듭니다. 생성이 실패하면 오류 메시지가 출력됩니다.
바인드 매개 변수 : $ stmt-> bind_param ( "ssi", $ name, $ email, $ age) 메소드는 변수 $ name , $ email 및 $ age 를 SQL 문의 자리 표시 자. "SSI"는 매개 변수의 데이터 유형을 나타내고 S는 문자열이며 정수 입니다.
진술서 : $ stmt-> execute ()를 통해 전처리 명세서를 실행하십시오. 실행이 성공하면 성공 메시지가 반환됩니다. 그렇지 않으면 오류가 출력됩니다.
닫기 자원 : 실행 후 리소스를 확보하려면 전처리 문 및 데이터베이스 연결을 닫아야합니다.
SQL 주입 방지 : SQL 문을 직접 접합하는 대신 자리 표시자를 사용하여 악의적 인 사용자는 특수 문자를 입력하여 SQL 주입 공격을 효과적으로 방지 할 수 있습니다.
성능 향상 : 동일한 쿼리를 여러 번 실행하는 경우 (예 : 데이터의 배치 삽입과 같은) 전처리 문을 사용하는 것은 매번 SQL 문을 다시 표시하는 것보다 훨씬 효율적입니다.
클리어 코드 : 전처리 문을 사용하면 특히 사용자 입력 및 여러 쿼리가 포함될 때 코드 구조가 더 명확 해져 SQL 스 플라이 싱 오류 가능성이 줄어 듭니다.
관련 태그:
mysqli_stmt