2017-03-08 66 views
1

因此,我非常高興地使用Load Data infile將數據上載到數據庫中的多個表。我的問題是上傳的數據包含格式不正確的數據,例如d/m/Y的日期而不是Y-m-d。通過PHP上載到MYSQL並通過Load Data InFile驗證數據通過PHP

這並不妨礙數據被插入,它只是將它作爲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選項可以強制執行我期望的操作。

回答

1

我想說的是,在使用LOAD DATA INFILE的時候,試圖在MySQL中進行驗證,這實際上是一種無用的練習。首先,您使用LOAD DATA INFILE作爲比通過解析器更快的替代方法。如果你想在那裏開始放慢速度並進行所有的解析方式,你可能不會使用LOADA DATA INFILE。

我建議你只需在PHP上對CSV進行驗證,然後在嘗試通過MySQL運行它之前保釋(必要)。這實際上會更有效率,因爲如果數據甚至不是有效的,你根本不必打擾MySQL。

此外,您用於驗證上述CSV文件的代碼僅比較CSV第一行的值。這實際上並沒有驗證任何正在進行的行具有正確的列數。您也不需要array_diff()。只需將CSV中每一行的列數與預期列數進行比較即可。

例如,假設您希望在CSV每行中正好是4列,並且希望列2至有Y-m-d格式化的日期:

$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來運行它。

+0

謝謝你,這幾乎是我以爲我會得到。 關於我的功能,它只是有意識地檢查第一行,因爲我只是想檢查文件是否包含預期的列,並且按照預期的順序。 由於數據來自相對受控的源,我真的只關心驗證第2行(或列頭後的第一行數據)的數據,所以我會把你的日期檢查片段用於良好的使用。 再次感謝 –

+0

此外,我的腳本是一個通用腳本,可處理具有不同列號和名稱的不同數據文件。因此我將其與文件的已知良好示例副本進行比較。 –

+0

沒關係。您可以讀取所需樣本文件的標題,然後將每行的列數與樣本文件中的列數進行比較。無論如何,你將不得不檢查每一行的日期。你所說的沒有改變我提供的答案。 – Sherif