2017-03-08 2 views
1

로드 데이터 infile을 사용하여 데이터베이스의 여러 테이블에 데이터를 업로드하고 있습니다. 내 문제는 업로드 된 데이터에 Y-m-d가 아닌 d/m/Y의 날짜와 같이 형식이 잘못된 데이터가 포함 된 경우입니다.PHP를 통해 데이터로드 InFile을 사용하여 MYSQL에 업로드 할 때 데이터 유효성 확인

데이터가 삽입되는 것을 막지 않으며, 0000-00-00으로 삽입합니다. 내가 원하는 것은 실패하기 때문에 진행하기 전에 데이터를 수정하도록 사용자에게 알릴 수 있습니다.) (지금 array_diff이 내가 실현 ...

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; 
} 

:

나는 현재 다음 작은 함수를 사용하여 샘플 파일에 대해 비교하여 올바른 열을 포함 업로드 된 파일을 확인하기 위해 검사를하고있는 중이 야 기능이 유용 할 수도 있습니다. 나중에 살펴 보겠습니다.

이 문제로 되돌아 가면,이 함수 내에서 각각의 값을 확인해야 할 필요가 있거나 원하는 동작을 강제하는 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