在使用 PHP 将 CSV 文件导入到 MySQL 数据库时,常常会遇到一些数据格式问题、重复键、数据截断等警告。这些警告不会直接导致导入失败,但会影响数据的完整性和正确性。为了精准掌握导入过程中出现的潜在问题,mysqli::get_warnings 函数就成为了排查和优化导入过程的重要工具。
mysqli::get_warnings 是 PHP 的 mysqli 类中用于获取最近一次数据库操作所产生的警告信息的方法。它返回一个警告对象链,通过它我们可以逐条读取并分析数据库执行过程中产生的警告,诸如数据截断、外键约束失败等。
在导入 CSV 的场景中,这些警告信息可以帮助我们定位问题行,及时调整 CSV 文件或数据库结构,避免数据异常。
读取 CSV 文件内容。
解析每一行数据。
使用 INSERT 或 LOAD DATA INFILE 将数据写入数据库。
调用 mysqli::get_warnings 获取执行过程中的警告。
根据警告结果做相应处理或记录日志。
下面示例展示了如何用 PHP 结合 mysqli 导入 CSV 并使用 get_warnings 来获取警告。
<?php
$mysqli = new mysqli("gitbox.net", "username", "password", "database");
if ($mysqli->connect_errno) {
die("连接失败: " . $mysqli->connect_error);
}
$csvFile = fopen("data.csv", "r");
if (!$csvFile) {
die("无法打开 CSV 文件");
}
$lineNumber = 0;
while (($data = fgetcsv($csvFile)) !== false) {
$lineNumber++;
// 假设 CSV 有三列: id, name, email
$id = $mysqli->real_escape_string($data[0]);
$name = $mysqli->real_escape_string($data[1]);
$email = $mysqli->real_escape_string($data[2]);
$sql = "INSERT INTO users (id, name, email) VALUES ('$id', '$name', '$email')";
if (!$mysqli->query($sql)) {
echo "第 $lineNumber 行插入失败: " . $mysqli->error . "\n";
} else {
// 获取警告信息
if ($mysqli->warning_count > 0) {
$warning = $mysqli->get_warnings();
while ($warning) {
echo "第 $lineNumber 行警告: ({$warning->errno}) {$warning->message}\n";
$warning = $warning->next();
}
}
}
}
fclose($csvFile);
$mysqli->close();
?>
Data truncated for column
说明导入的数据长度超出字段长度,可能导致数据被截断。建议检查 CSV 对应字段长度,或者数据库字段类型是否合理。
Duplicate entry
导入的数据违反了唯一性约束,可能是主键或唯一索引冲突。需要核查重复数据并处理。
Incorrect datetime value
日期时间格式不正确,导致插入失败或异常。检查 CSV 中对应字段格式,确保符合 MySQL 要求。
利用 mysqli::get_warnings,我们能在导入 CSV 过程中实时捕获并输出潜在的警告信息,从而实现更细致的错误诊断和数据质量控制。这不仅提升了数据导入的稳定性,也便于后续的数据清洗和修正。
通过合理处理这些警告,确保导入数据的完整性和准确性,是提升系统数据可靠性的关键步骤。