[php/mysql 4] LOAD DATA INFILE combineren met PHP variabele*

Pagina: 1
Acties:
  • 152 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo allen,

Is het mogelijk een query met LOAD DATA INFILE te combineren met een php variabele?

MySQL 4.1.14 en PHP 4.4.2.

Ik wil namelijk een csv bestand uitlezen met LOAD DATA INFILE , dit gaat prima, maar bij elke regel, wil ik voor 1 veld een waarde meegeven uit een php variabele. Kan dit wanneer ik gebruik maak van LOAD DATA INFILE?

Ik heb het volgende:

PHP:
1
2
3
4
5
6
7
8
9
$csvfile['tmp_name'] = str_replace("\\","/",$csvfile['tmp_name']);
$database->setQuery("LOAD DATA INFILE '" . $csvfile['tmp_name'] . "'
        INTO TABLE #__licentie_code
        FIELDS
          TERMINATED BY ';'
        LINES
          TERMINATED BY '\r\n'
        IGNORE 1 LINES");
$database->query();


Alvast bedankt.

Groeten,

Robert

[ Voor 3% gewijzigd door Verwijderd op 12-02-2007 23:07 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Als je even hier kijkt kun je je eigen vraag beantwoorden ;) (Zie het stukje [SET col_name = expr,...])
The SET clause can be used to supply values not derived from the input file.
blah...blah...blah...

[ Voor 41% gewijzigd door RobIII op 12-02-2007 18:51 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Potverdikkie 8)7

Ik heb MySQL 4.? dus ik had daar al gekeken, maar daar staat het net ff minder uitgebreid, maar het werkt! _/-\o_

Bedankt.

Voor de liefhebber, dit is het geworden:
PHP:
1
2
3
4
5
6
7
8
9
10
$csvfile['tmp_name'] = str_replace("\\","/",$csvfile['tmp_name']);
$database->setQuery("LOAD DATA INFILE '" . $csvfile['tmp_name'] . "'
        INTO TABLE #__licentie_code
        FIELDS
          TERMINATED BY ';'
        LINES
          TERMINATED BY '\r\n'
        IGNORE 1 LINES
        SET licentie_code_cat_id = " . $_POST['licentie_simulatie_id']. ";");
$database->query();

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb toch een probleempje waar ik ook niet uitkom met de manual van MySQL.com. Ik heb lokaal wel MySQL 5 draaien, maar op de server staat 4.1.14.

Ik krijg dus op de server een error 1064:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET licentie_code_cat_id = 1' at line 8 SQL=LOAD DATA LOCAL INFILE '/tmp/upload/phpBtdalR'
INTO TABLE jos_licentie_code
FIELDS
TERMINATED BY ';'
LINES
TERMINATED BY '
'
IGNORE 1 LINES
SET licentie_code_cat_id = 1

In de handleiding van versie 4.1 op MySQL.com zie ik wel de optie SET staan, maar die wordt niet toegepast zoals bij versie 5 volgens de handleiding zelf. In het commentaar onder aan de pagina staat wel een reactie van iemand die het soortgelijk toepast. Zie post "Posted by Remco Wendt on June 28 2006 10:00pm" in onderstaande link.

De manual van 4.1: http://dev.mysql.com/doc/refman/4.1/en/load-data.html

Ik hoop dat iemand mij kan vertellen hoe ik de query uit mijn vorige post werkend kan maken voor MySQL 4.14.

Alvast bedankt!

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op maandag 12 februari 2007 @ 22:39:
Zie post "Posted by Remco Wendt on June 28 2006 10:00pm" in onderstaande link.
Kijk nou eens verder dan je neus lang is, zoek eens op de volgende post van diezelfde meneer...
<hint: onderaan de pagina > ;)
Sorry I posted this comment on the mysql 5.x documentation page, not knowing that comments are shared between the different documentation pages of the mysql versions.
En lees dan meteen die post erboven.
Als je nou voortaan het versienummer in je topicstart vermeldt kun je je dit soort ellende al besparen en krijg je geen replies waar je niks aan hebt ;)

[ Voor 40% gewijzigd door RobIII op 12-02-2007 22:44 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
En in de complete syntax definitie zie je deze optie ook alleen bij 5.x. Je mag wel eerst van de syntax definitie uitgaan ipv comments.

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
RobIII schreef op maandag 12 februari 2007 @ 22:42:
[...]

Kijk nou eens verder dan je neus lang is, zoek eens op de volgende post van diezelfde meneer...
<hint: onderaan de pagina > ;)


[...]


En lees dan meteen die post erboven.
Als je nou voortaan het versienummer in je topicstart vermeldt kun je je dit soort ellende al besparen en krijg je geen replies waar je niks aan hebt ;)
Sorry. Ik was iets te enthousiast omdat ik iets gevonden had dat liet zien dat het moest werken.

Maaaaaar. Nu weet ik nog niet of het anders moet of helemaal niet kan met 4.1.14 en verder moet zoeken naar een oplossing, of ik aan de bel moet gaan trekken bij mijn provider...

Heb je misschien nog een hint? :)

En wat het versienummer betreft, dat past niet meer in het topicstart. :+

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op maandag 12 februari 2007 @ 22:51:
Sorry. Ik was iets te enthousiast omdat ik iets gevonden had dat liet zien dat het moest werken.

Maaaaaar. Nu weet ik nog niet of het anders moet of helemaal niet kan met 4.1.14 en verder moet zoeken naar een oplossing, of ik aan de bel moet gaan trekken bij mijn provider...
Ik denk dat laatste dus hè? Als het niet in de documentatie staat kan het (zeer waarschijnlijk) niet ;) Dat wordt overigens nog eens extra bevestigd door de foutmelding die je krijgt onder 4.x en niet onder 5.x.
Verwijderd schreef op maandag 12 februari 2007 @ 22:51:
En wat het versienummer betreft, dat past niet meer in het topicstart. :+
Waarom niet? Misschien niet in je topictitel omdat je die niet kunt wijzigen, maar je topicstart wel degelijk hoor ;) >> Afbeeldingslocatie: http://gathering.tweakers.net/global/templates/tweakers/images/icons/edit.gif Daarnaast is dat een beetje mosterd na de maaltijd he? Dat hoor je natuurlijk te doen op het moment dat je de topicstart post, niet 15 reacties later :+

[ Voor 14% gewijzigd door RobIII op 12-02-2007 22:58 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
In je voorbeeld mysql 5 query zet je dezelfde waarde van alle rijen, kan je dus bijna net zo goed met een update query regelen :P Als versie >= 5 dan stop je die regel met set in de query en anders een update.
[/quick n dirty fix]

Tip: het is wellicht handig om lokaal ook dezelfde versies te hebben, scheelt stress bij uploaden. ;)

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Voutloos schreef op maandag 12 februari 2007 @ 22:58:
In je voorbeeld mysql 5 query zet je dezelfde waarde van alle rijen, kan je dus bijna net zo goed met een update query regelen :P Als versie >= 5 dan stop je die regel met set in de query en anders een update.
[/quick n dirty fix]

Tip: het is wellicht handig om lokaal ook dezelfde versies te hebben, scheelt stress bij uploaden. ;)
Ik ga denk ik maar voor de dirty fix, want dan is hij meer compatible.
Maar ik heb in de tabel geen reference zoals een datum ofzo. Hoe kan ik een update op alleen de regels die ik net heb aangemaakt? Of is het misschien handiger om het csv bestand aan te passen?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op maandag 12 februari 2007 @ 23:20:
Ik ga denk ik maar voor de dirty fix, want dan is hij meer compatible.
Maar ik heb in de tabel geen reference zoals een datum ofzo. Hoe kan ik een update op alleen de regels die ik net heb aangemaakt? Of is het misschien handiger om het csv bestand aan te passen?
Als je het veld dat je niet importeert een default value van (bijvoorbeeld) NULL geeft dan kun je gewoon een update loslaten als:

SQL:
1
2
3
Update MyTable
Set SomeField = 12345
Where SomeField Is Null


Is het natuurlijk wel zaak dat je die na iedere import draait. En anders maak je een reference zoals (idd) een datetime veld of volgnummer ofzo :?

[ Voor 12% gewijzigd door RobIII op 12-02-2007 23:36 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
RobIII schreef op maandag 12 februari 2007 @ 23:25:
[...]

Als je het veld dat je niet importeert een default value van (bijvoorbeeld) NULL geeft dan kun je gewoon een update loslaten als:

SQL:
1
2
3
Update MyTable
Set SomeField = 12345
Where SomeField Is Null


Is het natuurlijk wel zaak dat je die na iedere import draait. En anders maak je een reference zoals (idd) een datetime veld of volgnummer ofzo :?
d:)b

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
$database->setQuery("LOAD DATA LOCAL INFILE '" . $csvfile['tmp_name'] . "'
        INTO TABLE #__licentie_code
        FIELDS
          TERMINATED BY ';'
        LINES
          TERMINATED BY '\r\n'
        IGNORE 1 LINES");       
$database->query();

$database->setQuery("UPDATE #__licentie_code
        SET licentie_code_cat_id = " . $_POST['licentie_simulatie_id'] . "
        WHERE licentie_code_cat_id = 0");
$database->query();


Works wonderfull. *O* Bedankt beide!!

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
En nu nog letten op mysql injection. :Y) $_POST is user input dus _altijd_ checken/escapen. ;)

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Voutloos schreef op dinsdag 13 februari 2007 @ 07:52:
En nu nog letten op mysql injection. :Y) $_POST is user input dus _altijd_ checken/escapen. ;)
Dank je wel. :)

Is het gebruiken van addslashes() voldoende?

PHP:
1
"SET licentie_code_cat_id = " . addslashes( $_POST['licentie_simulatie_id'] ) . " 

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op dinsdag 13 februari 2007 @ 11:26:
[...]


Dank je wel. :)

Is het gebruiken van addslashes() voldoende?

PHP:
1
"SET licentie_code_cat_id = " . addslashes( $_POST['licentie_simulatie_id'] ) . " 
Het is niet de bedoeling dat we je aan je handje blijven houden. Een beetje zelfwerkzaamheid kan geen kwaad; kijk voor de gein eens onze (uitgebreide) FAQ's door; Programming FAQ - PHP - 'Escapen' van quotes in queries?

[ Voor 8% gewijzigd door RobIII op 13-02-2007 11:49 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
RobIII schreef op dinsdag 13 februari 2007 @ 11:47:
[...]

Het is niet de bedoeling dat we je aan je handje blijven houden. Een beetje zelfwerkzaamheid kan geen kwaad; kijk voor de gein eens onze (uitgebreide) FAQ's door; Programming FAQ - PHP - 'Escapen' van quotes in queries?
Ja, sorry. Ik moet zelf wel wat meer uitzoeken. Het probleem is vaak dat ik wel weet wat het resultaat moet zijn. Maar dat ik niet weet dat er al een oplossing voor bedacht is. Mocht ik dat dan wel weten, dan weet ik niet hoe het heet. :? Dan wordt het ook weer zo lastig googlen.

Bedankt weer en tot de volgende keer. Doe maar snel op slot, anders kom ik met nog meer stomme vragen. :+

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op dinsdag 13 februari 2007 @ 12:07:
[...]


Ja, sorry. Ik moet zelf wel wat meer uitzoeken. Het probleem is vaak dat ik wel weet wat het resultaat moet zijn. Maar dat ik niet weet dat er al een oplossing voor bedacht is. Mocht ik dat dan wel weten, dan weet ik niet hoe het heet. :? Dan wordt het ook weer zo lastig googlen.
In dat geval is het misschien niet onverstandig om eens een tutorial (of twee, drie :P ) door te lopen. Zo leer je gaandeweg de juiste (doorgaans :+ ) terminologie en krijg je een betere feeling in welke richting je iets moet zoeken omdat je weet waar je het over hebt.
Verwijderd schreef op dinsdag 13 februari 2007 @ 12:07:
Bedankt weer en tot de volgende keer. Doe maar snel op slot, anders kom ik met nog meer stomme vragen. :+
Een slotje is niet nodig op een topic als je je oplossing hebt. Zie daarvoor ook onze faq betreffende topiceinde.
Opgelost betekent niet dat het topic daarna op slot moet.
:Y)

[ Voor 28% gewijzigd door RobIII op 13-02-2007 12:15 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1