mysqli_stmt :: repary는 미소 스크린 SQL 문에 MySQLI 확장에 사용되는 메소드입니다. 전처리 명세서는 SQL 쿼리 문자열을 직접 사용하는 것과 비교하여 SQL 주입의 위험을 줄입니다. SQL을 실행할 때 사용자의 컨텐츠 입력이 쿼리 문자열에 직접 연결되지 않지만 바인딩 매개 변수로 전달되기 때문입니다.
<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">$host</span></span><span>, </span><span><span class="hljs-variable">$user</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$database</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-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-string">"SELECT * FROM users WHERE username = ? AND password = ?"</span></span><span>);
</span></span>
위의 코드에서 SQL 쿼리에는 두 개의 물음표 ( ? )가 포함되어 있으며, 이는 후속 바운드 매개 변수를 수락하는 자리 표시 자입니다.
전처리 명령문에서 bind_param () 메소드를 사용하여 사용자 입력 값을 자리 표시 자에게 바인딩하십시오. 이 시점에서는 바운드 파라미터 값이 SQL 문에 직접 삽입되지 않지만 전처리 문을 통해 전달됩니다. bind_param () 메소드에는 데이터 유형의 지정자와 바인딩 할 변수의 두 가지 매개 변수가 필요합니다.
공통 데이터 유형 지정자는 다음과 같습니다.
I : 정수 (int)
D : 이중 정밀 플로팅 포인트 (이중)
S : String (String)
B : Blob (이진 데이터)
<span><span><span class="hljs-variable">$username</span></span><span> = </span><span><span class="hljs-string">'john_doe'</span></span><span>;
</span><span><span class="hljs-variable">$password</span></span><span> = </span><span><span class="hljs-string">'password123'</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">'ss'</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>
이 예에서 'SS'는 두 매개 변수 바운드가 문자열 유형임을 의미합니다. 매개 변수 $ username 및 $ password는 SQL 쿼리의 자리 표시 자에게 안전하게 바인딩됩니다.
매개 변수 바인딩이 완료되면 Execute () 메소드가 호출되어 전처리 문을 실행합니다. 바운드 매개 변수 유형이 올바른 경우 실행 문은 정상적으로 실행됩니다.
<span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span></span>
execute () 메소드는 명령문이 성공적으로 실행되는지 여부를 나타내는 부울 값을 반환합니다. 쿼리 결과를 가져와야하는 경우 get_result () 메소드 ( 선택 쿼리의 경우)를 사용하여 실행 결과를 얻을 수 있습니다.
Select 문의 경우, 전처리 문을 실행 한 후 일반적으로 쿼리 결과를 가져와야합니다. get_result () 메소드를 사용하여 쿼리 결과를 mysqli_result 객체로 변환하여 데이터를 얻을 수 있습니다.
<span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">get_result</span></span><span>();
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$row</span></span><span> = </span><span><span class="hljs-variable">$result</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetch_assoc</span></span><span>()) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-string">'username'</span></span><span>] . </span><span><span class="hljs-string">' - '</span></span><span> . </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-string">'email'</span></span><span>] . </span><span><span class="hljs-string">'<br>'</span></span><span>;
}
</span></span>
이 예에서 쿼리 결과는 행으로 추출되어 사용자 이름과 이메일을 출력합니다.
전처리 명령문은 SQL 주입을 방지 할 수 있지만 실제 개발에서 여전히 다양한 오류가 발생할 수 있습니다. 효과적인 디버깅을 위해 오류 방법을 사용하여 관련 오류 정보를 얻을 수 있습니다.
<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-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">die</span></span><span>(</span><span><span class="hljs-string">'Execute error: '</span></span><span> . </span><span><span class="hljs-variable">$stmt</span></span><span>->error);
}
</span></span>
여기에서는 데이터베이스 연결 및 실행 설명에 대한 오류 정보를 캡처하기 위해 Conn-> Error 및 STMT-> 오류를 사용합니다. 이것은 우리가 적시에 문제를 발견하고 해결하는 데 도움이 될 수 있습니다.
전처리 명령문을 사용한 후에는 Close () 메소드를 호출하여 명령문 및 데이터베이스 연결을 닫으려면 리소스를 확보해야합니다.
<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>
이것은 좋은 프로그래밍 습관 일뿐 만 아니라 자원 누출을 효과적으로 피합니다.
관련 태그:
mysqli_stmt