2013-03-23 4 views
3

Мой сын создал объект на своем размещенном сайте для семьи, чтобы записывать данные из поездок в файл MySql. Затем они отображаются на веб-странице на карте (используются карты Google, но размещаются в частном порядке.)Импорт даты в mySql из файла CSV

К сожалению, моего сына доставили в больницу несколько недель назад и все еще там, поэтому он предложил получить ответ на если я разместил его здесь.

Данные mysql создаются с использованием php-скрипта для импорта из файлов csv, создаваемых регистраторами. Мой сын, к сожалению, не помнит, где он получил сценарий.

Этот сценарий работает ЗА ИСКЛЮЧЕНИЕМ для поля даты (что очень важно).

Сценарий выглядит следующим образом:

$tot = 0; 
$handle = fopen($_FILES["uploaded"]["tmp_name"], "r"); 
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
    for ($c=0; $c < 1; $c++) { 

if($data[0] !='Latitude'){ 
       mysql_query("INSERT INTO positions(
       Latitude, 
       Longitude, 
       DateOccurred, 
       Altitude, 
       Speed, 
       Angle 
       )VALUES(
        '".mysql_real_escape_string($data[0])."', 
        '".mysql_real_escape_string($data[1])."', 
        '".mysql_real_escape_string($data[2])."', 
        '".mysql_real_escape_string($data[16])."', 
        '".mysql_real_escape_string($data[15])."', 
        '".mysql_real_escape_string($data[8])."' 

       )")or die(mysql_error()); 
} 
    $tot++;} 
} 
fclose($handle);  

Это импортирует все, чтобы MySQL КРОМЕ для третьего элемента ($ данных [2]), которая является дата и импорта, как нули (т.е. 00:00:00 00:00).

Есть ли здесь какие-то кодировщики, которые могут сказать мне, как исправить это, или указать мне в другом месте, которое может помочь.

Если необходима дополнительная информация, пожалуйста, дайте мне знать.

Благодаря

EDIT: Вот структура таблицы SQL

|//**ID**//|int(11)|No| 
|FK_Users_ID|int(11)|No| 
|FK_Trips_ID|int(11)|Yes|NULL 
|FK_Icons_ID|int(11)|Yes|NULL 
|Latitude|double|No| 
|Longitude|double|No| 
|Altitude|double|Yes|0 
|Speed|double|Yes|0 
|Angle|double|Yes|NULL 
|DateAdded|timestamp|No|CURRENT_TIMESTAMP 
|DateOccurred|timestamp|Yes|0000-00-00 00:00:00 
|Comments|varchar(255)|Yes|NULL 
|ImageURL|varchar(255)|Yes|NULL 
|SignalStrength|int(11)|Yes|NULL 
|SignalStrengthMax|int(11)|Yes|NULL 
|SignalStrengthMin|int(11)|Yes|NULL 
|BatteryStatus|tinyint(4)|Yes|NULL 

Вот пример содержимого CSV файла:

Latitude,Longitude,DateOccurred,ID,IconName,Comments,TripName,ImageURL,Angle,CellID,SignalStrength,SignalStrengthMin,SignalStrengthMax,BatteryStatus,Source,Speed,Altitude 
51.1923274,-3.102753383,20/03/2013 14:17,2352,,,dentist,,287.2,,,,,,0,7.71666666,13 
51.19254205,-3.103862483,20/03/2013 14:17,2353,,,dentist,,285.4,,,,,,0,7.665222216,14 
51.19268602,-3.105032683,20/03/2013 14:17,2354,,,dentist,,272.1,,,,,,0,9.054222214,11.1 

Если что-то еще нужно, дайте мне знать.

Благодаря

EDIT 2

Я попробовал решение от Хэвлок - вариант 3.

Как еще возвращаются нули в DateOccurred поле я добавил еще одну инструкцию, чтобы вставить даты csv в текстовое поле комментариев в базе данных mysql.

код выглядит следующим образом

if($data[0] !='Latitude'){ 
      $timestamp = strtotime($data[2]); 
      mysql_query("INSERT INTO positions(
      Latitude, 
      Longitude, 
      DateOccurred, 
      Comments, 
      Altitude, 
      Speed, 
      Angle 
      )VALUES(
       '".mysql_real_escape_string($data[0])."', 
       '".mysql_real_escape_string($data[1])."', 
       '".mysql_real_escape_string($data[2])."', 
       '".mysql_real_escape_string(date('Y-m-d H:i:s', $timestamp))."', 
       '".mysql_real_escape_string($data[16])."', 
       '".mysql_real_escape_string($data[15])."', 
       '".mysql_real_escape_string($data[8])."' 

       )")or die(mysql_error()); 

В результате, данные, вставленные в поле «Комментарии» во всех записях чтения

1969-12-31 18:00:00 

в то время как информация, содержащаяся в CSV был

20/03/2013 14:17 

Если я опускаю линии

$timestamp = strtotime($data[2]); 
and 
'".mysql_real_escape_string(date('Y-m-d H:i:s', $timestamp))."', 

В поле комментариев содержатся правильные данные из файла csv (в виде текста).

Я не уверен, насколько значительна эта информация, но я подумал, что это может означать что-то здесь.

EDIT 3

Как 'DateTime :: createFromFormat()' должен работать с PHP 5.3.22 я снова сценарий и вошел в код, чтобы проверить его. Я добавил этот

$date = DateTime::createFromFormat('d/m/Y H:i', $data[2]); 
      echo $date->format('Y-m-d H:i:s'); 

эхо было напечатать результаты, чтобы увидеть, что они были. Скрипт выглядит следующим образом

if($data[0] !='Latitude'){ 
      $date = DateTime::createFromFormat('d/m/Y H:i', $data[2]); 
      echo $date->format('Y-m-d H:i:s'); 
      mysql_query("INSERT INTO positions(
      Latitude, 
      Longitude, 
      DateOccurred, 
      Altitude, 
      Speed, 
      Angle 
      )VALUES(
       '".mysql_real_escape_string($data[0])."', 
       '".mysql_real_escape_string($data[1])."', 
       '".mysql_real_escape_string(date('Y-m-d H:i:s'))."', 
       '".mysql_real_escape_string($data[16])."', 
       '".mysql_real_escape_string($data[15])."', 
       '".mysql_real_escape_string($data[8])."' 


       )")or die(mysql_error()); 
} 

Это привело к сценарию печати даты и введя его в правильном формате в поле MySQL.

ОДНАКО - дата, которая печатается и хранится в текущая дата и время, а не дата хранится в файле CSV, поэтому утверждение, кажется, игнорируя $ данных [2}

+0

Можете ли вы добавить детали из MySQL, такие как запуск: описать позиции; Это может предоставить некоторую полезную информацию о схеме таблицы. Помимо этого, возможно, что источник данных этой формы не обрабатывается должным образом, и вместо значения загруженного контента используется значение «по умолчанию». Вы можете попробовать показать некоторые данные CSV? –

+0

Каков формат даты в CSV-файле? – Havelock

+0

'$ data [2]' дата, в каком формате? – mkjasinski

ответ

0

Вы может использовать DateTime::createFromFormat() для создания объекта DateTime, а затем выводить его в MySQL-читаемом виде. Например, предположим, что ваша дата написана в формате «dmY», например. «10012010» на 10 января 2010 года. Чтобы узнать больше о спецификации формата, прочитайте страницу спецификации PHP, связанную выше.

Вы можете использовать следующую функцию для преобразования из формата «ДМГ» в MySQL формат

function convert($date) { 
    $d = DateTime::createFromFormat('dmY', $date); 
    return $d->format('Y-m-d H:i:s'); 
} 

На стороне записки, я предлагаю вам взглянуть на MySQL, LOAD DATA INFILE который является гораздо быстрее, возможность импорта файл cvs в таблицу.

+0

Благодарим за информацию и ссылку на «LOAD DATA INFILE». Я посмотрю на это с моим сыном, когда/если он выйдет из больницы. Тем временем я буду играть с некоторыми из ответов здесь. – user2202256

1

Проверьте это:

// ... 

$formatFromFile = 'Y-m-d'; // your format of date in csv file 
$date = DateTime::createFromFormat($formatFromFile, $data[2]); 

mysql_query("INSERT INTO positions(
      Latitude, 
      Longitude, 
      DateOccurred, 
      Altitude, 
      Speed, 
      Angle 
      )VALUES(
       '".mysql_real_escape_string($data[0])."', 
       '".mysql_real_escape_string($data[1])."', 
       '".mysql_real_escape_string($date->format('Y-m-d H:i:s'))."', 
       '".mysql_real_escape_string($data[16])."', 
       '".mysql_real_escape_string($data[15])."', 
       '".mysql_real_escape_string($data[8])."' 

      )")or die(mysql_error()); 
// ... 
0

Это зависит от формата даты на файл CSV. Читайте о функции strtotime, может быть, это solucion

0

Мне кажется, проблема связана с разным форматом даты/времени в вашем CSV-файле. Из информации о неверных данных, вставленных в таблицу, я бы предположил, что тип этого столбца равен DATETIME. Этот тип имеет следующий формат YYYY-MM-DD HH:MM:SS, поэтому, если у вас есть дата в CSV-файле в fomrat, подобном 05/23/2012 5:35 p.m., или что-то еще, что не является ожидаемым форматом, понятно, что проблема возникает. По-моему, у вас есть два варианта:

Вариант 1:
Сохраните дату в файле CSV, так что он может быть соответствовать MySQL, DATETIME. Это что-то вроде

2013-03-23 15:45:25 

Тогда вставка должна работать должным образом.

Вариант 2:
Этот вариант может быть более «fiddlier», чем предыдущий, особенно если вы не тот путь наклонен (от чтения полного текста вопроса).Вам нужно будет создать новый объект DateTime в скрипте PHP и использовать его метод format() при сохранении данных.
К сожалению, я не знаю формат из CSV-файла, поэтому могу просто рассказать. Предположим, дата в файле форматирования, как это 03/24/2013 5:24 PM

if($data[0] !='Latitude'){ 
      $date = DateTime::createFromFormat('m/d/Y g:i a', $data[2]); 
      mysql_query("INSERT INTO positions(
      Latitude, 
      Longitude, 
      DateOccurred, 
      Altitude, 
      Speed, 
      Angle 
      )VALUES(
       '".mysql_real_escape_string($data[0])."', 
       '".mysql_real_escape_string($data[1])."', 
       '".mysql_real_escape_string($date->format('Y-m-d H:i:s'))."', 
       '".mysql_real_escape_string($data[16])."', 
       '".mysql_real_escape_string($data[15])."', 
       '".mysql_real_escape_string($data[8])."' 

      )")or die(mysql_error()); 
} 

Если я ошибаюсь, о формате в файле CSV, то есть 'm/d/Y g:i a' часть, вы можете посмотреть на DateTime documentation, чтобы увидеть, как исправить это, выбрав подходящий формат, чтобы он соответствовал вашему делу.

Вариант 3:
Как вы, кажется, PHP версии 5.3 < установлен на хостинг-сервере, попробуйте следующее:

if($data[0] !='Latitude'){ 
      $timestamp = strtotime(str_replace('/', '-', $data[2])); 
      mysql_query("INSERT INTO positions(
      Latitude, 
      Longitude, 
      DateOccurred, 
      Altitude, 
      Speed, 
      Angle 
      )VALUES(
       '".mysql_real_escape_string($data[0])."', 
       '".mysql_real_escape_string($data[1])."', 
       '".mysql_real_escape_string(date('Y-m-d H:i:s', $timestamp))."', 
       '".mysql_real_escape_string($data[16])."', 
       '".mysql_real_escape_string($data[15])."', 
       '".mysql_real_escape_string($data[8])."' 

      )")or die(mysql_error()); 
} 

Update
Я редактировал связанную линию $timestamp чтобы соответствовать формату, предоставленному вашим CSV-файлом.

+0

Спасибо за это. К сожалению, он прерывает скрипт с ошибкой --- [23-Март-2013 11:05:26 Америка/Чикаго] PHP Неустранимая ошибка: вызывается в формате функции участника() на не-объекте в /domain.com/sql /uploadcsv3.php в строке 59 --- это строка, замененная для $ data2 – user2202256

+0

Я вижу. Это предполагает, что на вашем сервере хостинга установлена ​​версия PHP версии 5.3. См. Обновленный ответ - «Вариант 3» – Havelock

+0

Спасибо, вы правы, у сервера есть версия PHP 5.3.22, установленная из того, что я вижу. Сценарий теперь снова работает с новыми изменениями, но, к сожалению, все еще возвращает нули в поле DateOccurred ;-(. Я также попробовал что-то еще, чтобы увидеть, могу ли я увидеть очевидную проблему - подробности в следующем редактировании на мой исходный вопрос. – user2202256

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