현재 위치: > 최신 기사 목록> mysqli_stmt :: $ error_list에서 여러 오류를 효과적으로 처리해야합니까?

mysqli_stmt :: $ error_list에서 여러 오류를 효과적으로 처리해야합니까?

gitbox 2025-08-22

MySQLI_STMT :: $ ERRER_LIST는 PHP의 MySQLI Extension을 사용하여 준비된 문을 실행할 때 매우 중요한 디버깅 도구입니다. $ stmt-> 오류 와 같은 마지막 오류를 반환하는 대신 모든 오류 메시지가 포함 된 배열을 제공합니다. 이 속성은 한 번의 실행 또는 준비 중에 여러 오류가 동시에 트리거 될 때 특히 중요합니다.

그러나 개발자가 $ stmt-> error_list 에 의해 여러 가지 오류에 직면 할 때 종종 혼란스러워합니다. 이러한 오류 정보는 어떻게 효과적으로 추출, 처리 및 표시되어 오류 처리 로직을 혼동하지 않고 문제를 정확하게 찾을 수 있습니까?

이 기사는 다음 측면에서 여러 오류 처리 전략에 대해 설명합니다.

1. Error_List 의 구조를 이해하십시오

$ stmt-> error_list 배열을 반환하고 각 요소는 다음 키를 포함하는 연관 배열입니다.

  • errno : 오류 코드 (정수)

  • sqlstate : sqlstate 오류 식별자 (String)

  • 오류 : 오류 메시지 (문자열)

일반적인 구조는 다음과 같습니다.

 <span><span>[
    [
        </span><span><span class="hljs-string">'errno'</span></span><span> =&gt; </span><span><span class="hljs-number">1064</span></span><span>,
        </span><span><span class="hljs-string">'sqlstate'</span></span><span> =&gt; </span><span><span class="hljs-string">'42000'</span></span><span>,
        </span><span><span class="hljs-string">'error'</span></span><span> =&gt; </span><span><span class="hljs-string">'You have an error in your SQL syntax; check the manual...'</span></span><span>
    ],
    [
        </span><span><span class="hljs-string">'errno'</span></span><span> =&gt; </span><span><span class="hljs-number">1048</span></span><span>,
        </span><span><span class="hljs-string">'sqlstate'</span></span><span> =&gt; </span><span><span class="hljs-string">'23000'</span></span><span>,
        </span><span><span class="hljs-string">'error'</span></span><span> =&gt; </span><span><span class="hljs-string">'Column \'name\' cannot be null'</span></span><span>
    ]
]
</span></span>

즉, 오류가 하나만 있다고 가정하지 않고 각 오류를 별도로 판단하고 처리해야합니다.

2. 통합 캡슐화 오류 출력 로직

각 SQL 실행에서 반복 처리 로직을 피하려면 오류 처리를 함수로 캡슐화하는 것이 좋습니다.

 <span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">handle_stmt_errors</span></span><span>(</span><span><span class="hljs-params">mysqli_stmt <span class="hljs-variable">$stmt</span></span></span><span>) {
    </span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;error_list </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$error</span></span><span>) {
        </span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-string">"[SQL Error] Code: <span class="hljs-subst">{$error['errno']}</span></span></span><span> | SQLSTATE: </span><span><span class="hljs-subst">{$error['sqlstate']}</span></span><span> | Message: </span><span><span class="hljs-subst">{$error['error']}</span></span><span>");
    }
}
</span></span>

이렇게하면 execute () 또는 repay ()가 실패 할 때마다 간단히 호출 할 수 있습니다.

 <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-title function_ invoke__">handle_stmt_errors</span></span><span>(</span><span><span class="hljs-variable">$stmt</span></span><span>);
}
</span></span>

3. 심각성에 의해 잘못 분류됩니다

모든 실수가 똑같이 중요한 것은 아닙니다. Errno 에 따라 분류하는 것이 좋습니다.

  • 논리적 오류 (예 : 빈 데이터, 고유 한 주요 충돌) : 사용자에게 피드백이거나 비즈니스 예외로 기록 될 수 있습니다.

  • 구문 오류 또는 데이터베이스 실패 (예 : SQL 철자 오류, 연결 누락) : 요청은 즉시 호출되거나 중단되어야합니다.

간단한 매핑 테이블을 사용하여 심각도를 결정할 수 있습니다.

 <span><span><span class="hljs-variable">$criticalErrors</span></span><span> = [</span><span><span class="hljs-number">1064</span></span><span>, </span><span><span class="hljs-number">2006</span></span><span>, </span><span><span class="hljs-number">2013</span></span><span>];

</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;error_list </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$error</span></span><span>) {
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">in_array</span></span><span>(</span><span><span class="hljs-variable">$error</span></span><span>[</span><span><span class="hljs-string">'errno'</span></span><span>], </span><span><span class="hljs-variable">$criticalErrors</span></span><span>)) {
        </span><span><span class="hljs-title function_ invoke__">trigger_error</span></span><span>(</span><span><span class="hljs-string">"심각한 데이터베이스 오류: <span class="hljs-subst">{$error['error']}</span></span></span><span>", E_USER_ERROR);
    } </span><span><span class="hljs-keyword">else</span></span><span> {
        </span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-string">"정상 오류: <span class="hljs-subst">{$error['error']}</span></span></span><span>");
    }
}
</span></span>

4. 누락 된 준비 () 오류를 피하십시오

개발자가 무시하기 쉬운 한 가지는 repay () 실패가 여러 오류를 생성 할 수 있다는 것입니다. 거짓의 반환 값으로 판단 할 수 없습니다. 또한 error_list를 호출해야합니다.

 <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-variable">$sql</span></span><span>);
</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-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;error_list </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$error</span></span><span>) {
        </span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-string">"Prepare Error: <span class="hljs-subst">{$error['error']}</span></span></span><span>");
    }
}
</span></span>

5. 개발 환경에서 자세한 로깅을 활성화하십시오

개발 단계에서 브라우저 또는 개발 콘솔에 오류 로그를 출력하는 것이 좋습니다. 제작 환경에서는 로그 만 표시하지 않고 기록해야합니다.

 <span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">log_stmt_errors</span></span><span>(</span><span><span class="hljs-params">mysqli_stmt <span class="hljs-variable">$stmt</span></span></span><span>, </span><span><span class="hljs-variable">$display</span></span><span> = </span><span><span class="hljs-literal">false</span></span><span>) {
    </span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;error_list </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$error</span></span><span>) {
        </span><span><span class="hljs-variable">$message</span></span><span> = </span><span><span class="hljs-string">"[Error <span class="hljs-subst">{$error['errno']}</span></span></span><span>] </span><span><span class="hljs-subst">{$error['error']}</span></span><span> (SQLSTATE: </span><span><span class="hljs-subst">{$error['sqlstate']}</span></span><span>)";
        </span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-variable">$message</span></span><span>);
        </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$display</span></span><span>) {
            </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"&lt;div class=\"sql-error\"&gt;<span class="hljs-subst">$message</span></span></span><span>&lt;/div&gt;";
        }
    }
}
</span></span>

6. 결론

mysqli_stmt :: $ error_list는 키가 낮지 만 강력한 오류 문제 해결 도구입니다. 복잡한 SQL 작업을 수행하거나 다수의 매개 변수를 바인딩하거나 여러 데이터 테이블을 연결할 때는 종종 둘 이상의 오류가 있습니다. 이러한 오류를 올바르게 파싱하고 분류하면 버그를 빠르게 수정하는 데 도움이 될뿐만 아니라 시스템의 견고성을 향상시킵니다.

$ stmt-> error -mas