在 PHP 中,mysqli 扩展用于与 MySQL 数据库进行交互。当执行数据库查询时,mysqli::$error 属性提供了当前连接的 MySQL 数据库返回的错误信息。假如查询失败,mysqli::$error 将存储 MySQL 返回的错误信息,开发者可以利用这个属性来进行错误处理和调试。
在多语言应用中,直接使用 MySQL 错误信息并不适合向用户显示,因为它通常是英文或技术性的描述,且不适合普通用户阅读。因此,我们需要结合 mysqli::$error 来构建支持多语言的错误提示。
实现多语言错误提示功能的核心在于通过用户的语言偏好来动态选择错误信息。以下是一些关键步骤:
首先,你需要获取用户的语言设置。通常,用户语言设置存储在会话中或通过浏览器的 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>
我们可以将错误提示文本定义在一个多维数组中,每种语言对应一个子数组。这样,所有的错误信息都能在数组中找到对应的翻译。
<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-string">'invalid_query'</span></span><span> => </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> => </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> => </span><span><span class="hljs-string">'An unknown error occurred.'</span></span><span>,
],
</span><span><span class="hljs-string">'zh'</span></span><span> => [
</span><span><span class="hljs-string">'invalid_query'</span></span><span> => </span><span><span class="hljs-string">'SQL 查询出现错误。'</span></span><span>,
</span><span><span class="hljs-string">'connection_failed'</span></span><span> => </span><span><span class="hljs-string">'数据库连接失败。'</span></span><span>,
</span><span><span class="hljs-string">'unknown_error'</span></span><span> => </span><span><span class="hljs-string">'发生了未知错误。'</span></span><span>,
],
</span><span><span class="hljs-comment">// 可以继续添加其他语言</span></span><span>
];
</span></span>
接下来,我们可以创建一个自定义的错误处理函数,根据当前语言和 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>]) && </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>
接下来,在数据库操作中,可以通过 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>->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>-></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>->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>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span></span>
为了进一步优化代码,我们可以将错误信息存储在语言文件中,避免将所有信息硬编码到 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> => </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> => </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> => </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> => </span><span><span class="hljs-string">'SQL 查询出现错误。'</span></span><span>,
</span><span><span class="hljs-string">'connection_failed'</span></span><span> => </span><span><span class="hljs-string">'数据库连接失败。'</span></span><span>,
</span><span><span class="hljs-string">'unknown_error'</span></span><span> => </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 和自定义的多语言错误提示系统,我们能够为不同语言环境下的用户提供更为友好的错误提示信息。在多语言开发中,使用这种方式能够避免直接暴露数据库的错误信息,同时提升用户体验。
相关标签:
mysqli