Toon posts:

[PHP] Komma slaat rest veld csv bestand over

Pagina: 1
Acties:

Vraag


  • Jasper_S1985
  • Registratie: Februari 2015
  • Laatst online: 12-01 19:10
Mijn vraag
Ik lees momenteel data uit een csv bestand in een MySQL database.
De database velden worden gescheiden door een ;
Als ik bij de prijs kom en deze boven de 1000 uitkomt gaat het fout. Deze getallen worden namelijk als 1,249.00 in het csv bestand gezet ( Dit kan ik niet aanpassen ik maak de csv bestanden niet )
In de database komt vervolgens 1 ipv 1249.00.

Met deze code lees ik het csv bestand uit.
code:
1
2
3
4
while (($emapData = fgetcsv($file, 1000, ";", '"')) !== FALSE) {
$sales_price_inc = $emapData[15];
// etc etc
}


Mij vraag is dus hoe zorg ik ervoor dat hij de , gewoon als string leest en niet het veld overslaat.


Relevante software en hardware die ik gebruik
PHP MYSQL

Beste antwoord (via Jasper_S1985 op 25-03-2021 14:46)


  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 13:54
Als je input altijd een komma heeft bij duizendtallen, en je weet dat het altijd zo is, kan je dat natuurlijk gewoon weghalen;
PHP:
1
$sales_price_inc = str_replace(',', '', $emapData[15]);

Alle reacties


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 29-03 23:37

Janoz

Moderator Devschuur®

!litemod

De vraag is voornamelijk waar dit gebeurt. Gebeurt het al in de fgetcsv, heb je ergens een cast, hoe ziet de insert query er uit, hoe zit je database er zelf uit. Zonder die informatie is niet te zeggen waar het mis gaat.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • Beste antwoord
  • 0Henk 'm!

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 13:54
Als je input altijd een komma heeft bij duizendtallen, en je weet dat het altijd zo is, kan je dat natuurlijk gewoon weghalen;
PHP:
1
$sales_price_inc = str_replace(',', '', $emapData[15]);

  • Jasper_S1985
  • Registratie: Februari 2015
  • Laatst online: 12-01 19:10
Het ging inderdaad op een andere plek mis dan dat ik dacht. In de insert query stond gewoon netjes 1,049.00 dus bij het schrijven naar de database ging het fout. In dat geval was de str_replace een makkelijke oplossing!
THX

  • Hydra
  • Registratie: September 2000
  • Laatst online: 16:31
Jasper_S1985 schreef op donderdag 25 maart 2021 @ 14:46:
Het ging inderdaad op een andere plek mis dan dat ik dacht. In de insert query stond gewoon netjes 1,049.00 dus bij het schrijven naar de database ging het fout.
Euh, sla je bedragen dan als string op? Hoe ziet je insert eruit (dus stukje PHP code)?

https://niels.nu


  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Hydra schreef op donderdag 25 maart 2021 @ 16:04:
[...]


Euh, sla je bedragen dan als string op? Hoe ziet je insert eruit (dus stukje PHP code)?
Zoals ik het lees, juist niet:

SQL:
1
INSERT INTO Foo (Bar, Baz) VALUES (1, 1,249.00)


Gezien de mededeling uit de TS:
In de database komt vervolgens 1 ipv 1249.00.
Al zou dat een fout moeten geven over een verschillend aantal kolommen? Of er wordt wel een query gebouwd met aanhalingstekens, waardoor z'n databaseserver de string omzet naar numeriek:
SQL:
1
INSERT INTO Foo (Bar, Baz) VALUES ('1', '1,249.00')

En door locale-instellingen wordt dat geparsed als 1,249 en afgerond naar de integer 1? Wat Janoz dus ook zegt:
Janoz schreef op donderdag 25 maart 2021 @ 14:33:
De vraag is voornamelijk waar dit gebeurt. Gebeurt het al in de fgetcsv, heb je ergens een cast, hoe ziet de insert query er uit, hoe zit je database er zelf uit. Zonder die informatie is niet te zeggen waar het mis gaat.
Anyhow, des te meer reden om prepared statements of een ORM te gebruiken, en niet zelf SQL-strings bij elkaar te harken met string formatting.

[Voor 50% gewijzigd door CodeCaster op 25-03-2021 16:10]

https://oneerlijkewoz.nl
I have these thoughts / so often I ought / to replace that slot / with what I once bought / 'cause somebody stole my car radio / and now I just sit in silence


  • Hydra
  • Registratie: September 2000
  • Laatst online: 16:31
CodeCaster schreef op donderdag 25 maart 2021 @ 16:05:
[...]

Zoals ik het lees, juist niet:

SQL:
1
INSERT INTO Foo (Bar, Baz) VALUES (1, 1,249.00)
Daarom dus, want bovenstaande zou gewoon heel hard een SQL error geven (ik ga er even vanuit dat dit niet zo'n MySQL 'quirk' is). Dus daarom vraag ik aan de OP wat 'ie nu precies doet.

https://niels.nu


  • Jasper_S1985
  • Registratie: Februari 2015
  • Laatst online: 12-01 19:10
Naja het ging dus niet fout in andere kolommen omdat het de laatste kolom was :)
Pagina: 1


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee