我儿子在他的托管网站上设置了一个设施,供家人记录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}
答案 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文件提供的格式。