簡體   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