當前位置: 首頁> 最新文章列表> 怎樣使用mysqli_stmt::$error_list 來獲取和管理多條錯誤信息?

怎樣使用mysqli_stmt::$error_list 來獲取和管理多條錯誤信息?

gitbox 2025-08-24

怎樣使用mysqli_stmt::$error_list 來獲取和管理多條錯誤信息?

在使用MySQLi 擴展進行數據庫操作時,錯誤處理是開發過程中一個重要的環節。通常,我們會使用mysqli_error()mysqli_stmt_error()來獲取單一的錯誤信息。然而,MySQLi 提供了mysqli_stmt::$error_list屬性,它允許我們在執行準備語句時捕獲和管理多個錯誤信息。這對於復雜的SQL 操作尤為重要,能夠幫助我們更好地調試和優化代碼。

1. mysqli_stmt::$error_list的概述

mysqli_stmt::$error_list是一個類數組(array),存儲了與當前語句對象相關的所有錯誤信息。通過它,我們可以獲取詳細的錯誤信息列表,而不僅僅是單一的錯誤。它會返回一個數組,其中每個元素代表一次錯誤的具體描述,包括錯誤代碼和錯誤文本。

2. 使用mysqli_stmt::$error_list

要使用mysqli_stmt::$error_list ,我們首先需要創建一個MySQLi 連接,然後準備並執行一個SQL 語句。如果執行過程中出現了多個錯誤, $error_list將包含所有的錯誤信息。接下來,我們通過訪問error_list屬性來查看錯誤詳情。

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 創建 MySQLi 連接</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-string">"localhost"</span></span><span>, </span><span><span class="hljs-string">"username"</span></span><span>, </span><span><span class="hljs-string">"password"</span></span><span>, </span><span><span class="hljs-string">"database"</span></span><span>);

</span><span><span class="hljs-comment">// 檢查連接是否成功</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;connect_error) {
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"連接失败: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;connect_error);
}

</span><span><span class="hljs-comment">// 準備 SQL 語句</span></span><span>
</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">"INSERT INTO users (username, email) VALUES (?, ?)"</span></span><span>);

</span><span><span class="hljs-comment">// 檢查 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-literal">false</span></span><span>) {
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"SQL 錯誤: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;error);
}

</span><span><span class="hljs-comment">// 綁定參數</span></span><span>
</span><span><span class="hljs-variable">$username</span></span><span> = </span><span><span class="hljs-string">"testuser"</span></span><span>;
</span><span><span class="hljs-variable">$email</span></span><span> = </span><span><span class="hljs-string">"invalidemail.com"</span></span><span>; </span><span><span class="hljs-comment">// 假設這裡的郵箱格式是無效的</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">"ss"</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>, </span><span><span class="hljs-variable">$email</span></span><span>);

</span><span><span class="hljs-comment">// 執行 SQL 語句</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-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;errno) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"執行錯誤: "</span></span><span> . </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;error . </span><span><span class="hljs-string">"\n"</span></span><span>;
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"錯誤详情:\n"</span></span><span>;
    
    </span><span><span class="hljs-comment">// 打印所有錯誤信息</span></span><span>
    </span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;error_list);
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"插入成功!"</span></span><span>;
}

</span><span><span class="hljs-comment">// 关闭語句和連接</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

在這個例子中,我們首先嘗試向users表中插入一條數據。由於email字段的值invalidemail.com格式不正確,MySQL 會返回多個錯誤信息,這些信息會被保存在error_list中。

3. 處理error_list中的多個錯誤

mysqli_stmt::$error_list返回的數組包含了錯誤的各個部分,通常每個元素是一個包含兩個字段的關聯數組: errnoerrorerrno表示錯誤代碼, error則是錯誤信息的描述。我們可以通過循環遍歷這個數組,逐一輸出每個錯誤的詳細信息。

 <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">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">count</span></span><span>(</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;error_list) &gt; </span><span><span class="hljs-number">0</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"存在多个錯誤:\n"</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">echo</span></span><span> </span><span><span class="hljs-string">"錯誤代码: "</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-string">"\n"</span></span><span>;
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"錯誤信息: "</span></span><span> . </span><span><span class="hljs-variable">$error</span></span><span>[</span><span><span class="hljs-string">'error'</span></span><span>] . </span><span><span class="hljs-string">"\n"</span></span><span>;
    }
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

這個示例會將每個錯誤代碼和相應的錯誤信息逐一輸出。如果存在多個錯誤,我們可以更加清晰地了解發生了哪些問題,並且針對不同的錯誤進行適當的處理。

4. mysqli_stmt::$error_list的優勢

使用mysqli_stmt::$error_list的一個重要優勢是它能夠捕獲多條錯誤信息。在一些複雜的數據庫操作中,可能由於多個原因導致錯誤,而error_list能夠幫助開發者一次性獲取所有錯誤,從而提高調試效率。而且,通過這種方式,我們可以更精細地控制錯誤處理邏輯,比如根據不同的錯誤類型執行不同的操作。

5. 小結

mysqli_stmt::$error_list是MySQLi 提供的一個強大功能,它使得開發者可以在執行SQL 語句時捕獲和處理多條錯誤信息。通過使用這個屬性,我們能夠更好地理解SQL 執行過程中的問題,從而提升數據庫操作的穩定性和代碼的可靠性。