Import SQL

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Niels van K

Niels van K

13/12/2008 01:02:00
Quote Anchor link
Hoi,

Ik ben opzoek naar een scriptje / snippet om de SQL te importeren via PHP. Ik heb een string waar alle SQL inzit, wat opgevuld is door een formulier d.m.v. uploaden.

Ik dacht laat ik eens logisch nadenken, en het met

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$sql = explode(';', $sql);


Niet dus, want er komt b.v ook in de query's hetzelfde teken voor. Is er een manier om dit zonder al teveel werk aan de praat te krijgen?

Alvast bedankt,

Niels.
 
PHP hulp

PHP hulp

14/05/2024 06:39:21
 
Marco PHPJunky

Marco PHPJunky

13/12/2008 01:10:00
Quote Anchor link
Misschien heb je hier wat aan:

Linkje

Greets
 
Niels van K

Niels van K

13/12/2008 01:22:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$import_sql = mysql_real_escape_string($contents);
$import_result = mysql_query($import_sql) or die(mysql_error());


Hmm, zoiets heb ik al geprobeerd. Dan krijg je dus de volgende error:

"Got a packet bigger than 'max_allowed_packet' bytes"

Ik wil niets aan de serverinstellingen aanpassen eigenlijk. Het is echt een eis dat het via PHP gaat, niet via mysqldump of iets dergelijks.

Ik zat al te zoeken in de bron van phpmyadmin, maar daar word je ook niet veel wijzer van.

Bedankt voor je reactie!
 
Robert Deiman

Robert Deiman

13/12/2008 10:30:00
Quote Anchor link
@Niels v.k

Meestal als je meerdere query's gebruikt worden deze gescheiden door een ; en een ENTER. -> Dus je kan hem eventueel exploden op
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
';'.PHP_EOL


Het enige is weer wel:
Dit mag ook weer niet als dusdanig in je query zelf voorkomen, dan gaat het mis.
 
Niels van K

Niels van K

13/12/2008 12:04:00
Quote Anchor link
Ja inderdaad, dat probleem heb ik dus ook.

Heeft iemand nog een tip?

Ik ga even zoeken in de scripts van PHPmyadmin.

EDIT:

Ik dacht in eens aan zoiets:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
preg_split("/;$/", $import_sql);


Maar dan krijg ik maar een 2 delige array? (horen er minstens 35.000 te zijn)
Gewijzigd op 01/01/1970 01:00:00 door Niels van K
 

13/12/2008 14:17:00
Quote Anchor link
Werkt mysql_query($sql) niet gewoon?
 
Frank -

Frank -

13/12/2008 14:20:00
Quote Anchor link
Mathijs schreef op 13.12.2008 14:17:
Werkt mysql_query($sql) niet gewoon?
Niet met meerdere queries in 1 keer. En daar is hier sprake van, dat gaat dus niet lukken.
 

13/12/2008 14:49:00
Quote Anchor link
Och ja da's waar ook. Ik denk dat je het toch op de een of andere manier met Marco's oplossing aan de gang moet.
Ik vind het vreemd dat je een packet too large error krijgt, hoe lang is iedere regel dan eigenlijk / wat is je max_allowed_packet instelling.
 
Niels van K

Niels van K

14/12/2008 01:49:00
Quote Anchor link
De standaard instelling, namelijk 1MB. Dit kan ik niet verhogen i.v.m. verschillende redenen.

@pqFrank: Klopt, bestand bestaat uit ruim 30.000 queries...

"I guess it will NOT working, because of line can be much more than 2048 bytes, or it can be BLOB or another.."

Staat er in de mailing list (link Marco) voor het while scriptje, dit klopt dus ook.

Iemand anders nog een oplossing?
 
/home/joost

/home/joost

14/12/2008 09:26:00
Quote Anchor link
En als je 'm in een while lus gooit ?? word wel ietsies traag denk ik.....

Maar als je m dan verdeeld, telkens bij een ; en dan lijn voor lijn invoegen(vraag me niet hoe je t doet, ik probeer alleen beetje mee te denken...).


mvg Joost.
 
Frank -

Frank -

14/12/2008 09:29:00
Quote Anchor link
Kun je niet vanaf de commandline de query uitvoeren? Werkt 100 keer eenvoudiger en sneller.

Je hebt alleen wel toegang nodig...
 
Niels van K

Niels van K

14/12/2008 13:45:00
Quote Anchor link
@Joost: Een explode op de laaste ; is een idee.

Zoiets had ik:

preg_split("/;$/", $import_sql);

Krijg het alleen niet werkend.

@pqFrank: Ik heb toegang, het probleem is dat het multi-platform moet zijn.

Hoe krijg ik een explode op een ; aan het eind van een regel?
 
Joren de Wit

Joren de Wit

14/12/2008 13:51:00
Quote Anchor link
\n wordt in een regex ook gewoon als newline gezien, dus je zou zoiets kunnen proberen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
/;\n$/
 
Niels van K

Niels van K

14/12/2008 14:02:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
$import_sql = str_replace("\r\n", "\n", $contents);
$import_sql = str_replace("\r", "\n", $import_sql);
$import_sql = split("/;\n$/", $import_sql);
echo count($import_sql);


Even om te testen, krijg ik 1 terug. Dit moet ook niet mogelijk zijn?
 
Joren de Wit

Joren de Wit

14/12/2008 14:08:00
Quote Anchor link
Gebruik uiteraard wel preg_split() in plaats van split()...
 
Niels van K

Niels van K

14/12/2008 14:13:00
Quote Anchor link
Zelfde resultaat, vergeten erbij te vermelden. excuus.
 
Niels van K

Niels van K

14/12/2008 15:07:00
Quote Anchor link
Solved:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
set_time_limit(0);

                $import_sql = preg_split("/;[\n\r]+/", $import_sql);

                while (list($k, $v) = each($import_sql))
                {
                    if (trim($v) != "")
                    {

                        mysql_query($v);
                        if (mysql_error() != "")
                        {
                            $error = true;
                        }
                    }
                }
 
Arend a

Arend a

14/12/2008 15:35:00
Quote Anchor link
Voor postgresql heb ik hier een importer:
http://www.phphulp.nl/php/scripts/3/1431/
 
Niels van K

Niels van K

14/12/2008 15:54:00
Quote Anchor link
Nice, die hou ik in het achterhoofd. :)

Dit is MySQL, ik denk dat ik die daarmee niet kan gebruiken?
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.