<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 내용 의이 부분은 기사의 주제와 관련이 없습니다.</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"My에 오신 것을 환영합니다PHP공부 노트!\n"</span></span><span>;
</span><span><span class="hljs-variable">$today</span></span><span> = </span><span><span class="hljs-title function_ invoke__">date</span></span><span>(</span><span><span class="hljs-string">"Y-m-d"</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"오늘의 날짜입니다: <span class="hljs-subst">$today</span></span></span><span>\n";
</span></span>
데이터베이스 작업에 PHP를 사용할 때, 특히 준비된 명령문에 MySQLI 확장을 사용할 때 성능 최적화는 종종 간과됩니다. 이 기사는 MySQLI_STMT :: $ FIELD_COUNT 및 MYSQLI_STMT :: BIND_RESULT를 결합하여 코드의 유지 관리 및 보안을 보장하는 방법을 소개합니다.
$ field_count 속성은 현재 전처리 명세서 결과 세트의 필드 수를 반환하는 데 사용됩니다. 이 속성은 SQL 쿼리가 동적으로 생성되거나 무기한 필드가 필요한 시나리오에 매우 유용합니다. 필드 이름을 미리 알지 못하고 결과 변수를 동적으로 바인딩하는 데 사용하십시오.
예:
<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 id, name, email FROM users WHERE status = ?"</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">$status</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-comment">// 필드 수를 얻으십시오</span></span><span>
</span><span><span class="hljs-variable">$fieldCount</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>->field_count;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"이 쿼리의 총계가 있습니다 <span class="hljs-subst">$fieldCount</span></span></span><span> 전지。";
</span></span>
$ field_count를 사용하면 필드 이름을 모르고 결과 세트를 동적으로 처리하여 코드의 보편성을 향상시킬 수 있습니다.
일반적으로 Bind_Result를 사용하여 각 필드를 수동으로 바인딩합니다.
<span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_result</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-variable">$email</span></span><span>);
</span></span>
필드 수가 크거나 필드가 변경 될 수있는 경우이 방법은 비효율적이며 오류가 발생합니다. $ field_count 와 결합하여 동적 바인딩을 구현할 수 있습니다.
<span><span><span class="hljs-comment">// 결과 메타 데이터를 얻으십시오</span></span><span>
</span><span><span class="hljs-variable">$meta</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">result_metadata</span></span><span>();
</span><span><span class="hljs-variable">$fields</span></span><span> = [];
</span><span><span class="hljs-variable">$bindVars</span></span><span> = [];
</span><span><span class="hljs-comment">// 필드 수에 따라 변수를 동적으로 생성합니다</span></span><span>
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$field</span></span><span> = </span><span><span class="hljs-variable">$meta</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetch_field</span></span><span>()) {
</span><span><span class="hljs-variable">$fields</span></span><span>[] = </span><span><span class="hljs-variable">$field</span></span><span>->name;
</span><span><span class="hljs-variable">$bindVars</span></span><span>[] = &${</span><span><span class="hljs-variable">$field</span></span><span>->name}; </span><span><span class="hljs-comment">// 인용에주의하십시오</span></span><span>
}
</span><span><span class="hljs-comment">// 동적 바인딩 결과</span></span><span>
</span><span><span class="hljs-title function_ invoke__">call_user_func_array</span></span><span>([</span><span><span class="hljs-variable">$stmt</span></span><span>, </span><span><span class="hljs-string">'bind_result'</span></span><span>], </span><span><span class="hljs-variable">$bindVars</span></span><span>);
</span><span><span class="hljs-comment">// 데이터를 얻으십시오</span></span><span>
</span><span><span class="hljs-variable">$results</span></span><span> = [];
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetch</span></span><span>()) {
</span><span><span class="hljs-variable">$row</span></span><span> = [];
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$fields</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$field</span></span><span>) {
</span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-variable">$field</span></span><span>] = ${</span><span><span class="hljs-variable">$field</span></span><span>};
}
</span><span><span class="hljs-variable">$results</span></span><span>[] = </span><span><span class="hljs-variable">$row</span></span><span>;
}
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$results</span></span><span>);
</span></span>
이러한 방식으로 쿼리 반환 필드 수에 관계없이 결과는 배열에 효율적으로 저장되어 바인딩 코드의 수동 수정을 피하고 유지 보수 및 성능을 향상시킬 수 있습니다.
중복 코드 감소 : 각 쿼리에 대해 bind_result를 수동으로 작성할 필요가 없습니다. 특히 필드가 자주 변경되는 시나리오에 적합합니다.
효율성 향상 : 연관 배열 및 fetch_assoc () 의 반복적 인 사용을 피하고 바인딩 변수를 통해 데이터를 직접 얻습니다.
Universal : SQL 쿼리를 동적으로 생성하거나 데이터베이스 테이블에서 필드 이름을 자동으로 얻는 데 사용될 수 있습니다.
동적 바인딩을 사용하는 경우 가변 참조 ( & )에주의를 기울여야합니다. 그렇지 않으면 값을 올바르게 얻을 수 없습니다.
큰 데이터 쿼리의 경우 Bind_Result는 전체 배열을 생성하는 대신 변수에 데이터를 직접 바인딩하기 때문에 Fetch_Assoc 보다 더 많은 메모리를 저장합니다.
소수의 필드 만 쿼리하는 경우 수동 Bind_Result는 명백한 성능 차이가 없지만 동적 바인딩은 필드가 불확실하거나 쿼리가 자주 변경되는 시나리오에서 명백한 이점을 갖습니다.
mysqli_stmt :: $ field_count 와 mysqli_stmt :: bind_result를 결합하면 효율적이고 일반 및 유지 관리 가능한 전처리 명령문 쿼리 솔루션을 실현할 수 있습니다. 코드의 양을 줄일뿐만 아니라 대규모 데이터 볼륨 및 동적 쿼리 시나리오의 성능을 향상시킵니다. PHP 개발을 마스터 할 가치가있는 기술입니다.