2013-05-24 1 views
1

У меня есть .csv файл, который выглядит следующим образом ...Загрузка CSV файла, PHP/MySQL Query

 Name   AC-No.  Time    State  Exception Operation 

Johnny Starks Depp 1220 4/12/2013 12:45:18 AM Check In  OK 
Johnny Starks Depp 1220 4/12/2013 5:46:58 AM Out    Out 
Johnny Starks Depp 1220 4/12/2013 6:22:41 AM Out Back  Out 
Johnny Starks Depp 1220 4/12/2013 10:42:17 AM Check Out  Repeat 
Johnny Starks Depp 1220 4/12/2013 10:42:19 AM Check Out  OK 

я уже могу загрузить это в свою базу данных. моя проблема в том, что результат, который он показывает в таблице. В базе данных mysql у меня есть ТАБЛИЦА с колонками (Имя, ACNo., Date, CheckIn, Breakout, Breakin, CheckOut). То, что я хочу сделать, что я не могу сделать правильно, - это запись/s в CSV-файле с тем же . DATE (который показан в колонке TIME) будет находиться в одной строке с ошибкой, BreakOut, BreakIn и CheckOut в таблице и не приведет к многократной записи. как это ..

 Name   |ACNo |  Date | CheckIn  | Breakout | Breakin | Checkout 
        |  |   |    |   |   | 
Johnny Starks Depp|1220 | 4/12/2013 | 12:45:18 AM | 5:46:58 AM | 6:22:41 AM | 10:42:19 AM 

Теперь .. я уже сделал приведенный выше пример того, что я хочу, чтобы это произошло в таблице, но ... когда я проверить таблицу, да она имеет разные даты в каждом ряду, но время in (CheckIn, Breakout, Breakin, Checkout) ошибочны. Неправильно, потому что время, например, в DATE 4/12/2013, записывается в DATE 4/13/2013. Что не так с кодами, которые я использовал? Или я могу это сделать иначе? это мои коды:

<?php 

$conn = mysql_connect("localhost","root","") or die(mysql_error()); 
mysql_select_db("dtrlogs",$conn); 

$datehere =""; 

if(isset($_POST['Submit'])) 
{ 

$file = $_FILES['file']['tmp_name']; 

if($file == "") 
{ 
    ?> 
    <script type="text/javascript"> 
    alert('No File Selected!'); 
    </script> 
    <?php 
} 

else 
{ 
$handle = fopen($file,"r"); 
while(($fileop = fgetcsv($handle,1000,";")) !==false) 
{ 
    $Name = $fileop[0]; 
    $ACNo = $fileop[1]; 
    $Time = $fileop[2]; 
    $State = $fileop[3]; 
    $NewState = $fileop[4]; 
    $Exception = $fileop[5]; 
    $Operation = $fileop[6]; 

    //i separated time/date in the Column TIME in the .csv file 
    $date = date('m/d/Y', strtotime($Time)); 
    $hours = date('H:i:s A', strtotime($Time)); 


    //this is what i used to prevent multiple dates 
    if($datehere != $date) { 

     $datehere = $date; 
    } 
    else{ 

     $date = ""; 
    } 







    //this is to insert the name and acno to the other table. 
    //(this is for the lists of employee) 

    $sql=mysql_query("SELECT * FROM employee Where ACNo = '$ACNo'"); 
    $row=mysql_fetch_array($sql); 
    if($row == 0) { 

     $sql1 = mysql_query("INSERT INTO employee(ACNo, Name) VALUES('$ACNo','$Name')"); 
    } 



    //Inserts record if Date is not yet recorded and if already has just updates 
    //the row's column (Checkin, breakout, breakin and Checkout) 
    //with its correct time according to the date 

    $query = mysql_query("SELECT * FROM dtrs Where ACNo = '$ACNo' AND Date = '$date'"); 
    $rows = mysql_fetch_array($query); 
    if($rows == 0) { 

    $sql2 = mysql_query("INSERT INTO dtrs(Name, ACNo, Date, CheckIn, BreakOut, 
    BreakIn,CheckOut) 
    VALUES('$Name','$ACNo','$date','$CheckIn','$Breakout','$Breakin','$Checkout')"); 

    } 
    else{ 

    $sql2 = mysql_query("Update dtrs Set CheckIn = '$CheckIn', BreakOut = 
    '$Breakout', BreakIn = '$Breakin', CheckOut = '$Checkout'"); 
    } 







    //this is my conditions to identify whether the TIME/HOUR is 
    //Stated as CheckIn, Breakout, Breakin, or Checkout 

    if($NewState == "Check In" || $State == 'Check In' && $Exception == "OK") { 

     if($Exception == "Invalid" || $Exception == "Repeat") 
     {} 
     else { 
      $CheckIn = $hours; 
     } 
    } 
    if($State == 'Out' && $Exception == "Out") { 

     if($Exception == "Invalid" || $Exception == "Repeat") 
     {} 
     else { 
      $Breakout = $hours; 
     } 
    } 
    if($State == 'Out Back' && $Exception == "Out") { 

     if($Exception == "Invalid" || $Exception == "Repeat") 
     {} 
     else { 
      $Breakin = $hours; 
     } 
    } 
    if($NewState == "Check Out" || $State == "Check Out" && $Exception == "OK") { 

     if($NewState == "Check In") 
     {} 
     else { 
      $Checkout = $hours; 
     } 
    } 


} 


if($sql2) 
{ 
if($sql2) 
{ 


?> 
    <script type="text/javascript"> 
    alert('File Upload Successful!'); 
    </script> 
<?php 
} 
} 
} 

} 

?> 
+0

'LOAD DATA INFILE' – Gordon

+0

, что запрос на возвращение вставки? Я имею в виду, какие значения находятся в $ CheckIn, $ Breakout, $ Breakin, $ CheckOut и где они объявлены? может быть, это проблема. Также один хороший совет, когда что-то не вставляет обновление или не выбирает из db, отлаживать строковый запрос, который вы отправляете :) –

+0

Дубликат загрузки файла [.csv в базу данных с использованием php/mysql] (http: // stackoverflow .com/questions/16711240/csv-file-upload-to-database-using-php-mysql) – CBroe

ответ

0

Я хотел бы предложить, возможно, загрузку преходящей таблицы, и от извлечения детали использовать для заполнения вашей реальной таблицы.

Например, если вы загрузили CSV-файл в таблицу с именем LoadTable (не временную таблицу, так как вы можете использовать только таблицу temp один раз в куске SQL), вы можете извлечь отчетное имя и номер учетной записи, затем присоедините это к подзапросам, чтобы получить максимальное время события для каждого из соответствующих событий.

Что-то вроде этого: -

SELECT DerivMain.Name, 
    DerivMain.ACNo, 
    DerivMain.EventDate, 
    DATE_FORMAT(DerivCheckIn.EventDateTime, '%l:%i:%s %p'), 
    DATE_FORMAT(DerivBreakout.EventDateTime, '%l:%i:%s %p'), 
    DATE_FORMAT(DerivBreakin.EventDateTime, '%l:%i:%s %p'), 
    DATE_FORMAT(DerivCheckout.EventDateTime, '%l:%i:%s %p') 
FROM (SELECT DISTINCT Name, ACNo, DATE(STR_TO_DATE(Date,'%c/%e/%Y %l:%i:%s %p')) As EventDate FROM LoadTable) DerivMain 
LEFT OUTER JOIN (SELECT Name, ACNo, MAX(STR_TO_DATE(Date,'%c/%e/%Y %l:%i:%s %p') AS EventDateTime) FROM LoadTable WHERE State = 'Check In' GROUP BY Name, ACNo) DerivCheckIn 
ON DerivMain.Name = DerivCheckIn Name AND DerivMain.ACNo = DerivCheckIn.ACNo 
LEFT OUTER JOIN (SELECT Name, ACNo, MAX(STR_TO_DATE(Date,'%c/%e/%Y %l:%i:%s %p') AS EventDateTime) FROM LoadTable WHERE State = 'Out' GROUP BY Name, ACNo) DerivBreakout 
ON DerivMain.Name = DerivBreakout Name AND DerivMain.ACNo = DerivBreakout.ACNo 
LEFT OUTER JOIN (SELECT Name, ACNo, MAX(STR_TO_DATE(Date,'%c/%e/%Y %l:%i:%s %p') AS EventDateTime) FROM LoadTable WHERE State = 'Out Back' GROUP BY Name, ACNo) DerivBreakin 
ON DerivMain.Name = DerivBreakin Name AND DerivMain.ACNo = DerivBreakin.ACNo 
LEFT OUTER JOIN (SELECT Name, ACNo, MAX(STR_TO_DATE(Date,'%c/%e/%Y %l:%i:%s %p') AS EventDateTime) FROM LoadTable WHERE State = 'Check Out' GROUP BY Name, ACNo) DerivCheckout 
ON DerivMain.Name = DerivCheckout Name AND DerivMain.ACNo = DerivCheckout.ACNo 
+0

спасибо kickstart. но я не знаю, как использовать этот код. им не очень знакомы в JOINs и его так трудно понять. что действительно делают переходные процессы? я искал об этом, но мне кажется, что мне трудно понять, что он делает. благодарю вас за усилия по решению этого. очень ценится – Steve

+0

По кратковременной таблице я не имею в виду специальный тип таблицы, я просто хочу настроить таблицу (обычную таблицу) для использования при выполнении загрузки, а затем удалить ее, как только вы закончите с ней. Как только он загружается в эту таблицу (я только что назвал LoadTable в приведенном выше примере), вы можете легко ее обрабатывать. Этот SQL выше имеет подзапросы, каждый из которых получает последнюю дату/время для одного события для каждого имени/acno. Затем они объединяются, чтобы получить строку со значениями в ней, которые вам нужны. – Kickstart

+0

спасибо за помощь. оно работает! – Steve

Смежные вопросы