현재 위치: > 최신 기사 목록> mysqli_stmt :: $ field_count 및 mysqli_stmt :: bind_result를 결합하여 쿼리 효율성 향상을위한 팁

mysqli_stmt :: $ field_count 및 mysqli_stmt :: bind_result를 결합하여 쿼리 효율성 향상을위한 팁

gitbox 2025-08-22

<span><span><span class="hljs-meta">&lt;?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_COUNTMYSQLI_STMT :: BIND_RESULT를 결합하여 코드의 유지 관리 및 보안을 보장하는 방법을 소개합니다.

1. mysqli_stmt :: $ field_count를 이해하십시오

$ field_count 속성은 현재 전처리 명세서 결과 세트의 필드 수를 반환하는 데 사용됩니다. 이 속성은 SQL 쿼리가 동적으로 생성되거나 무기한 필드가 필요한 시나리오에 매우 유용합니다. 필드 이름을 미리 알지 못하고 결과 변수를 동적으로 바인딩하는 데 사용하십시오.

예:

 <span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</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>-&gt;</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>-&gt;</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>-&gt;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를 사용하면 필드 이름을 모르고 결과 세트를 동적으로 처리하여 코드의 보편성을 향상시킬 수 있습니다.

2. 동적 바인딩 결과 세트

일반적으로 Bind_Result를 사용하여 각 필드를 수동으로 바인딩합니다.

 <span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</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>-&gt;</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>-&gt;</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>-&gt;name;
    </span><span><span class="hljs-variable">$bindVars</span></span><span>[] = &amp;${</span><span><span class="hljs-variable">$field</span></span><span>-&gt;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>-&gt;</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>

이러한 방식으로 쿼리 반환 필드 수에 관계없이 결과는 배열에 효율적으로 저장되어 바인딩 코드의 수동 수정을 피하고 유지 보수 및 성능을 향상시킬 수 있습니다.

3. 우위 분석

  1. 중복 코드 감소 : 각 쿼리에 대해 bind_result를 수동으로 작성할 필요가 없습니다. 특히 필드가 자주 변경되는 시나리오에 적합합니다.

  2. 효율성 향상 : 연관 배열 및 fetch_assoc () 의 반복적 인 사용을 피하고 바인딩 변수를 통해 데이터를 직접 얻습니다.

  3. Universal : SQL 쿼리를 동적으로 생성하거나 데이터베이스 테이블에서 필드 이름을 자동으로 얻는 데 사용될 수 있습니다.

4. 주목할만한 것들

  • 동적 바인딩을 사용하는 경우 가변 참조 ( & )에주의를 기울여야합니다. 그렇지 않으면 값을 올바르게 얻을 수 없습니다.

  • 큰 데이터 쿼리의 경우 Bind_Result는 전체 배열을 생성하는 대신 변수에 데이터를 직접 바인딩하기 때문에 Fetch_Assoc 보다 더 많은 메모리를 저장합니다.

  • 소수의 필드 만 쿼리하는 경우 수동 Bind_Result는 명백한 성능 차이가 없지만 동적 바인딩은 필드가 불확실하거나 쿼리가 자주 변경되는 시나리오에서 명백한 이점을 갖습니다.

5. 요약

mysqli_stmt :: $ field_countmysqli_stmt :: bind_result를 결합하면 효율적이고 일반 및 유지 관리 가능한 전처리 명령문 쿼리 솔루션을 실현할 수 있습니다. 코드의 양을 줄일뿐만 아니라 대규모 데이터 볼륨 및 동적 쿼리 시나리오의 성능을 향상시킵니다. PHP 개발을 마스터 할 가치가있는 기술입니다.