PHP en JSON
Ik weet niet of het in de juiste categorie zit, maar geraak niet verder ( grote deels door mijn heel beperkte kennis van json & PHP).
Ik zoek hulp om een script te krijgen dat json ( afkomstig van de site: https://www.volleyadmin2.be/services/wedstrijden_xml.php?province_id=4&format=json&stamnummer=L-0923)
Omzet in een tabel ( en in de toekomst vb enkel de laatste en de toekomstige 14dagen gaat tonen).
Ik heb de tutorials gevolgd van w3s, maar geraak er niet echt uit.
Kan er iemand mij op de weg helpen, of mij een goede cursus of boek aanraden?
Alvast bedankt voor de info. Excuses als ik in de verkeerde categorie zit.
mvg,
Jenthe
Het loont al om de JSON-string om te zetten in een array, en deze al uit te lezen. Dan weet je precies wat je hebt, en hoe je het moet uitlezen.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
// De URL met JSON-data die je wilt uitlezen
$url= "https://www.volleyadmin2.be/services/wedstrijden_xml.php?province_id=4&format=json&stamnummer=L-0923";
// We halen de data op
$data = file_get_contents($url);
// We decoden de JSON-string naar werkbare data. True is bedoeld om er een array van te maken, i.p.v. een object.
$json = json_decode($data,true);
// Even de data in een array tonen voor de handigheid tijdens het ontwikkelen.
echo "<pre>".print_r($json,true)."</pre>";
// Vanaf hier kan je bijvoorbeeld $json met foreach($json as $item) { ...} doorlopen zodat je elk los items in de loop kan opvragen om uiteindelijk te verwerken.
?>
// De URL met JSON-data die je wilt uitlezen
$url= "https://www.volleyadmin2.be/services/wedstrijden_xml.php?province_id=4&format=json&stamnummer=L-0923";
// We halen de data op
$data = file_get_contents($url);
// We decoden de JSON-string naar werkbare data. True is bedoeld om er een array van te maken, i.p.v. een object.
$json = json_decode($data,true);
// Even de data in een array tonen voor de handigheid tijdens het ontwikkelen.
echo "<pre>".print_r($json,true)."</pre>";
// Vanaf hier kan je bijvoorbeeld $json met foreach($json as $item) { ...} doorlopen zodat je elk los items in de loop kan opvragen om uiteindelijk te verwerken.
?>
Gewijzigd op 12/03/2020 10:55:23 door - Ariën -
Ik heb nu een een klein probleem met de omvorming van de datum naar een date - format.
Ik gebruik hiervoor de code strtodate() - functie. Maar ik krijg de datum 01/01/70 .
Hier is de huidige code:
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
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
<?php
// De URL met JSON-data die je wilt uitlezen
$url= "https://www.volleyadmin2.be/services/wedstrijden_xml.php?province_id=4&format=json&stamnummer=L-0923";
// We halen de data op
$data = file_get_contents($url);
// We decoden de JSON-string naar werkbare data. True is bedoeld om er een array van te maken, i.p.v. een object.
$json = json_decode($data,true);
// Even de data in een array tonen voor de handigheid tijdens het ontwikkelen.
//echo "<pre>".print_r($json,true)."</pre>";
echo "<table>";
foreach($json as $row)
{
echo "<tr>";
echo "<td>" . $row['Reeks'] . "</td>";
echo "<td>" . $row['Wedstrijdnr'] . "</td>";
$date = strtotime($row['t']);
echo "<td>" . date("d-m-Y",$date) . "</td>";
echo "<td>" . $row['t'] . "</td>";
echo "<td>" . $row['Aanvangsuur'] . "</td>";
echo "<td>" . $row['Thuis'] . "</td>";
echo "<td>" . $row['UitslagHoofd'] . "</td>";
echo "<td>" . $row['Bezoekers'] . "</td>";
echo "<td>" . $row['SporthalNaam'] . "</td>";
echo "<td>" . $row['UitslagHoofd'] . "</td>";
echo "</tr>";
}
echo "</table>";
// Vanaf hier kan je bijvoorbeeld $json met foreach($json as $item) { ...} doorlopen zodat je elk los items in de loop kan opvragen om uiteindelijk te verwerken.
?>
// De URL met JSON-data die je wilt uitlezen
$url= "https://www.volleyadmin2.be/services/wedstrijden_xml.php?province_id=4&format=json&stamnummer=L-0923";
// We halen de data op
$data = file_get_contents($url);
// We decoden de JSON-string naar werkbare data. True is bedoeld om er een array van te maken, i.p.v. een object.
$json = json_decode($data,true);
// Even de data in een array tonen voor de handigheid tijdens het ontwikkelen.
//echo "<pre>".print_r($json,true)."</pre>";
echo "<table>";
foreach($json as $row)
{
echo "<tr>";
echo "<td>" . $row['Reeks'] . "</td>";
echo "<td>" . $row['Wedstrijdnr'] . "</td>";
$date = strtotime($row['t']);
echo "<td>" . date("d-m-Y",$date) . "</td>";
echo "<td>" . $row['t'] . "</td>";
echo "<td>" . $row['Aanvangsuur'] . "</td>";
echo "<td>" . $row['Thuis'] . "</td>";
echo "<td>" . $row['UitslagHoofd'] . "</td>";
echo "<td>" . $row['Bezoekers'] . "</td>";
echo "<td>" . $row['SporthalNaam'] . "</td>";
echo "<td>" . $row['UitslagHoofd'] . "</td>";
echo "</tr>";
}
echo "</table>";
// Vanaf hier kan je bijvoorbeeld $json met foreach($json as $item) { ...} doorlopen zodat je elk los items in de loop kan opvragen om uiteindelijk te verwerken.
?>
mvg
Dit geeft gewoon: 10 December 2019.
Los van het probleem zou ik date() niet aanraden. Deze is niet eenvoudig om te latten naar een locale.
Gewijzigd op 12/03/2020 11:44:01 door - Ariën -
Volgens mij kan dit enkel als je het omzet naar een date, klopt dit?
Gewijzigd op 12/03/2020 12:18:42 door - Ariën -
Date (yyyy-mm-dd), datetime (yyyy-mm-dd hh:mm:ss) of timestamp inderdaad
Let wel op dat je voor Ariens voorbeeld de setlocale waarden moet setten.
En ten tweede @Arien, je gebruik het voorbeeld 12/10/2019 (maand-dag-jaar) maar in de json zijn ze opgeslagen als dag-maand-jaar en dat gaat dus fout.
Code (php)
Gewijzigd op 12/03/2020 17:30:31 door Michael -
Scherp!
Ik heb nu nog 1 probleem. Door de grote hoeveelheid data kan ik niet alles in een databank zetten.
Per keer moet er gezien worden of de wedstrijd al in de databank staat of niet.
Dus eerst moet er gezien worden bestaat de wedstrijd al of niet, daarna moet er ofwel een insert gebeuren ofwel een update.
Maar ik kan max een 1500 - tal rijen nakijken.
mvg,
Jenthe
Quote:
grote hoeveelheid data
Over hoeveel data hebben we het? Als ik dit op kan hoesten in een browser via bovenstaande link zou dit een peuleschil moeten zijn voor een database.
Quote:
Per keer moet er gezien worden of de wedstrijd al in de databank staat of niet.
Hiervoor zul je inderdaad een mechanisme moeten verzinnen, maar als alle informatie chronologisch wordt aangeleverd (en je er vanuit gaat dat er in het verleden geen informatie wordt toegevoegd) dan kun je een duidelijke rode streep trekken in deze lijst die de scheiding tussen "reeds bekend" en "nieuw" markeert. Elke keer als je een import draait zul je alles tot dit punt in moeten lezen in code en vervolgens moeten toevoegen in de database. Als je ook alles chronologisch opslaat in jouw database is dit een kwestie van het laatste record ophalen en dan alles tot dat punt binnentrekken.
Quote:
ofwel een update
Met bovenstaande strategie zul je nooit iets hoeven te updaten.
Quote:
Maar ik kan max een 1500 - tal rijen nakijken.
Waar komt deze limiet vandaan? Wat gaat er vervolgens mis? Het zou mogelijk moeten zijn om veel meer informatie in te lezen, tenzij je op (hele) goedkope shared hosting zit die hele strenge geheugenlimieten hanteert?
Ik kan mij ook niet voorstellen dat de datafeed alleen maar groeit, maar tegelijkertijd inspireert het custom formaat voor datums nou niet bepaald veel vertrouwen...
Gewijzigd op 13/03/2020 15:15:16 door Thomas van den Heuvel
Over het inserten/updaten. Je kunt ook gewoon INSERT IGNORE gebruiken icm een uniek veld bijv het wedstrijdnr. Als deze dan al bestaat dan wordt de insert genegeerd.
Het nadeel hiervan is, als er bijv een wedstrijd tijd verandert, dat deze niet wordt bijgewerkt, maar dat zelfde probleem heb je ook met de oplossing van Thomas.
Je zou ook kunnen kijken naar ON DUPLICATE UPDATE wederom met een uniek veld. Bestaat deze, update, bestaat deze niet, insert.
Edit:
Mocht het inserten echt een probleem zijn, kun je ook controleren op het veld "uitslaghoofd". Als deze is gevuld, is de wedstrijd gespeeld en ga er dan vanuit dat deze niet meer wijzigt.
Kun je de limiet van 1500 rijen eens uitleggen?
Gewijzigd op 14/03/2020 18:36:59 door Michael -
Ik zou hoe dan ook van (database-)transacties gebruik maken zodat je in ieder geval de garantie hebt dat alles in het geheel, of in het geheel niet wordt uitgevoerd. Niets is namelijk zo funest als half bijgewerkte data.