데이터베이스 작업에 PHP를 사용할 때 MySQLI_STMT :: BIND_PARAM () 함수는 매개 변수를 SQL 쿼리 문에 바인딩하고 SQL 주입 공격을 피할 수있는 매우 중요한 도구입니다. 이 기능은 특히 전처리 문에 적합하며 매개 변수 유형은 쿼리에 전달 된 값을 처리하는 방법을 지정합니다. 이 기사는 mysqli_stmt :: bind_param () 함수에 대한 일반적인 매개 변수 유형에 대한 자세한 설명을 제공하고 실제 개발에 사용하는 방법을 이해하는 데 도움이됩니다.
먼저 bind_param () 함수의 기본 구문을 검토하겠습니다.
<span><span><span class="hljs-keyword">bool</span></span><span> mysqli_stmt::</span><span><span class="hljs-variable constant_">bind_param</span></span><span> ( </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$types</span></span><span> , </span><span><span class="hljs-keyword">mixed</span></span><span> &</span><span><span class="hljs-variable">$var</span></span><span> , </span><span><span class="hljs-keyword">mixed</span></span><span> &$... )
</span></span>$ 유형 : 바운드 변수의 유형을 나타내는 하나 이상의 문자를 포함하는 문자열. 각 문자는 매개 변수의 유형을 나타냅니다.
$ var, $ ... : 바인딩하려는 변수이며 $ 유형 으로 지정된 순서로 바인딩됩니다.
여기서 $ 유형 문자열의 각 문자는 데이터 유형을 나타냅니다. 일반적인 유형의 문자는 다음과 같습니다.
I : 정수를 나타냅니다.
D : 이중 정밀 플로팅 번호 (이중)를 나타냅니다.
S : 문자열을 나타냅니다.
B : Blob (Binary Large Object) 유형을 나타내는 데이터.
정수 매개 변수를 바인딩하는 데 사용 됩니다. 가장 일반적인 유형 중 하나이며 모든 정수 데이터에 적합합니다.
예:
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</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 id = ?"</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">"i"</span></span><span>, </span><span><span class="hljs-variable">$id</span></span><span>); </span><span><span class="hljs-comment">// $id정수입니다</span></span><span>
</span><span><span class="hljs-variable">$id</span></span><span> = </span><span><span class="hljs-number">1</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>이 예에서 $ id는 쿼리 문에서 자리 표시 자에게 정수 유형으로 바인딩됩니까 ? .
D는 이중 프레이션 플로팅 숫자 유형의 매개 변수를 바인딩하는 데 사용되며, 일반적으로 소수점 또는 부동 소수점 번호와 관련된 쿼리에 사용됩니다.
예:
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO products (price) VALUES (?)"</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">"d"</span></span><span>, </span><span><span class="hljs-variable">$price</span></span><span>); </span><span><span class="hljs-comment">// $price이중 정밀 떠 다니는 숫자입니다</span></span><span>
</span><span><span class="hljs-variable">$price</span></span><span> = </span><span><span class="hljs-number">199.99</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>이 예에서 $ price는 SQL 명령문의 자리 표시 자에게 이중 정제 플로팅 번호 유형으로 바인딩됩니다.
S는 결합 문자열 매개 변수를위한 가장 일반적인 유형 중 하나입니다. 텍스트 데이터이든 숫자 형태의 문자열이든 S가 필요합니다.
예:
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</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 = ?"</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">"s"</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>); </span><span><span class="hljs-comment">// $username그것은 문자열입니다</span></span><span>
</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">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span></span>이 예에서 $ username은 문자열 유형에 바인딩되며 쿼리는 사용자 이름을 통해 해당 사용자를 검색합니다.
B는 이미지 또는 파일과 같은 Blob 유형 데이터와 같은 이진 데이터를 바인딩하는 데 사용됩니다. 이 유형은 종종 큰 데이터 볼륨 또는 이진 파일을 처리하는 데 사용됩니다.
예:
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO images (image_data) VALUES (?)"</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">"b"</span></span><span>, </span><span><span class="hljs-variable">$imageData</span></span><span>); </span><span><span class="hljs-comment">// $imageData이진 데이터입니다</span></span><span>
</span><span><span class="hljs-variable">$imageData</span></span><span> = </span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>(</span><span><span class="hljs-string">"path/to/image.jpg"</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>이 예에서 $ imageata는 이진 데이터로 쿼리 문에 바인딩되며 일반적으로 파일 데이터를 삽입하는 데 사용됩니다.
SQL 문에 여러 자리 표시자가있는 경우 Bind_param ()은 여러 변수를 바인딩 할 수 있으며 각 변수의 유형은 $ 유형 의 문자로 표시되며 순서는 자리 표시 자와 일치해야합니다.
예:
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"UPDATE users SET name = ?, age = ? WHERE id = ?"</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">$age</span></span><span>, </span><span><span class="hljs-variable">$id</span></span><span>);
</span><span><span class="hljs-variable">$name</span></span><span> = </span><span><span class="hljs-string">"Alice"</span></span><span>;
</span><span><span class="hljs-variable">$age</span></span><span> = </span><span><span class="hljs-number">30</span></span><span>;
</span><span><span class="hljs-variable">$id</span></span><span> = </span><span><span class="hljs-number">1</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>이 예에서 $ 이름은 문자열 에 바인딩되고 $ 연령은 정수 ( i )에 바인딩되며 $ id는 정수 ( i )에 바인딩됩니다. $ 유형 매개 변수는 "SSI" 이며 세 자리 표시 자의 유형 순서와 일치합니다.
Strict Match 유형 : bind_param ()을 호출 할 때 바운드 변수 유형이 $ 유형 문자열에 지정된 유형과 엄격하게 일치하는지 확인해야합니다. 그렇지 않으면 오류 또는 예상치 못한 결과가 발생합니다.
값에 대한 참조 전달 : bind_param ()은 값이 아닌 매개 변수에 대한 참조를 전달해야합니다. 참조 대신 값을 직접 전달하면 함수가 이러한 매개 변수를 올바르게 처리하지 않습니다.
매개 변수 유형과 데이터베이스 유형 간의 상관 관계 : 실제로 사용하면 데이터베이스 테이블의 필드의 데이터 유형을 기반으로 바인딩 매개 변수 유형을 결정해야합니다. 데이터베이스 필드가 플로팅 번호 유형 인 경우 d를 사용하십시오. 문자열 유형 인 경우 s를 사용하십시오.
mysqli_stmt :: bind_param ()은 SQL 주입 및 프로세스 SQL 쿼리 매개 변수를 방지하는 매우 중요한 기능입니다. 매개 변수 유형을 올바르게 사용하면 데이터베이스 작업이 더 안전하고 효율적인지 확인할 수 있습니다. 실제 개발에서 이러한 유형의 문자를 이해하고 올바르게 사용하면 코드의 유지 관리 및 보안이 크게 향상됩니다.
일반적인 유형으로는 정수 ( I ), 이중 프레시션 플로팅 숫자 ( D ), 문자열 ( S ) 및 이진 데이터 ( B )가 포함됩니다. 복잡한 데이터베이스 작업을 처리 할 때 각 매개 변수의 유형을 올바르게 바인딩하면 쿼리 문이 예상대로 실행되도록하고 잠재적 인 SQL 주입 공격으로부터 데이터를 보호합니다.
관련 태그:
mysqli_stmt