현재 위치: > 최신 기사 목록> 파라미터를 바인딩 할 때주의를 기울여야하는 올바른 작동 방법은 무엇입니까?

파라미터를 바인딩 할 때주의를 기울여야하는 올바른 작동 방법은 무엇입니까?

gitbox 2025-08-22

1. MySQLI_STMT :: SQL 명령문을 안전하게 전처리하기 위해 준비하십시오

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>-&gt;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>-&gt;connect_error);
}

</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$conn</span></span><span>-&gt;</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 쿼리에는 두 개의 물음표 ( ? )가 포함되어 있으며, 이는 후속 바운드 매개 변수를 수락하는 자리 표시 자입니다.

2. 매개 변수 바인딩을위한 올바른 작동 방법

전처리 명령문에서 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>-&gt;</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 쿼리의 자리 표시 자에게 안전하게 바인딩됩니다.

3. 전처리 진술을 실행하십시오

매개 변수 바인딩이 완료되면 Execute () 메소드가 호출되어 전처리 문을 실행합니다. 바운드 매개 변수 유형이 올바른 경우 실행 문은 정상적으로 실행됩니다.

 <span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span></span>

execute () 메소드는 명령문이 성공적으로 실행되는지 여부를 나타내는 부울 값을 반환합니다. 쿼리 결과를 가져와야하는 경우 get_result () 메소드 ( 선택 쿼리의 경우)를 사용하여 실행 결과를 얻을 수 있습니다.

4. 쿼리 결과를 얻으십시오

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>-&gt;</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>-&gt;</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">'&lt;br&gt;'</span></span><span>;
}
</span></span>

이 예에서 쿼리 결과는 행으로 추출되어 사용자 이름과 이메일을 출력합니다.

5. 오류 처리 및 디버깅

전처리 명령문은 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>-&gt;error);
}

</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</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>-&gt;error);
}
</span></span>

여기에서는 데이터베이스 연결 및 실행 설명에 대한 오류 정보를 캡처하기 위해 Conn-> ErrorSTMT-> 오류를 사용합니다. 이것은 우리가 적시에 문제를 발견하고 해결하는 데 도움이 될 수 있습니다.

6. 진술과 연결을 닫습니다

전처리 명령문을 사용한 후에는 Close () 메소드를 호출하여 명령문 및 데이터베이스 연결을 닫으려면 리소스를 확보해야합니다.

 <span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-variable">$conn</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span></span>

이것은 좋은 프로그래밍 습관 일뿐 만 아니라 자원 누출을 효과적으로 피합니다.