PHP en JSON

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jenthe Van Buggenhout

Jenthe Van Buggenhout

12/03/2020 10:20:48
Quote Anchor link
Hallo,

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
 
PHP hulp

PHP hulp

23/11/2024 09:24:33
 
- Ariën  -
Beheerder

- Ariën -

12/03/2020 10:53:52
Quote Anchor link
Op welk punt loop je precies vast?
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)
PHP script in nieuw venster Selecteer het PHP script
1
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.

?>
Gewijzigd op 12/03/2020 10:55:23 door - Ariën -
 
Jenthe Van Buggenhout

Jenthe Van Buggenhout

12/03/2020 11:26:54
Quote Anchor link
Bedank voor de reactie.
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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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.

?>


mvg
 
- Ariën  -
Beheerder

- Ariën -

12/03/2020 11:42:49
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$t
= "12/10/2019";
$date = strtotime($t);
echo strftime("%e %B %Y",$date);
?>


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 -
 
Jenthe Van Buggenhout

Jenthe Van Buggenhout

12/03/2020 11:47:21
Quote Anchor link
Oke op andere pagina's moet ik vb enkel de wedstrijden tonen die de komende 14dagen zijn.
Volgens mij kan dit enkel als je het omzet naar een date, klopt dit?
 
- Ariën  -
Beheerder

- Ariën -

12/03/2020 12:18:24
Quote Anchor link
Een timestamp bedoel je? Dat is wel het gemakkelijkst.
Gewijzigd op 12/03/2020 12:18:42 door - Ariën -
 
Michael -

Michael -

12/03/2020 17:29:56
Quote Anchor link
"Volgens mij kan dit enkel als je het omzet naar een date, klopt dit?"

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.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
setlocale(LC_ALL, 'nl_NL');
?>

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
setlocale(LC_ALL, 'nl_NL');
    
$date = '28/09/2019';
list($dag,$maand,$jaar) = explode('/', $date);

echo strftime("%A %e %B %Y", (new \DateTime($jaar.'-'.$maand.'-'.$dag))->getTimestamp());
// zaterdag 28 september 2019
?>
Gewijzigd op 12/03/2020 17:30:31 door Michael -
 
- Ariën  -
Beheerder

- Ariën -

12/03/2020 19:52:42
Quote Anchor link
Scherp!
 
Jenthe Van Buggenhout

Jenthe Van Buggenhout

13/03/2020 14:55:31
Quote Anchor link
Bedankt voor de info.

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
 
Thomas van den Heuvel

Thomas van den Heuvel

13/03/2020 15:14:18
Quote Anchor link
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
 
Michael -

Michael -

13/03/2020 17:51:46
Quote Anchor link
Ben inderdaad ook benieuwd hoe je aan 1500 rijen komt. De URL bevat maar 175 rijen en dit mag absoluut geen probleem zijn.

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 -
 
Thomas van den Heuvel

Thomas van den Heuvel

13/03/2020 19:33:38
Quote Anchor link
Weet ook niet hoe die infofeed over tijd groeit. Als je elke keer alles (eventueel weggooit en) insert gaat die operatie mogelijk ook steeds langer duren.

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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.