[MySQL/PHP] Insert into ... vaag probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Zaagmans
  • Registratie: Januari 2000
  • Laatst online: 17-09 14:56
Ik wil een CSV bestand gebruiken als databestand voor het vullen van een MySQL database. De hostingprovider staat geen LOAD DATA INFILE toe met als gevolg dat ik het op de onderstaande manier doe.

Ik haal zowel de veldnamen als de data uit een csv bestand middels het onderstaande (dit voorbeeld is voor de veldnamen):
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
  $handle = fopen ("dump.csv","r");
    while ($data = fgetcsv ($handle, 15000, ";")) {       
      $num = count($data);        
        $col=$col." (";
        for ($c=0; $c<$num-1; $c++) { //tot de laaste -1 met comma erachter
        $col = $col."`".trim($data[$c])."`,";
        }
        if ($c=$num-1){ //de laatste zonder comma
          $col=$col."`".trim($data[$c])."`)";
        }
    }
  fclose ($handle);
//echo $col --> (`veldnaam1`,`veldnaam2`,etc);


Vervolgens gebruik ik de informatie uit het CSV bestand om een query aan te maken.
PHP:
1
2
$sql="INSERT INTO `tabel` ".$col." VALUES (`waarde1`,`waarde2`,`waarde3`,`waarde4`);"
//echo $sql --> INSERT INTO `tabel` (`veldnaam1`,`veldnaam2`,`veldnaam3`,`veldnaam4`) VALUES (`waarde1`,`waarde2`,`waarde3`,`waarde4`);


Nu komt het vage!

Bij het uitvoeren van de query geeft mysql admin de volgende fout:
code:
1
2
3
4
 MySQL said:

Unknown column 'veldnaam2 ' in 'field list'
                         ^

Let vooral op de SPATIE die achter de waarde wordt neergezet!
Zowel in de dump.csv als in de query staat er geen spatie achter de veldnaam, maar uiteindelijk 'ziet' de mysql admin wel een spatie?! 8)7

Ik ben echt radeloos... ik kan er niet achter komen waarom er nou een spatie wordt neergezet. Omdat de veldnaam dus niet overeenkomt met die in de database wil de gehele query niet werken. Helaas heb ik te maken met een kleine 200 kolommen met data dus dat wil ik graag niet handmatig gaan lopen nakijken.

Heeft iemand dit vaker meegemaakt? Zo ja, wat was je gekozen oplossing?

- Ruud


Acties:
  • 0 Henk 'm!

  • 4Real
  • Registratie: Juni 2001
  • Laatst online: 14-09-2024
http://www.php.net/trim() :)

[ Voor 17% gewijzigd door 4Real op 24-05-2004 15:25 ]


Acties:
  • 0 Henk 'm!

  • JayVee
  • Registratie: Mei 2002
  • Laatst online: 31-08 10:22

JayVee

shibby++!

Laat php eens je $cols uitprinten, kijken wat daar in staat. En print $sql eens.
Je kan ook een voorbeeld query eens handmatig invoeren met pma om te kijken of het wel wil.

ASCII stupid question, get a stupid ANSI!


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ik zal wel te simpel denken, maar als je de oorzaak niet kan vinden, dan kun je het gevolg aanpakken. Kun je niet gewoon spaties strippen uit de veldnamen met een simpele replace opdracht?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
Zowel in de dump.csv als in de query staat er geen spatie achter de veldnaam,
@NMe84: Gaat zo moeilijk als die er niet instaan.

Een oplossing zou kunnen zijn om de ` om de veldnamen heen weg te halen.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Shadowman schreef op 24 mei 2004 @ 15:28:
[...]

@NMe84: Gaat zo moeilijk als die er niet instaan.
Ze staan er toch blijkbaar echt in. En wat erin staat kun je eruit filteren. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
NMe84 schreef op 24 mei 2004 @ 15:31:
[...]

Ze staan er toch blijkbaar echt in. En wat erin staat kun je eruit filteren. :P
Ik zie ze niet bij die echo staan :P. Ik denk dat het eerder en nietvisueel teken is dat door mysql of phpmyadmin ergens naar een spatie wordt omgezet ofzo :?.

Verder doet trim() (zie 4Reals reply) hetzelfde (en meer :P) als wat jij voorstelde :).

offtopic:
@NMe84: Een simpele replace zei je :+.
edit:
trim doet alleen de laatste whitespaces :+

[ Voor 14% gewijzigd door Shadowman op 24-05-2004 17:47 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Shadowman schreef op 24 mei 2004 @ 15:36:
[...]

Ik zie ze niet bij die echo staan :P. Ik denk dat het eerder en nietvisueel teken is dat door mysql of phpmyadmin ergens naar een spatie wordt omgezet ofzo :?.

Verder doet trim() (zie 4Reals reply) hetzelfde (en meer :P) als wat jij voorstelde :).
offtopic:
Ik heb nergens gezegd welke functie TS moet gebruiken, voor hetzelfde geld doelde ik op trim(). ;)

edit:
trim() replacet ook. :+

[ Voor 4% gewijzigd door NMe op 24-05-2004 16:46 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Zaagmans
  • Registratie: Januari 2000
  • Laatst online: 17-09 14:56
Zoals jullie oplettende blik ;) wel heeft opgevangen gebruik ik al TRIM, bekijk de code nog maar eens goed. (REGEL 6/9 eerste php codeblok)

- Ruud


Acties:
  • 0 Henk 'm!

  • Zaagmans
  • Registratie: Januari 2000
  • Laatst online: 17-09 14:56
Shadowman schreef op 24 mei 2004 @ 15:28:
[...]

@NMe84: Gaat zo moeilijk als die er niet instaan.

Een oplossing zou kunnen zijn om de ` om de veldnamen heen weg te halen.
DE `staat er omdat ik dus ook veldnamen heb als deze: CLIENT FIRST TELEPHONE NUMBER

etc.

Vandaar dat ik er ` omheen zet omdat er (niet door mij!!) gekozen is om spaties te gebruiken in kolomnamen....

[ Voor 4% gewijzigd door Zaagmans op 24-05-2004 16:46 ]

- Ruud


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Zaagmans schreef op 24 mei 2004 @ 16:45:
[...]

DE `staat er omdat ik dus ook veldnamen heb als deze: CLIENT FIRST TELEPHONE NUMBER

etc.

Vandaar dat ik er ` omheen zet omdat er (niet door mij!!) gekozen is om spaties te gebruiken in kolomnamen....
Spaties in kolomnamen is sowieso al niet zo handig, maar dat terzijde. :)

Heb je al eens gekeken of het echt een spatie is, of misschien een ander teken zoals Shadowman al suggereerde?

En dat ik die trim niet gezien heb in je functie wijt ik aan...euhm...hmm...ik kan niemand de schuld geven. :+

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

sjoerdb schreef op 24 mei 2004 @ 16:49:
code:
1
$col=$col." (";


zo komen er toch spaties in lijkt me?
Als je goed kijkt zie je dat het probleem zit in de veldnamen, en niet daar. :+

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • jpeeters
  • Registratie: Januari 2002
  • Laatst online: 19:22
Volgens mij moet er op regel 8 een dubbele == staan. Ik weet niet of dit het probleem zal oplossen, zover heb ik nog niet gekeken, maar het is zeker een fout :)

Acties:
  • 0 Henk 'm!

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 16-08 17:16
blowy schreef op 24 mei 2004 @ 16:52:
Volgens mij moet er op regel 8 een dubbele == staan. Ik weet niet of dit het probleem zal oplossen, zover heb ik nog niet gekeken, maar het is zeker een fout :)
Kijk eens beter, het zal (toevallig!) goed gaan zolang $num > 0.

Aan de TS, zit er toevallig een vertical tab (^M) in je data? Deze wordt er door trim() niet uitgehaald namelijk. Het is ofwel deze, ofwel een ander niet-zichtbaar karakter dat niet door trim() wordt gefilterd dat de ellende veroorzaakt.

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Acties:
  • 0 Henk 'm!

Verwijderd

Wanneer er een spatie in de kolomnaam zit kun je 's proberen om een '_' (underscore) te gebruiken.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

bigtree schreef op 24 mei 2004 @ 17:14:
[...]
Kijk eens beter, het zal (toevallig!) goed gaan zolang $num > 0.
Nee hoor, die regel 8 gaat altijd lukken omdat een toekenning altijd op true evalueert. Er zou wel degelijk een vergelijking (==) moeten staan ipv een toekenning (=).

@AMDinc: Ik weet niet hoeveel velden TS heeft in zijn database, en hoeveel regels in zijn scripts gebruik maken van die bepaalde veldnamen, maar hernamen is altijd een bezigheid die veel ellende met zich meebrengt. Helemaal als er veel veranderd moet worden...

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Zaagmans
  • Registratie: Januari 2000
  • Laatst online: 17-09 14:56
Het aanpassen van de veldnamen is gewoon onmogelijk. Ik krijg een dump uit een database van een door een ander bedrijf gemaakt programma. Oftewel de data die ik krijg is niet aan te passen. Dat vergt zo veel aanpassingen dat je er naar van wordt. (ongeveer 190 kolommen). Mijn keuze was ook geweest om _ te gebruiken i.p.v. een spatie. Het zij zo helaas....

Die == had ik over het hoofd gezien :o

Ik zal nog wel even op zoek gaan....

@Bigtree: hoe kan ik zien of er ^M staat? Enig idee?

- Ruud


Acties:
  • 0 Henk 'm!

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 16-08 17:16
Zaagmans schreef op 25 mei 2004 @ 08:51:

@Bigtree: hoe kan ik zien of er ^M staat? Enig idee?
Check de comments van fgetcsv.

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Acties:
  • 0 Henk 'm!

  • Zaagmans
  • Registratie: Januari 2000
  • Laatst online: 17-09 14:56
Heeft niks geholpen. Ik filter alle ASCII tekens eruit totdat er letters komen en nog steeds komt ie met een veldnaam met een spatie erachter, terwijl de query geen spatie voorkomt bij de veldnaam.

Ik lees dus een csv bestand uit. Misschien als ik het gewoon als txt bestand opsla dat het dan beter werkt?

De csv wordt gemaakt op een windows machine. De csv wordt ingelezen op een linux machine...

[update]
Ik heb nu getracht middels fget het bestand regel voor regel in te lezen. Vervolgens middels explode de string uit elkaar te halen en dan in de database in te lezen.
Dit werkt deels. Nu leest het script 222 records in de database, maar er staan meer dan 650 records in het csv bestand... 8)7

[ Voor 21% gewijzigd door Zaagmans op 26-05-2004 10:56 ]

- Ruud


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Dan heb je waarschijnlijk last van newline tekens. \n of \r zul je moeten weghalen.

Regeren is vooruitschuiven

Pagina: 1