繁体   English   中英

通过PHP通过Load Data InFile上传到MYSQL时验证数据

[英]Validate data when uploading to MYSQL with Load Data InFile via PHP

因此,我很高兴使用Load Data infile将数据上传到数据库中的多个表。 我的问题是,当上传的数据包含格式错误的数据(例如d / m / Y中的日期而不是Ymd)时。

这不会阻止数据的插入,而只是将其作为0000-00-00插入。 我希望它能够失败,因此我可以通知用户在继续操作之前先修复数据。

我目前正在使用以下小功能通过将其与示例文件进行比较来确保上传的文件包含正确的列:

function check_csv($f_a, $f_b)
{
    $csv_upload = array_map("str_getcsv", file($f_a,FILE_SKIP_EMPTY_LINES))[0];
    $csv_sample = array_map("str_getcsv", file($f_b,FILE_SKIP_EMPTY_LINES))[0];
    $match = 'true';
    foreach ($csv_sample as $key => $value) {
        if($value != $csv_upload[$key]){
            $match = 'false';
            break 1;
        }
    }
    return $match;
}

...我意识到现在有array_diff()函数在这里可能有用,我将在以后进行探讨。

回到当前的问题,我是否需要在此函数内执行某些操作以检查每个值,或者是否存在“加载数据文件”选项,该选项将强制执行我想要的行为。

我想说,在使用LOAD DATA INFILE的同时尝试在MySQL中进行验证几乎是徒劳的。 首先,使用LOAD DATA INFILE作为比通过解析器更快的选择。 如果要开始减慢速度并进行所有形式的解析,则最好不要使用LOADA DATA INFILE。

我建议您只是在CSV上的PHP中进行验证,并在尝试通过MySQL进行运行之前将其保全( 如有必要 )。 这实际上会更有效率,因为即使数据无效,您也不必打扰MySQL。

另外,您用于验证上述CSV文件的代码仅会比较CSV第一行的值。 这实际上并不能验证任何后续行的列数是否正确。 您也不需要array_diff() 只需将CSV中每一行的列数与预期的列数进行比较即可。

例如,假设您期望CSV的每一行中恰好有4列,并且您希望第2列的格式日期为Ymd

$row = 1;
$expectedColumnNum = 4; // we expect exactly 4 columns
if (($handle = fopen("uploaded.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle)) !== FALSE) {
        // Verify every row contains exact number of expected columns
        if (count($data) != $expectedColumnNum) {
            echo "CSV does not contain the expected number of columns on row $row!\n";
            break;
        }
        // Verify the second column is a formatted date of Y-m-d
        if (!DateTime::createFromFormat('Y-m-d', $data[1])) {
            echo "CSV does not contain valid formatted date on row $row!\n";
            break;
        }
        $row++;
    }
    fclose($handle);
}

如果上面的验证成功了,那么您最好使用LOAD DATA INFILE通过MySQL运行它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM