2016-03-23 18 views
0

PHP kullanarak bir MySQL tablosuna bir CSV ayrışıyorum.sql sorgusunun başlangıç ​​/ bitiş saatini alın

  1. masamda "Başlangıç ​​Zamanı" (dosyanın ayrıştırma başlangıcı) denilen "Dosya", "EndTime" (dosyanın ayrıştırma sonu) ve "CreationDate" (zaman damgası sütunları var satır oluşturuldu). Bu zamanları almak için hangi yollar var? NOW() iyi bir çözüm mü?

  2. Ayrıca, "Hata içeren satırlar" adlı bir sütunun da vardır. Bu sütunlar, içinde hatalar bulunan satırların sayısıdır ve dolayısıyla ayrıştırılmazlar. CSV dosyasındaki hatalarla satır sayısını nasıl alabilirim?

    function parse($file) { 
    
    $file_handle = fopen($file, "r"); //opens CSV 
    while (($row = fgetcsv($file_handle, 1000, ",")) !== false){ 
    
    $file_name = basename($file); 
    $Rows_with_errors = ?; 
    $StartDate= date("Y-m-d H:i:s", time()); //? 
    $EndDate=?; 
    $CreationDate=?; 
    
    $sql = "INSERT INTO file (Filename, TotalNumberOfRows, RowsWithErrors, StartDate, EndDate, CreationDate) 
    VALUES('$file_name','$Total_nr_of_Rows', '$Rows_with_errors', '$StartDate', '$EndDate', '$CreationDate')"; 
    
    global $conn; 
    $conn->query($sql); //executes the query 
    } 
    
    if ($sql) 
        { 
         echo 'Data uploaded to database!'; 
        } 
    else { 
         echo "Error: " . $sql . "<br>" . $conn->error; 
    } 
    } 
    
    : [varchar int, zaman damgası, zaman damgası, zaman damgası]]

    İşte

benim kod: (bir hata sahip bir satır örneğin olması gerektiği, türleri yanlış bir satır olacak Bunu çalıştırmak asla

cevap

0

, bu işe yarar. Açıklama kodundadır. İşe yaradı

<?php 

function parse($file) { 

    //Initialize some variables here. Probably in some constants etc. 
    $dateRegex = '|^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$|'; //Just a rough check. I purposely skip the case of like 9999-99-99 99:99:99. Up to you to refine this. 
    $dateFormat = 'Y-m-d H:i:s'; 

    //In fact checking the file exist or not is probably useful too: 
    //if (is_file($file)) ... 

    //Opens CSV in read mode 
    $file_handle = fopen($file, "r"); 

    //We don't need to put this in the loop since it's a one time job 
    $file_name = basename($file); 

    //We also initialize the variable outside the while loop so that we can increment it 
    $Rows_with_errors = 0; 
    $Total_nr_of_Rows = 0; 

    //StartDate of the parsing, shouldn't it be outside of the while loop too? 
    //Also, using "date" will gives you the time in the timezone that you set in your php.ini's date.timezone property. 
    //Using "gmdate" will gives you the time in GMT time. 
    $StartDate = date($dateFormat, time()); 

    while (($row = fgetcsv($file_handle, 1000, ",")) !== false) { 

     ++$Total_nr_of_Rows; 

     //So here, we are looping row by row. Do your checking here: 
     if (!(is_string($row[0]) && 
      is_numeric($row[1]) && 
      preg_match($dateRegex, $row[2]) && 
      preg_match($dateRegex, $row[3]) && 
      preg_match($dateRegex, $row[4]))) { 

       //Increment the error 
       ++$Rows_with_errors; 
     } 
    } 

    //That's it. We insert it now 
    //Creation date & end date, probably the same, no? we initialize here: 
    $CreationDate = $EndDate = date($dateFormat, time()); 

    //This is bad. There is no escaping, and YOU ARE RISK OF QUERY INJECTION FROM THE $file_name VARIABLE. 
    //I won't discuss it here since this is not the scope of the question. 
    $sql = "INSERT INTO file (Filename, TotalNumberOfRows, RowsWithErrors, StartDate, EndDate, CreationDate) 
VALUES('$file_name','$Total_nr_of_Rows', '$Rows_with_errors', '$StartDate', '$EndDate', '$CreationDate')"; 

    global $conn; 
    $conn->query($sql); //executes the query 

    if ($sql){ 
     echo 'Data uploaded to database!'; 
    }else { 
     echo "Error: " . $sql . "<br>" . $conn->error; 
    } 
} 
+0

, teşekkür ederim !! – user212121232323

İlgili konular