[PHP / MySQL]Automatisch grote tabel vullen (4MB)

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

Acties:
  • 0 Henk 'm!

  • wustenveld
  • Registratie: Februari 2002
  • Laatst online: 07-07 13:36
Ik ben een module aan het schrijven voor online documentatie. Ik heb 2 SQL files die ongeveer 4MB per stuk zijn. Nu wil ik een script schrijven dat als je het sql bestand in een map neerzet dat deze wordt gedetecteerd door de applicatie en automatisch in de database geplaatst wordt. Hoe kan ik dit het beste aanpakken, het gaat om een boek (de Bijbel) waar vertalingen dus als losse extensies bij komen en gekoppeld kunnen worden aan het systeem.
Nu moet je nog echt inloggen op de mysql server om vervolgens het sql bestand te laten runnen maar ik wil dat dus automatisch, en het liefst op zo'n manier dat de gebruiker kan bepalen in welke tabel de data moet komen.

Ideeën????

Acties:
  • 0 Henk 'm!

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 01-09 11:48
[onzin]Dit gaat niet goed werken altijd[/onzin]Ff denken hoor

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:16
Hoe bedoel je ? Wat bedoel je met 'SQL files imprteren in de databank'? Zijn dat bestanden met SQL scripts die moeten uitgevoerd worden?

Je kan op regelmatige tijdstippen controleren of dat bepaald bestand in die bepaalde directory staat, en als het er staat kan je het bestand laten uitvoeren/inlezen...

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • wustenveld
  • Registratie: Februari 2002
  • Laatst online: 07-07 13:36
Op woensdag 26 juni 2002 11:35 schreef whoami het volgende:
Hoe bedoel je ? Wat bedoel je met 'SQL files imprteren in de databank'? Zijn dat bestanden met SQL scripts die moeten uitgevoerd worden?

Je kan op regelmatige tijdstippen controleren of dat bepaald bestand in die bepaalde directory staat, en als het er staat kan je het bestand laten uitvoeren/inlezen...
Het zijn inderdaad bestanden met sql scripts (insert commando's). Alleen mag de tabelnaam niet door dit script bepaald worden en de database naam ook niet. Het moet namelijk draaien binnen een module voor Postnuke die ik aan het schrijven ben. De benamingen van de database en het eerste stuk van de tabelnaam zijn bepaald door de webmaster van de postnuke website. Deze moeten dus uit het postnuke systeem gehaald worden. Nu kan ik alle sql regels wel in php gaan zetten met de tabelnaam die postnuke eist binnen het systeem maar dan krijg je een php script van 4 MB. Dus dat gaat volgens mij ook niet werken.

Verder mag het script pas draaien als de gebruiker daar toestemming voor geeft, dus wanneer je vanuit het beheerdersgedeelte van de postnuke site zegt, boek inladen.

Acties:
  • 0 Henk 'm!

Verwijderd

Wanneer data zo'n grote omvang hebben (4mb), zou ik er voor kiezen alles in een csv file te stoppen. Dat scheelt behoorlijk in de overhead van alle inserts.

Verder loop je tegen het probleem van timeouts aan.
Je kunt voor elke insert de timeout op 2 seconden zetten, zodat normale inserts geen timeout geven, hoeveel je er ook doet.

Acties:
  • 0 Henk 'm!

  • wustenveld
  • Registratie: Februari 2002
  • Laatst online: 07-07 13:36
Op woensdag 26 juni 2002 12:19 schreef peidor het volgende:
Wanneer data zo'n grote omvang hebben (4mb), zou ik er voor kiezen alles in een csv file te stoppen. Dat scheelt behoorlijk in de overhead van alle inserts.

Verder loop je tegen het probleem van timeouts aan.
Je kunt voor elke insert de timeout op 2 seconden zetten, zodat normale inserts geen timeout geven, hoeveel je er ook doet.
Ja dat is wel een goede die CSV maar hoe kan ik met php elke regel van de CSV uitlezen om deze vervolgens in een INSERT commando te knallen.

Die timeout is wel een cool idee, dan zou ik ook nog aan de hand van het aantal regels in het CSV bestand kunnen aangeven hoe lang de update ongeveer gaat duren.

Acties:
  • 0 Henk 'm!

  • Apollo_Futurae
  • Registratie: November 2000
  • Niet online
Je kunt met behulp van LOAD DATA LOCAL INFILE een csv-file in een MySQL DB INSERTen.

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[FIELDS
[TERMINATED BY '\t']
[[OPTIONALLY] ENCLOSED BY '']
[ESCAPED BY '\\' ]
]
[LINES TERMINATED BY '\n']
[IGNORE number LINES]
[(col_name,...)]

voor meer info: http://www.mysql.com/documentation/ (lijkt op dit moment down te zijn, maar ja)

Pas de replâtrage, la structure est pourrie.


Acties:
  • 0 Henk 'm!

  • pietje63
  • Registratie: Juli 2001
  • Laatst online: 22:13

pietje63

RTFM

phpmyadmin een beetje modden zodat je sql files kunt plakken/uploaden?

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!


Acties:
  • 0 Henk 'm!

Verwijderd

Op donderdag 27 juni 2002 10:57 schreef pietje63 het volgende:
phpmyadmin een beetje modden zodat je sql files kunt plakken/uploaden?
DAT KAN STANDAARD AL, maar met zulke grote loopt je script vast... naja ik snap ook wel dat je geen 4 mb door je http wil pompen...

Acties:
  • 0 Henk 'm!

  • wustenveld
  • Registratie: Februari 2002
  • Laatst online: 07-07 13:36
Dat load data infile is wel een goed idee, maar is het ook mogelijk om dat commando vanuit een webinterface op te starten. Ik zoek dus iets dat je vanuit de browser opdracht geeft voor een actie die vervolgens op de achtergrond op de server wordt uitgevoerd. Het bestand staat dan al op de server in een vooraf gedefinieerde map en de browser moet een opdracht naar de server sturen om alles in te lezen.

Met load data infile moet je achter de console of telnet zitten om het bestand in te lezen, en dat is niet wat ik zoek. En phpmyadmin stuurt alles over de http en dat is niet echt handig ivm time-outs, snelheid enz.

Acties:
  • 0 Henk 'm!

  • SilentThunder
  • Registratie: September 2001
  • Laatst online: 18-09 09:24
Op donderdag 27 juni 2002 12:36 schreef wustenveld het volgende:
Dat load data infile is wel een goed idee, maar is het ook mogelijk om dat commando vanuit een webinterface op te starten. Ik zoek dus iets dat je vanuit de browser opdracht geeft voor een actie die vervolgens op de achtergrond op de server wordt uitgevoerd. Het bestand staat dan al op de server in een vooraf gedefinieerde map en de browser moet een opdracht naar de server sturen om alles in te lezen.

Met load data infile moet je achter de console of telnet zitten om het bestand in te lezen, en dat is niet wat ik zoek. En phpmyadmin stuurt alles over de http en dat is niet echt handig ivm time-outs, snelheid enz.
zoek dan es in de documentatie ofzo?

of probeer via een shell command die zooi te importeren

Canon EOS 40D | Canon EF-S 10-22mm F/3.5-4.5 USM | Tamron 17-50mm F/2.8 | Canon EF 50mm F/1.8 II | Canon EF 70-200mm F/4L IS USM | Speedlite 430EX


Acties:
  • 0 Henk 'm!

  • wustenveld
  • Registratie: Februari 2002
  • Laatst online: 07-07 13:36
Op donderdag 27 juni 2002 12:51 schreef SilentThunder het volgende:

[..]

zoek dan es in de documentatie ofzo?

of probeer via een shell command die zooi te importeren
Ik ben ook bezig om documentaties door te zoeken, ik zit hier niet stil te wachten op een antwoord via tweakers. Maar het is wel zo dat als je met meer mensen nadenken, zoekt of wat dan ook dat er sneller een oplossing komt. Daarnaast vind ik het persoonlijk wel een interessante case en misschien iemand anders ook wel.

Acties:
  • 0 Henk 'm!

  • wustenveld
  • Registratie: Februari 2002
  • Laatst online: 07-07 13:36
Ik denk dat ik wel iets weet, theoretisch dan, maar nu nog de uitvoering. Achter de console wil ik niet zitten om een bestand in te lezen en die tip van CSV en load data infile ook. Nu zit ik te denken om hier een batch bestandje van te maken die op de linux server komt te draaien. Ik zou alleen niet weten hoe dat moet. Ik heb alle data van een tabel nu in een CSV bestand zitten en die moeten in een tabel geplaatst worden die door een PHP script bepaald wordt. De naam van de tabel wordt namelijk vooraf bepaald door de gebruiker van Postnuke. Is het mogelijk om via de functie EXEC() in php dat batch bestand op te roepen met als variabele de tabelnaam om vervolgens dmv van zo'n batch bestand alle data in de tabel te knallen ??? En zo ja, hoe schrijf ik een batch script, moet dat in perl ofzo (zoiets ben ik net tegengekomen op het net). Als iemand iets weet hoor ik het graag, ik ga ondertussen gewoon door met zoeken.

Acties:
  • 0 Henk 'm!

  • wustenveld
  • Registratie: Februari 2002
  • Laatst online: 07-07 13:36
Met het volgende commando kan ik een csv in een keer inlezen: mysqlimport test testbestand.csv -u gebruiker --password=wachtwoord

Dit commando zou ik dus kunnen oproepen via een EXEC commando, maar .... De tabel in de database test moet testbestand heten. Dus zou ik van te voren het bestand moeten hernoemen (dat is ook geen probleem gewoon via exec het commando rename uitvoeren) maar de naam van het bestand moet wel door het postnuke systeem gegenereerd worden.

Iemand ideeën ??
Ik zoek weer verder ;)

Hmmmmz, ik kan natuurlijk ook de tabel testbestand hernoemen naar de juiste naam die door postnuke gewenst is.
Nou in ieder geval bedankt voor de hulp ik ga testen en ik laat het wel weten als het is gelukt.

Acties:
  • 0 Henk 'm!

  • wustenveld
  • Registratie: Februari 2002
  • Laatst online: 07-07 13:36
Uhm, waarom kan ik mysqlimport niet uitvoeren met EXEC. Als ik EXEC("mysqlimport") doe dan laat ie wel wat zien maar als ik het volledige commando geef geeft ie geen waarde terug en er gebeurt ook niks :?

Wie weet dit?? Is er uberhaubt wel iemand die dit leest eigenlijk :P

Acties:
  • 0 Henk 'm!

  • wustenveld
  • Registratie: Februari 2002
  • Laatst online: 07-07 13:36
Op donderdag 27 juni 2002 14:35 schreef wustenveld het volgende:
Uhm, waarom kan ik mysqlimport niet uitvoeren met EXEC. Als ik EXEC("mysqlimport") doe dan laat ie wel wat zien maar als ik het volledige commando geef geeft ie geen waarde terug en er gebeurt ook niks :?

Wie weet dit?? Is er uberhaubt wel iemand die dit leest eigenlijk :P
Bedankt voor de hulp maar ik ben er uit.
Zie hieronder:

[script]
$dbuser = "gebruiker";
$dbpwd = "wachtwoord";
$database = "database";
$sourcelocatie = "./extensions/";
$sourcebestand = $sourcelocatie . $naam . ".csv";

--- Hier wordt een tabel gecreeerd, ga ik niet intikken, is gewoon een sql commando ---

$uitvoer = exec("mysqlimport " . $database . " " . $sourcebestand . " -u " . $dbuser . " --password=" . $dbpwd);

--- Hier wordt de tabel hernoemd naar de juiste naam ---

Op deze manier werkt het, het werkte eerst niet omdat geen volledig path opgaf en nu doe ik dat wel. 53000+ records binnen 1 seconde in MySQL geknald.

Bedankt voor het meedenken iedereen, anders was ik dus echt niet tot deze oplossing gekomen.

Acties:
  • 0 Henk 'm!

Verwijderd

Nog even een post-oplossing-thought:

Je kunt ook een script schrijven (PHP, Perl) dat de SQL-file opent én een pipe naar MySQL. Vervolgens lees je een regel uit de SQL-file, vervangt op iedere regel (ereg_replace of str_replace) de tabel- en databasenaam door de juiste en vervolgens stuur je de regel door naar de pipe.
Zo moet je volgens mij een scriptje kunnen bouwen dat alles als het ware transparant doorsluist maar wél net even alles naar de reële waarden zet.

Acties:
  • 0 Henk 'm!

  • wustenveld
  • Registratie: Februari 2002
  • Laatst online: 07-07 13:36
Op donderdag 27 juni 2002 18:43 schreef wijnolst het volgende:
Nog even een post-oplossing-thought:

Je kunt ook een script schrijven (PHP, Perl) dat de SQL-file opent én een pipe naar MySQL. Vervolgens lees je een regel uit de SQL-file, vervangt op iedere regel (ereg_replace of str_replace) de tabel- en databasenaam door de juiste en vervolgens stuur je de regel door naar de pipe.
Zo moet je volgens mij een scriptje kunnen bouwen dat alles als het ware transparant doorsluist maar wél net even alles naar de reële waarden zet.
Even de laatste oplossing, mijn eerdere oplossing werkt niet bij alle providers omdat niet iedereen toe staat om een executable te starten op de webserver.

[php script]
// opbouw csv:
// boekhoofdstuk vers tekst
$regel = 1;
if (is_readable($sourcebestand)) {
$fd = fopen ($sourcebestand, "r" );
while ($buffer = fgetcsv($fd, 8000, "\t")) {
$num = count($buffer);
$row++;
$insertcom = "INSERT INTO " . $echtenaam . "
(boek,hoofdstuk,vers,tekst) VALUES (";
for ($c=0; $c<$num; $c++) {
if ($c!=0) $insertcom .= ",";
$insertcom .= "'" . str_replace("'","''",$buffer [$c]) . "'";
}

$insertcom .= ")";
$uitvoer = $dbconn->Execute($insertcom) or DIE($dbconn->ErrorMsg());
}
fclose ($fd);
}
[/phpscript]

Puur ter informatie dus
Pagina: 1