从CSV文件将日期导入mySql

时间:2013-03-23 14:35:57

标签: php mysql

我儿子在他的托管网站上设置了一个设施,供家人记录MySql文件中的数据。然后将它们显示在地图上的网页上(使用谷歌地图,但私下托管。)

不幸的是,我的儿子几周前被送往医院并且仍在那里,所以如果我在这里发布,他建议可以找到问题的答案。

使用php脚本从记录器生成的csv文件中导入mysql数据。不幸的是,我的儿子不记得他在哪里获得剧本。

此脚本对日期字段(这是至关重要的)的工作除外。

脚本如下:

$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);    

这将导入第三项($ data [2])的所有内容到mysql EXCEPT,这是日期并导入为零(即00:00:00 00:00)。

这里是否有任何类型的编码员可以告诉我如何纠正这一点,或者指出我可以提供帮助的其他地方。

如果需要进一步的信息,请告诉我。

由于

编辑: 这是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

如果还有其他需要,请告诉我。

由于

编辑2

我尝试了Havelock的解决方案 - 选项3。

由于它仍然在DateOccurred字段中返回零,我添加了另一条指令,将csv中的日期插入到mysql数据库的'comments'文本字段中。

代码如下

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文件的正确数据(作为文本)。

我不确定这个信息有多重要 - 但我认为这可能意味着什么。

编辑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}

4 个答案:

答案 0 :(得分: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());
// ...

答案 1 :(得分:0)

您可以使用DateTime::createFromFormat()创建DateTime对象,然后以MySQL可读方式输出。例如,假设您的日期以“dmY”格式书写,例如2010年1月10日的“10012010”。要了解有关格式规范的更多信息,请阅读上面链接的PHP规范页面。

您可以使用以下函数将“dmY”格式转换为mysql格式

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

另外,我建议你看一下MySQL的LOAD DATA INFILE,这是一个将cvs文件导入表格的更快的选择。

答案 2 :(得分:0)

这取决于CSV文件上日期的格式。 阅读有关strtotime的功能,也许是解决方案

答案 3 :(得分:0)

在我看来,问题是由于CSV文件中日期/时间的格式不同。从关于表中插入的错误数据的信息,我假设该列的类型是DATETIME。此类型具有以下格式YYYY-MM-DD HH:MM:SS,因此如果您在CSV文件中的日期类似于05/23/2012 5:35 p.m.或其他类似的fomrat,这不是预期的格式,则可以理解问题发生。在我看来,你有两个选择:

选项1:
将日期保存在CSV文件中,以便符合MySQL的DATETIME。这就像

2013-03-23 15:45:25

然后插入应该正常工作。

选项2:
这个选项可能比以前更“笨拙”,特别是如果你不那么倾向于(从阅读问题的全文)。您需要在PHP脚本中创建一个新的DateTime对象,并在保存数据时使用其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版本&lt; 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());
}

<强>更新
我编辑了$timestamp相关行,以匹配CSV文件提供的格式。