데이터베이스 작업에 PHP의 PDO (PHP Data Objects) Extension을 사용하는 경우 PDostatement :: ColumnCount () 함수는 현재 쿼리 결과의 열 수를 반환하는 데 매우 유용한 도구입니다. 그러나 쿼리에 하위 퀘스트가 포함되면이 기능의 동작이 개발자를 혼동 할 수 있습니다. 이 기사에서는이 행동을 파고 해석하고 사용하는 방법을 배울 것입니다.
pdostatement :: columnCount () 함수는 현재 쿼리 결과 세트에서 열 수를 반환합니다. 주로 선택한 쿼리 결과에 사용되며 특히 열 정보를 얻어야 할 때 매우 실용적입니다. 예를 들어 간단한 선택 쿼리를 실행할 때이 기능을 사용하여 데이터를 반환하는 열의 수를 알 수 있습니다.
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">'SELECT id, name FROM users'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">columnCount</span></span><span>(); </span><span><span class="hljs-comment">// 산출 2</span></span><span>
</span></span>
이 예에서 쿼리는 두 개의 열 ( id 및 name )을 반환하므로 columnCount ()는 2를 반환합니다.
하위 쿼리는 일반적으로 SELECT 문의 WHERE 또는 FROM 절에 나타나는 중첩 쿼리입니다. 하위 쿼리가 쿼리에 관련되면 pdostatement :: columncount () 의 동작은 기대치와 일치하지 않을 수 있습니다.
예를 들어, 하위 퀘스트가 포함 된 다음 쿼리를 고려하십시오.
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">'SELECT id, name, (SELECT MAX(age) FROM users) AS max_age FROM users'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">columnCount</span></span><span>(); </span><span><span class="hljs-comment">// 산출的结果</span></span><span>
</span></span>
이 예에서 외부 쿼리에는 ID , 이름 및 하위 퀘스트 결과 ( max_age )의 세 가지 열이 포함됩니다. 그러나 columnCount ()에 의해 리턴 된 결과는 하위 쿼리의 반환 값이 별도의 열로 값에 불과하기 때문에 서브 쿼리의 열 수를 포함하지 않을 수 있습니다.
columnCount () 하위 쿼리의 경우, 반환 될 수있는 열의 수는 외부 쿼리의 열 수이며 하위 쿼리의 열을 포함하지 않습니다. 그 이유는 PDO가 하위 쿼리를 포함하는 SQL 문을 처리 할 때 외부 쿼리의 열을 계산하는 대신 하위 쿼리 결과를 별도의 필드로 처리하기 때문입니다.
쿼리에 하위 쿼리가 포함 된 경우 columnCount ()에 의해 리턴 된 열 수는 일반적으로 외부 쿼리의 열 수이며 하위 쿼리의 열은 포함되지 않습니다. 하위 쿼리의 결과는 columnCount () 의 결과에 영향을 미치지 않고 별도의 열로 반환됩니다. 이는 특히 쿼리를 동적으로 구축하거나 복잡한 결과를 구문 분석 할 때 실제 개발에 특별한주의가 필요합니다.
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">'SELECT id, name, (SELECT MAX(age) FROM users) AS max_age FROM users'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">columnCount</span></span><span>(); </span><span><span class="hljs-comment">// 산출 3</span></span><span>
</span></span>
max_age 는 하위 쿼리의 결과이지만 외부 쿼리의 열로 간주되기 때문에 (그리고 일정한 값이며, 모든 행의 max_age 는 동일), columnCount ()는 외부 쿼리의 열, 즉 세 열 ID , name 및 max_age 의 열을 반환합니다.
그러나 하위 쿼리가 열을 반환하지 않으면 (조건부 판단의 하위 쿼리와 같은) ColumnCount ()는 다음 경우 다른 열을 반환 할 수 있습니다.
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">'SELECT id, name, EXISTS (SELECT 1 FROM users WHERE age > 30) AS is_old FROM users'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">columnCount</span></span><span>(); </span><span><span class="hljs-comment">// 산출 3</span></span><span>
</span></span>
존재 하위 쿼리는 데이터를 반환하지 않지만 여전히 부울으로 반환되므로 외부 쿼리의 열 수는 여전히 3입니다.
하위 쿼리가 쿼리에 포함되면 pdostatement :: columnCount ()가 반환 한 열 수는 일반적으로 외부 쿼리의 열 수이며 하위 쿼리의 열 수로 계산되지 않습니다. PDO는 서브 쿼리의 결과를 독립적으로 새 열을 나열하지 않고 외부 쿼리 필드로 취급하기 때문입니다. 따라서 개발자는 ColumnCount ()를 사용할 때이 동작을 이해하고 쿼리 결과 오해를 피하기 위해 하위 쿼리가있을 때 기대치를 적절하게 조정해야합니다.