Datum vergelijken xml en mysql
Ik haal gegevens uit een xml bestand wat goed werkt maar 60 seconden later wil ik de gegevens weer op halen uit de xml en alleen de nieuwe gegevens met datum moet dan worden toegevoegt in de database. Ik krijg het niet werkend omdat het script gewoon weer alles in de database plaatst dus dubbel.
Het gaat dus om de onderste if()
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?php
foreach($xml->channel->item as $item)
{
$titel = mysql_real_escape_string($item->title);
$omschrijving = mysql_real_escape_string($item->description);
$datum = mysql_real_escape_string($item->pubDate);
$link = mysql_real_escape_string($item->link);
$geoChildren = $item->children('http://www.w3.org/2003/01/geo/wgs84_pos#');
$lat = mysql_real_escape_string($geoChildren->lat);
$latt = mysql_real_escape_string($geoChildren->long);
$ymapsChildren = $item->children('http://api.maps.yahoo.com/Maps/V1/AnnotatedMaps.xsd');
$zoom = mysql_real_escape_string($ymapsChildren->ZoomLevel);
$tijd = substr($datum, 17, 8);
$jaar = substr($datum, 12, 4);
$dag = substr($datum, 5, 2);
if (substr($datum, 8, 3) == 'Aug'){ $maand = 8; }
if (substr($datum, 8, 3) == 'Sep'){ $maand = 9; }
if (substr($datum, 8, 3) == 'Okt'){ $maand = 10; }
$datetime = $jaar.'-'.$maand.'-'.$dag.' '.$tijd;
$sql = "SELECT datetime FROM meldingen ORDER by datetime DESC LIMIT 1";
if(!$res = mysql_query($sql))
{
trigger_error(mysql_error().'<br />In query: '.$sql);
}
elseif(mysql_num_rows($res) == 0)
{
//$hoogstedatum = 0; //Database leeg
}
else
{
$row = mysql_fetch_assoc($res);
if($row['datetime'] == '')
{
$hoogstedatum = 0;
}
else
{
$hoogstedatum = $row['datetime'];
}
}
if($datetime > $hoogstedatum)// Aleen nieuwe datums toevoegen
{
$insert = "INSERT INTO meldingen (titel, omschrijving, datum, datetime, link, lat, latt, zoom) VALUES
('".$titel."', '".$omschrijving."', '".$datum."', '".$datetime."', '".$link."', '".$lat."', '".$latt."', '".$zoom."')";
mysql_query($insert)or die(mysql_error());
echo 'gelukt';
}
}
?>
foreach($xml->channel->item as $item)
{
$titel = mysql_real_escape_string($item->title);
$omschrijving = mysql_real_escape_string($item->description);
$datum = mysql_real_escape_string($item->pubDate);
$link = mysql_real_escape_string($item->link);
$geoChildren = $item->children('http://www.w3.org/2003/01/geo/wgs84_pos#');
$lat = mysql_real_escape_string($geoChildren->lat);
$latt = mysql_real_escape_string($geoChildren->long);
$ymapsChildren = $item->children('http://api.maps.yahoo.com/Maps/V1/AnnotatedMaps.xsd');
$zoom = mysql_real_escape_string($ymapsChildren->ZoomLevel);
$tijd = substr($datum, 17, 8);
$jaar = substr($datum, 12, 4);
$dag = substr($datum, 5, 2);
if (substr($datum, 8, 3) == 'Aug'){ $maand = 8; }
if (substr($datum, 8, 3) == 'Sep'){ $maand = 9; }
if (substr($datum, 8, 3) == 'Okt'){ $maand = 10; }
$datetime = $jaar.'-'.$maand.'-'.$dag.' '.$tijd;
$sql = "SELECT datetime FROM meldingen ORDER by datetime DESC LIMIT 1";
if(!$res = mysql_query($sql))
{
trigger_error(mysql_error().'<br />In query: '.$sql);
}
elseif(mysql_num_rows($res) == 0)
{
//$hoogstedatum = 0; //Database leeg
}
else
{
$row = mysql_fetch_assoc($res);
if($row['datetime'] == '')
{
$hoogstedatum = 0;
}
else
{
$hoogstedatum = $row['datetime'];
}
}
if($datetime > $hoogstedatum)// Aleen nieuwe datums toevoegen
{
$insert = "INSERT INTO meldingen (titel, omschrijving, datum, datetime, link, lat, latt, zoom) VALUES
('".$titel."', '".$omschrijving."', '".$datum."', '".$datetime."', '".$link."', '".$lat."', '".$latt."', '".$zoom."')";
mysql_query($insert)or die(mysql_error());
echo 'gelukt';
}
}
?>
Dus jij vergelijkt bijvoorbeeld vandaag dit:
if($datetime > $hoogstedatum)
wordt dus dit:
if('2010-8-26 15:03' > '2010-08-26 15:03')
Ja, dat is groter.
Toevoeging op 26/08/2010 15:11:28:
Uiteraard er van uitgaande dat je een DATETIME veld gebruikt.
Gewijzigd op 26/08/2010 15:08:48 door - SanThe -
Ik heb het verandert if (substr($datum, 8, 3) == 'Aug'){ $maand = '08'; }
Ik heb de datums ook even weergegeven met een echo maar hij slaat nu alleen de eerste op.
2010-08-26 15:51:07 - 2010-08-26 14:13:37gelukt
2010-08-26 15:50:53 - 2010-08-26 15:51:07
2010-08-26 15:47:05 - 2010-08-26 15:51:07
2010-08-26 15:40:59 - 2010-08-26 15:51:07
2010-08-26 15:36:46 - 2010-08-26 15:51:07
De eerste rij komt uit de xml bestand en de tweede uit de database.
De datum 2010-08-26 14:13:37 is de hoogste datum uit de database, Nu slaat hij de eerste datum 2010-08-26 15:51:07 op maar vergelijkt de rest daar ook mee en daarom wordt de rest niet toegevoegt. is er een manier dat ik eerst 2010-08-26 15:36:46 kan toevoegen en dan de rest. dan zou het moeten werken.
http://en.wikipedia.org/wiki/Merge_%28SQL%29
INSERT ... ON DUPLICATE KEY UPDATE
Zorg voor een goeie key definitie en je hoeft verder niets te programmeren.
In Oracle SQL gebruik ik bijvoorbeeld dit:
MERGE INTO table_name USING table_reference ON (condition)
WHEN MATCHED THEN
UPDATE SET column1 = value1 [, column2 = value2 ...]
WHEN NOT MATCHED THEN
INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...
INSERT ... ON DUPLICATE KEY UPDATE
Zorg voor een goeie key definitie en je hoeft verder niets te programmeren.
In Oracle SQL gebruik ik bijvoorbeeld dit:
MERGE INTO table_name USING table_reference ON (condition)
WHEN MATCHED THEN
UPDATE SET column1 = value1 [, column2 = value2 ...]
WHEN NOT MATCHED THEN
INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...
Eerst de SELECT om $hoogstedatum te bepalen.
En dan pas de foreach($xml->channel->item as $item)