【发布时间】:2013-03-13 08:23:24
【问题描述】:
我儿子在他的托管网站上为家人建立了一个设施,以将旅行数据记录在 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 数据库中的“cmets”文本字段中。
代码如下
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());
结果是插入到'Comments'字段中的所有记录中的数据都被读取了
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))."',
cmets 字段包含来自 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}
【问题讨论】:
-
你能否从 MySQL 添加详细信息,例如运行:描述位置;这可能会提供一些关于表模式的有用信息。除此之外,该表单数据的来源可能没有得到正确处理,并导致使用“默认”值而不是上传的内容。您可以尝试显示一些 CSV 数据吗?
-
CSV 文件中的日期格式是什么?
-
$data[2]是日期,是什么格式? -
发布几行 CSV 文件的示例,这将有助于解决如何处理它
-
只需将
'".mysql_real_escape_string(date('Y-m-d H:i:s'))."',行替换为'".mysql_real_escape_string($date->format('Y-m-d H:i:s'))."',。就像现在一样,您正在从输入中正确创建日期,但您正在插入其他内容 - 这是一个新创建的日期,带有date('Y-m-d H:i:s')。