Avatar billede lubker Nybegynder
07. juni 2006 - 23:04 Der er 39 kommentarer og
1 løsning

Kør flere lange querys på en gang.

Je har en sql-fil indeholdende mange querys, tilsvarende filen der kan eksporteres fra phpMyAdmin.

Hvordan kan jeg køre alle dem på en gang? Alle querys er overført til en variabel, som jeg nu gerne vil bearbejde. Har fosøgt med:

//Upload filen til tmp folderen
//Her skal filen flyttes fra
$tmpfil    = $_FILES['fil']['tmp_name'];

//Hvilken type fil arbejder vi med?
$ext    = strtolower(end(explode(".", $_FILES['fil']['name'])));

if ($ext == "sql"){
    if ($txt) {
      $fp = fopen($tmpfil,w);
      fputs($fp,$txt); 
      fclose($fp);
    }
    $fp = fopen($tmpfil,r);
    $txt = fread($fp,filesize($tmpfil)); 
    fclose($fp);


}

//Kør query
$p_query = $txt;
  $query_split = preg_split ("/;/", $p_query);
  foreach ($query_split as $command_line) {
  $command_line = trim($command_line);
  if ($command_line != '') {
    $query_result = mysql_query($command_line);
    if ($query_result == 0) {
      break;
    };
  };
  };
echo $query_result;


Desværre virker dette ikke helt efter planen.
For det første er det uhensigtsmæssigt bare at dele ved ; da der kan være et semikolon andre steder i filen.

Samtidig kører scriptet kun en del af queryerne.

Havde omkring 20 tabeller der skulle oprettes, men kun den første blev det.

Nogen der har et forslag?
Vil gerne have en god og stabil løsning tilsvarende phpMyAdmin's.
Avatar billede iss Novice
07. juni 2006 - 23:08 #1
Har du prøvet at kører det hele på en gang?
Avatar billede lubker Nybegynder
08. juni 2006 - 11:04 #2
Ja, som
mysql_query($txt);

Men tror ikke kommandoen mysql_query kan håndtere mere end een ad gangen. -> Det virkede i hvert fald ikke.
Avatar billede iss Novice
08. juni 2006 - 11:44 #3
Prøv:
<?php

$host = "host";
$user = "user"
$pass = "pass";
$filename = "file.sql"

echo "<br>".$filename;

$file = fopen($filename, 'r');
$data = array();
$i = 0;
while ($line = fgets($file)) {
    if (ereg('^--', $line)) {
        if ($data[$i] != '') {
            $i++;
            $data[$i] = '';
        }
    }
    else {
        $data[$i] .= $line;
    }
}

echo "*********************<br>";
print_r($data);
echo "*********************<br>";

$conn = mysql_connect($host, $user, $pass);
mysql_select_db($db, $conn);

$i = 0;
while (isset($data[$i])) {
    $data[$i] = explode(';', $data[$i]);
    $j = 0;
    while (isset($data[$i][$j])) {
        if (!empty(trim($data[$i][$j]))) {
            echo "++ Running *************<br>".$data[$i][$j]."<br>++ *******************<br>";
            mysql_query($data[$i][$j]);
            echo "<br><br>".mysql_error()."<br><br><br>";
        }
        else {
            echo "++ Skipping empty query\n";
        }
    $j++;
    }
$i++;
}

?>

Det er den jeg bruger...
Avatar billede lubker Nybegynder
08. juni 2006 - 12:13 #4
Jeg kan ikke får den til at virke.
Den er nu oppe på de første 5 tabeller, men ikke mere.
Så denne løsning er desværre heller ikke helt optimal - Eller også er det bare mig...
Avatar billede iss Novice
08. juni 2006 - 12:15 #5
Hvad sker der?
Avatar billede lubker Nybegynder
08. juni 2006 - 15:55 #6
Tja, har arbejdet lidt på det, og nået frem til at et direkte eksport fra PHP myadmin virker fint sammen med dit script.
Så problemet må jo ligge i min export. -> sjovt nok virker min almindelige export fil fint sammen med php-myadmin.
Avatar billede lubker Nybegynder
08. juni 2006 - 16:05 #7
Kan se mit exportscript har flere alternativer i forhold til den almindelige export fra phpmyadmin.

Nogen der har et godt script til denne export?
Avatar billede iss Novice
08. juni 2006 - 16:11 #8
mysql dump... det er det phpMyAdmin bruger..
Avatar billede lubker Nybegynder
08. juni 2006 - 16:13 #9
Er der bare en samlet komando til det?
Det var jeg slet ikke klar over.
Det vil jeg lige prøve.
Avatar billede iss Novice
08. juni 2006 - 16:19 #10
system("mysqldump --opt -h $host -u $bruger -p $kodeord $database | gzip > ".$database . date("Y-m-d-H-i-s") . '.gz');

Det er dump...

Men der er også:

SELECT * INTO OUTFILE 'filnavn.sql' FROM tabelnavn

Den kan også gå den anden vej hvis det hjælper dig:

LOAD DATA INFILE 'filnavn.sql' INTO TABLE tabelnavn
Avatar billede lubker Nybegynder
08. juni 2006 - 16:49 #11
Hvordan får jeg filen gemt på clienten i stedet for i en fil et eller andet sted på serveren?
- Vil helt undgå skriveadgang til mappen...
Avatar billede lubker Nybegynder
08. juni 2006 - 16:51 #12
hvis bare dumpet kunne placeres i en variabel istedet ville det være fint.
Avatar billede iss Novice
08. juni 2006 - 16:51 #13
Angiver sti til hvor du vil have den, ville være et godt sted...
Avatar billede lubker Nybegynder
08. juni 2006 - 16:53 #14
Ja, men der kan du jo ikke arbejde på clienten.
Avatar billede iss Novice
08. juni 2006 - 17:08 #15
Øhhh, kan du ikke angive en sti siger du????
Avatar billede lubker Nybegynder
08. juni 2006 - 17:09 #16
Jo, men ikke en sti på clienten.

Jeg har en scriptet liggende på min server, og ønsker i sidste ende .sql filen placeret op min egen computer.
Avatar billede iss Novice
08. juni 2006 - 17:16 #17
Så vil det andet heller ikke virker hvis din PHP og din SQL ikke ligger på samme maskine...
Avatar billede lubker Nybegynder
08. juni 2006 - 17:18 #18
Jeg har en server, med php og mysql og alt det der nu hører til.

Nu ønsker jeg at tage en backup af databasen og gemme den på min egen computer, og ikke bare et andet sted på serveren.

Da php er et server-script sprog, er det ikke muligt at gemme direkte på clienten, og jeg skal derfor bare have det udlæst på skærmen eller i en variabel.
Avatar billede iss Novice
08. juni 2006 - 17:24 #19
$output = system("mysqldump --opt -h $host -u $bruger -p $kodeord $database");

Men husk PHP kan ikke lave uendelige store variabler...
Avatar billede lubker Nybegynder
08. juni 2006 - 17:30 #20
hm.
output variabel forbliver desværre tom.
Avatar billede iss Novice
08. juni 2006 - 17:34 #21
Prøv med exec og så husk det kommer ud som et array.
Avatar billede lubker Nybegynder
08. juni 2006 - 17:46 #22
Som:
$output = exec(system("mysqldump --opt -h $host -u $bruger -p $kodeord $database"));
print_r($output); ik?
Avatar billede iss Novice
08. juni 2006 - 17:47 #23
F.eks...
Avatar billede lubker Nybegynder
08. juni 2006 - 17:48 #24
Warning: exec(): Cannot execute a blank command in E:\WEB\test\index.php on line 8
Avatar billede iss Novice
08. juni 2006 - 17:49 #25
Sorry... det er selvfølgelig exec istedet for system... troede det gav sig selv.
Avatar billede lubker Nybegynder
08. juni 2006 - 17:52 #26
Tja, det gør det nok også.
Desværre forbliver variablen tom.
Avatar billede iss Novice
08. juni 2006 - 17:55 #27
Noget siger mig at den bare giver fejl, fordi du ikke har mysqldump i din path... Skriv fuld sti til mysqldump...
Avatar billede lubker Nybegynder
08. juni 2006 - 17:56 #28
Lost...
Avatar billede iss Novice
08. juni 2006 - 17:59 #29
$output = system("/usr/bin/mysqldump --opt -h $host -u $bruger -p $kodeord $database");

Hvis mysqldump ligger i /usr/bin/.
Avatar billede fixxxer Nybegynder
08. juni 2006 - 18:02 #30
Skriv filen på serveren med OUTFILE og INFILE, som iss foreslår. Henvis derefter til den med header() og content-type: application/octet-stream.
Så kan du vælge hvor den skal gemmes.. Med mindre det er en automatisk backup?
Avatar billede lubker Nybegynder
08. juni 2006 - 18:03 #31
Jeg får da lært en hel del i dag, og ja min mysqldump ligger i den mappe, men variablen er desværre stadig tom.
Avatar billede lubker Nybegynder
08. juni 2006 - 18:04 #32
Det er ikke en automatisk backup, og bruger normalt header() til download.

Syntes bare ikke jeg kan få det til at virke med outfile, men vil da gøre endnu et forsøg.
Avatar billede lubker Nybegynder
08. juni 2006 - 18:05 #33
Outfile kan da forresten kun medtage en tabel.
Har en hel del af slagsen.
Avatar billede fixxxer Nybegynder
08. juni 2006 - 18:06 #34
/usr/bin/mysqldump findes vel næppe på en Windows?
Avatar billede lubker Nybegynder
08. juni 2006 - 18:07 #35
Det hele ligger på en linux server. -> som jeg hellere må nævne at jeg ikke selv administrerer 100%
Avatar billede fixxxer Nybegynder
08. juni 2006 - 18:07 #36
SHOW TABLES

loop over alle tabeller

SELECT * INTO OUTFILE '$table.sql' FROM $table
Avatar billede lubker Nybegynder
08. juni 2006 - 18:30 #37
Så kom der hul igennem.
Ligger i begge et svar?
Avatar billede iss Novice
08. juni 2006 - 18:41 #38
Nææææ
Avatar billede lubker Nybegynder
08. juni 2006 - 18:47 #39
Du skal i hvert fald have mange tak for hjælpen.
Du har jo næsten brugt hele dagen på det.
Avatar billede lubker Nybegynder
24. august 2006 - 10:08 #40
Lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester