Zoals ik het begrijp zit het in een stukje db_storage die simpelweg nergens voorkomt in de vraag.
Zoals ik het begrijp doet de functie printrijjsondecode iets van opslaan naar db, dan de resultaten terughalen uit db en dan die resultaten printen. Geen idee waarom er een complete roundtrip naar de db gebeurt (dat kan handiger als je de json al hebt, dan hoef je het enkel op te slaan en niet terug te halen want je hebt het al). Maar anders zie ik niet waar het fout kan gaan.
En in principe heeft met deze werkwijze cURL nog steeds een meerwaarde, want in je richting van je database moet je opgeven in welke charset je data gaat versturen, dan moet je wel eerst weten in welke charset je de data hebt om te weten of je er een gerichte iconv overheen moet gooien of niet. En cURL kan je die info vertellen terwijl file_get_contents dit niet doet.
In wezen zou je er een generiek iets (save webresult to db) van willen maken dan zou je iets als het volgende moeten hebben :
- Stel vast waarin je db het opslaat (eenmalig vastleggen over je hele project)
- Haal de webresult op en ga na wat de encoding van het webresult is (hier heb je dus cURL voor nodig)
- Als de webresult encoding gelijk is aan db encoding dan rechtstreeks doorblazen
- Als de webresult encoding anders is aan db encoding dan iconv en varianten gebruiken om gericht om te zetten en dan dat resultaat doorblazen
Zelf zou ik hem nog 1 stapje hoger zetten : Alle input die php ingaat moet gechecked worden en indien nodig met iconv omgezet worden naar utf-8 (of welke interne php-encoding je ook hanteert). En voor web kan je checken met cURL, voor files kan je checken op bijv een BOM (als die er is).
Dan weet je op elk moment in je script welke encoding je hebt en kan alles volgens hetzelfde protocol naar de database gaan. Alleen betekent het dat je een stukje framework moet schrijven wat file_get_contents overbodig maakt en file_get_contents nergens meer gebruiken.
Als je namelijk in de huidige opzet voor bijv een testje / een fix even de url op regel 3 vervangt door een lokale json file die toevallig iso-8859-2 opgeslagen is dan kan dat weer wat rariteiten opleveren bij enkele characters want er wordt nu blind vanuit gegaan dat het utf-8 is, of als de developer ipv utf-8 utf-16 op de json gaat zetten (twijfelachtig of het volgens de specs mag, maar technisch wel mogelijk) dan ga je ook weer rariteiten krijgen.
Valideer simpelweg altijd, maar dan ook echt altijd je input. Dat soort dingen heb ik door de jaren heen op de harde manier geleerd (denk aan een meerjaren rapportage maken en in verschillende jaren op verschillende plekken "rare" data zien (group by's die niet goed gingen, totalen die daardoor niet goed gingen etc etc etc) en dan gewoon eerst je nieuwe rapportage code gaan debuggen (die is toch nieuw en de data is oud) dan de database gaan bekijken en na x uur erachter komen dat de encodings niet overal kloppen, maar in 99,99% van de gevallen wel. In 1e instantie vluchtig de code bekijken en die gaat gewoon goed.
Dan maar eens de release notes afgaan of er bijv updates / rariteiten rond die periodes zijn geweest en er misschien daar iets fout bij is gegaan, nope.
Dan maar eens in je geheugen gaan graven of er iets speciaal was in die tijd (want ergens zit er een structurele fout), niet kunnen verzinnen dus maar even aan de invoerders van de data vragen of die weten of er iets speciaals was in die tijd, lege blikken terugkrijgen.
Dan nog wat werk erin steken maar uiteindelijk maar de data voor nu fixen en de case open laten staan.
Dan een half jaar van de verkoopleider te horen krijgen dat het weer spontaan optreed, dan na wederom lang uitzoeken / navragen te horen krijgen dat de boekhouder periodiek correcties kan uitvoeren via een niet 100% reguliere weg (management script / correctie script / etc) en dat hij dat ongeveer 1x per jaar doet.
Dat script erbij zoeken en kijken, ah daar mist de validatie in omdat sysbeheer het verstand heeft om te weten hoe ze data moeten opslaan voor import (en omdat het wel eens makkelijk kan zijn voor correcties etc)
Dan maar eens de procedure erbij pakken die de boekhouder gehad heeft, daar staat het keurig in dat het utf-8 moet zijn. Navragen bij boekhouder, te horen krijgen dat hij het van zijn voorganger heeft gekregen en dat hij eigenlijk nooit wist wat utf-8 betekende, maar voor zover hij kon zien ging het altijd goed dus vroeg hij het maar niet meer) En dan praat je dus over 1 niet 100% nagevolgde procedure en iets van 100 uur werk verspreid over een heleboel tijd om dat ding te vinden.
En dat is daarna (want we hadden interne urenverekening) weer een hele bitch-fight geworden over wie nou die 100 uur werk die toch geleverd was op zijn rekening zou nemen
Daar zijn een aantal lessen uit voortgekomen, maar 1 daarvan is : Altijd, altijd je input checken.