3

我儿子在他的托管站点上为家人建立了一个设施,以将旅行数据记录在 MySql 文件中。这些然后显示在地图上的网页上(使用谷歌地图,但私人托管。)

不幸的是,我儿子几周前被送进了医院,现在还在那里,所以他建议如果我把它贴在这里可能会得到一个问题的答案。

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,除了第三项($data[2]),它是日期并导入为零(即 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 文件中的日期,因此该语句似乎忽略了 $data[2}

4

4 回答 4

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());
// ...
于 2013-03-23T14:50:31.693 回答
0

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

您可以使用以下函数将 'dmY' 格式转换为 mysql-format

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

附带说明一下,我建议您看一下 MySQL 的LOAD DATA INFILE,这是一个更快的选项,可以将 cvs 文件导入到表中。

于 2013-03-23T14:50:12.130 回答
0

这取决于 CSV 文件中日期的格式。阅读有关函数 strtotime 的信息,也许是解决方案

于 2013-03-23T14:54:02.943 回答
0

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

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

2013-03-23 15:45:25

然后插入应该正常工作。

选项 2:
此选项可能比前一个选项更“复杂”,特别是如果您不那么倾向于(通过阅读问题的全文)。您需要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 文档以了解如何通过选择适当的格式来修复它,因此它适合您的情况。

选项 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());
}

更新
我已编辑$timestamp相关行以匹配您的 CSV 文件提供的格式。

于 2013-03-23T15:00:57.953 回答