我儿子在他的托管站点上为家人建立了一个设施,以将旅行数据记录在 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}