當前位置: 首頁> 最新文章列表> 如何結合mysqli::$error 實現多語言環境下的錯誤提示功能?

如何結合mysqli::$error 實現多語言環境下的錯誤提示功能?

M66 2025-07-18

什麼是mysqli::$error?

在PHP 中, mysqli擴展用於與MySQL 數據庫進行交互。當執行數據庫查詢時, mysqli::$error屬性提供了當前連接的MySQL 數據庫返回的錯誤信息。假如查詢失敗, mysqli::$error將存儲MySQL 返回的錯誤信息,開發者可以利用這個屬性來進行錯誤處理和調試。

在多語言應用中,直接使用MySQL 錯誤信息並不適合向用戶顯示,因為它通常是英文或技術性的描述,且不適合普通用戶閱讀。因此,我們需要結合mysqli::$error來構建支持多語言的錯誤提示。

如何實現多語言錯誤提示

實現多語言錯誤提示功能的核心在於通過用戶的語言偏好來動態選擇錯誤信息。以下是一些關鍵步驟:

1. 獲取用戶語言

首先,你需要獲取用戶的語言設置。通常,用戶語言設置存儲在會話中或通過瀏覽器的Accept-Language請求頭獲得。為了簡化,我們假設語言已經存儲在$_SESSION['lang']中。

 <span><span><span class="hljs-comment">// 獲取當前語言,默認為英文</span></span><span>
</span><span><span class="hljs-variable">$lang</span></span><span> = </span><span><span class="hljs-keyword">isset</span></span><span>(</span><span><span class="hljs-variable">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'lang'</span></span><span>]) ? </span><span><span class="hljs-variable">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'lang'</span></span><span>] : </span><span><span class="hljs-string">'en'</span></span><span>;
</span></span>

2. 定義錯誤提示文本

我們可以將錯誤提示文本定義在一個多維數組中,每種語言對應一個子數組。這樣,所有的錯誤信息都能在數組中找到對應的翻譯。

 <span><span><span class="hljs-variable">$errorMessages</span></span><span> = [
    </span><span><span class="hljs-string">'en'</span></span><span> =&gt; [
        </span><span><span class="hljs-string">'invalid_query'</span></span><span> =&gt; </span><span><span class="hljs-string">'There was an error with the SQL query.'</span></span><span>,
        </span><span><span class="hljs-string">'connection_failed'</span></span><span> =&gt; </span><span><span class="hljs-string">'Failed to connect to the database.'</span></span><span>,
        </span><span><span class="hljs-string">'unknown_error'</span></span><span> =&gt; </span><span><span class="hljs-string">'An unknown error occurred.'</span></span><span>,
    ],
    </span><span><span class="hljs-string">'zh'</span></span><span> =&gt; [
        </span><span><span class="hljs-string">'invalid_query'</span></span><span> =&gt; </span><span><span class="hljs-string">'SQL 查詢出現錯誤。'</span></span><span>,
        </span><span><span class="hljs-string">'connection_failed'</span></span><span> =&gt; </span><span><span class="hljs-string">'數據庫連接失敗。'</span></span><span>,
        </span><span><span class="hljs-string">'unknown_error'</span></span><span> =&gt; </span><span><span class="hljs-string">'發生了未知錯誤。'</span></span><span>,
    ],
    </span><span><span class="hljs-comment">// 可以繼續添加其他語言</span></span><span>
];
</span></span>

3. 自定義錯誤處理函數

接下來,我們可以創建一個自定義的錯誤處理函數,根據當前語言和MySQL 錯誤信息顯示適當的提示。

 <span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">getErrorMessage</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$error</span></span></span><span>, </span><span><span class="hljs-variable">$lang</span></span><span> = </span><span><span class="hljs-string">'en'</span></span><span>) {
    </span><span><span class="hljs-keyword">global</span></span><span> </span><span><span class="hljs-variable">$errorMessages</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-keyword">isset</span></span><span>(</span><span><span class="hljs-variable">$errorMessages</span></span><span>[</span><span><span class="hljs-variable">$lang</span></span><span>]) &amp;&amp; </span><span><span class="hljs-keyword">isset</span></span><span>(</span><span><span class="hljs-variable">$errorMessages</span></span><span>[</span><span><span class="hljs-variable">$lang</span></span><span>][</span><span><span class="hljs-variable">$error</span></span><span>])) {
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$errorMessages</span></span><span>[</span><span><span class="hljs-variable">$lang</span></span><span>][</span><span><span class="hljs-variable">$error</span></span><span>];
    }

    </span><span><span class="hljs-comment">// 如果沒有找到對應的錯誤信息,則返回默認的英文錯誤信息</span></span><span>
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$errorMessages</span></span><span>[</span><span><span class="hljs-string">'en'</span></span><span>][</span><span><span class="hljs-variable">$error</span></span><span>] ?? </span><span><span class="hljs-string">'An error occurred.'</span></span><span>;
}
</span></span>

4. 使用mysqli::$error 獲取錯誤信息

接下來,在數據庫操作中,可以通過mysqli::$error獲取數據庫的錯誤信息,然後結合自定義的錯誤處理函數,返回一個多語言的錯誤提示。

 <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">'user'</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">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">getErrorMessage</span></span><span>(</span><span><span class="hljs-string">'connection_failed'</span></span><span>, </span><span><span class="hljs-variable">$lang</span></span><span>);
    </span><span><span class="hljs-keyword">exit</span></span><span>();
}

</span><span><span class="hljs-comment">// 執行一個 SQL 查詢</span></span><span>
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">'SELECT * FROM non_existent_table'</span></span><span>);

</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$result</span></span><span>) {
    </span><span><span class="hljs-comment">// 獲取 mysqli 錯誤訊息</span></span><span>
    </span><span><span class="hljs-variable">$mysqlError</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-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">strpos</span></span><span>(</span><span><span class="hljs-variable">$mysqlError</span></span><span>, </span><span><span class="hljs-string">'unknown column'</span></span><span>) !== </span><span><span class="hljs-literal">false</span></span><span>) {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">getErrorMessage</span></span><span>(</span><span><span class="hljs-string">'invalid_query'</span></span><span>, </span><span><span class="hljs-variable">$lang</span></span><span>);
    } </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-title function_ invoke__">getErrorMessage</span></span><span>(</span><span><span class="hljs-string">'unknown_error'</span></span><span>, </span><span><span class="hljs-variable">$lang</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>

5. 進一步優化

為了進一步優化代碼,我們可以將錯誤信息存儲在語言文件中,避免將所有信息硬編碼到PHP 文件中。每種語言對應一個PHP 文件,內容如下:

en.php :

 <span><span><span class="hljs-keyword">return</span></span><span> [
    </span><span><span class="hljs-string">'invalid_query'</span></span><span> =&gt; </span><span><span class="hljs-string">'There was an error with the SQL query.'</span></span><span>,
    </span><span><span class="hljs-string">'connection_failed'</span></span><span> =&gt; </span><span><span class="hljs-string">'Failed to connect to the database.'</span></span><span>,
    </span><span><span class="hljs-string">'unknown_error'</span></span><span> =&gt; </span><span><span class="hljs-string">'An unknown error occurred.'</span></span><span>,
];
</span></span>

zh.php :

 <span><span><span class="hljs-keyword">return</span></span><span> [
    </span><span><span class="hljs-string">'invalid_query'</span></span><span> =&gt; </span><span><span class="hljs-string">'SQL 查詢出現錯誤。'</span></span><span>,
    </span><span><span class="hljs-string">'connection_failed'</span></span><span> =&gt; </span><span><span class="hljs-string">'數據庫連接失敗。'</span></span><span>,
    </span><span><span class="hljs-string">'unknown_error'</span></span><span> =&gt; </span><span><span class="hljs-string">'發生了未知錯誤。'</span></span><span>,
];
</span></span>

在代碼中動態加載對應的語言文件:

 <span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">loadErrorMessages</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$lang</span></span></span><span>) {
    </span><span><span class="hljs-variable">$filePath</span></span><span> = </span><span><span class="hljs-keyword">__DIR__</span></span><span> . </span><span><span class="hljs-string">"/lang/<span class="hljs-subst">{$lang}</span></span></span><span>.php";
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">file_exists</span></span><span>(</span><span><span class="hljs-variable">$filePath</span></span><span>)) {
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-keyword">include</span></span><span>(</span><span><span class="hljs-variable">$filePath</span></span><span>);
    }

    </span><span><span class="hljs-comment">// 如果語言文件不存在,則加載英文文件</span></span><span>
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-keyword">include</span></span><span>(</span><span><span class="hljs-keyword">__DIR__</span></span><span> . </span><span><span class="hljs-string">'/lang/en.php'</span></span><span>);
}

</span><span><span class="hljs-variable">$errorMessages</span></span><span> = </span><span><span class="hljs-title function_ invoke__">loadErrorMessages</span></span><span>(</span><span><span class="hljs-variable">$lang</span></span><span>);
</span></span>

這樣,每次需要顯示錯誤信息時,只需從語言文件中加載對應的提示信息。

總結

通過結合mysqli::$error和自定義的多語言錯誤提示系統,我們能夠為不同語言環境下的用戶提供更為友好的錯誤提示信息。在多語言開發中,使用這種方式能夠避免直接暴露數據庫的錯誤信息,同時提升用戶體驗。