Avatar billede jjdk Nybegynder
23. februar 2007 - 08:06 Der er 24 kommentarer og
1 løsning

Hent MySQl og gem i komma-fil

Hej.
Jeg har brug for at hente nogle poster i en Mysql-fil, og gemme dem i en komma-sepereret fil til brug i et økonomisystem.
Nogle der har forslag til dels udtrækket, hvordan det gemmes som en komma-fil??
Avatar billede straszek Praktikant
23. februar 2007 - 09:13 #1
Jeg gør sådan:

    $sqlsc = mysql_query("DIN SELECT") or die(mysql_error());
$file = "dintekst.txt";


while ($row = mysql_fetch_array($sqlsc)) {



$str .= "$row[xxx]; Att: $_POST[yyy]; $adr; $row[zzz]; $row[zyx]\n";


}



$fp = fopen($file,"w");
fwrite($fp, $str);
fclose($fp);
}
Avatar billede jjdk Nybegynder
23. februar 2007 - 09:39 #2
Jamen - det skal da prøves.
Avatar billede straszek Praktikant
23. februar 2007 - 09:57 #3
der har sneget sig en $_POST[yyy] ind det skal være en $row[yyy] og semikolon, kan du bare ændre til komma eller hvad dit system nu bruger.
Avatar billede jjdk Nybegynder
23. februar 2007 - 10:01 #4
Tak for dit udmærkede eksempel, hvor du giver flere eksempler på, hvordan $str kan sættes.
Men jeg har ikke formuleret mig tydeligt nok - beklager.
Din løsning viser hvordan man gemmer en tekst-fil på serveren.
Kan du nemt vise, hvordan man gør, hvis den skal gemmes på den lokale PC - altså hvor der popper en dialogboks op, hvorfra man kan gemme.
Skal der ikke sættes et komma mellem hvert felt, og hvad skal sættes mellem hver post? 
Og endelig, hvis der er et komma som feltindhold i et af felterne, skal det så ændres til et "special karakter".
Avatar billede straszek Praktikant
23. februar 2007 - 10:09 #5
Om filen kan downloades direkte afhænger af browser/server opsætning, du kan gøre det på 2 måder.

1:du kan bare lave et link til filen <a href=dintekst.txt>blabla</A>

2: Du kan i starten af dit script lave en header("location:dintekst.txt");

du bestemme er selv hvad der skal stå mellem posterne. Hvis der er komme i feltindholdet er det nok en god ide at ændre disse til specialkarakter eller indkapsle posterne f.x.

$str .= "\"$row[xxx]\", \"$row[yyy]\" \n";
Avatar billede jjdk Nybegynder
23. februar 2007 - 10:31 #6
Tak for dine forslag med link og header.
Link funktionen er jeg ked af, og Header er jeg ikke med på.
Der må da være en funktion, som gør at man kan gemme filen lokalt. Jeg har bla. en backupfil, som tager dump af alle MySQL tabeller. Når jeg klikker på denne fil, popper den op med en "gem-funktion". Jeg kan bare ikke gennemskue denne fil. Den ligger i øvrigt her: www.vardeborg.dk/backup2.phps
Avatar billede straszek Praktikant
23. februar 2007 - 10:43 #7
Det bruger netop header muligheder

header("Content-disposition: filename=ditfilnavnher.txt"); 
  header("Content-type: application/ms-download"); 
  header("Pragma: no-cache"); 
  header("Expires: 0");
Avatar billede jjdk Nybegynder
23. februar 2007 - 11:04 #8
Jeg har gjort sådan her, men får fejl:

<?php require 'head.php';?>
<?

header("Content-disposition: filename=ditfilnavnher.txt"); 
header("Content-type: application/ms-download"); 
header("Pragma: no-cache"); 
header("Expires: 0");
 
$query = mysql_query("SELECT * FROM kalender_aftale");
$file = "dintekst.txt";

while ($row = mysql_fetch_array($query)) {


$str .= $row['navn'];
$str .= $row['adresse1'];

}

$fp = fopen($file,"w");
fwrite($fp, $str);
fclose($fp);
?>
Avatar billede jjdk Nybegynder
23. februar 2007 - 11:05 #9
Denne fejl kommer 4 gange:
Warning: Cannot modify header information - headers already sent by (output started at /usr/home/web/web109972/kalendertest/head.php:22) in /usr/home/web/web109972/kalendertest/gem_komma.php on line 6
Avatar billede straszek Praktikant
23. februar 2007 - 11:18 #10
Header delen skal være før alt andet:
<?
header("Content-disposition: filename=ditfilnavnher.txt"); 
header("Content-type: application/ms-download"); 
header("Pragma: no-cache"); 
header("Expires: 0");


require 'head.php';

 
$query = mysql_query("SELECT * FROM kalender_aftale");
$file = "dintekst.txt";

while ($row = mysql_fetch_array($query)) {


$str .= $row['navn'];
$str .= $row['adresse1'];

}

$fp = fopen($file,"w");
fwrite($fp, $str);
fclose($fp);
?>
Avatar billede fixxxer Nybegynder
23. februar 2007 - 11:29 #11
$semikolon = "";

while ($row = mysql_fetch_assoc($query)) {
    $semikolon .= implode(';', $row)."\n";
}
Avatar billede jjdk Nybegynder
23. februar 2007 - 11:53 #12
NU er der ingen fejl, men den gemmer fortsat på serveren. Jeg får ingen pop-up, hvor jeg kan gemme lokalt.
Avatar billede fixxxer Nybegynder
23. februar 2007 - 12:34 #13
Måske en korrekt serie headere ville hjælpe?

header('Content-Type: application/octet-stream');
header('Content-Size: '.filesize('filnavnet.txt'));
header('Content-Disposition: attachment; filename=filnavnet.txt');
Avatar billede jjdk Nybegynder
23. februar 2007 - 12:53 #14
Nu skriver jeg sådan her: den gemmer fortsat på serveren.
Og forslaget med $seminkolon er jeg ikke helt med på. Har prøvet, men txt-filen er tom.
<?
header('Content-Type: application/octet-stream');
header('Content-Size: '.filesize('test.txt'));
header('Content-Disposition: attachment; filename=test.txt');

require 'head.php';
 
$query = mysql_query("SELECT * FROM kalender_aftale");
$file = "test.txt";

while ($row = mysql_fetch_array($query)) {
$str .= $row['navn'];
$str .= $row['adresse1'];
}

$fp = fopen($file,"w");
fwrite($fp, $str);
fclose($fp);
?>
Avatar billede algizoft Nybegynder
23. februar 2007 - 14:45 #15
Du sender aldrig filen til klienten. Prøv at afslutte med en
echo file_get_contents('text.txt'); //Linien efter fclose

Derudover giver din linie med filesize ikke så meget mening, da du tager størrelsen af filen før du skriver til den.
Avatar billede jjdk Nybegynder
23. februar 2007 - 14:54 #16
Nu nærmer vi os, da jeg nu får gem-dialogboksen frem, men jeg får fejl, når jeg vælger "Gem".
IE kan ikke indlæse gem_komma.php fra www.vardeborg.dk
IE kunne ikke åbne dette internetsted. Det anmodede sted er enten ikke tilgængelig eller kan ikke findes.

"gem_komma.php" er navnet på min php-fil.
Avatar billede straszek Praktikant
23. februar 2007 - 15:11 #17
du skal ikke bruge navnet på din php fil, men navnet på din datafil  -test.txt  ? - det er jo den der skal hentes "hjem" og ikke php filen
Avatar billede jjdk Nybegynder
23. februar 2007 - 15:20 #18
Det gør jeg heller ikke. Filen ser sådan her ud nu:
<?
header('Content-Type: application/octet-stream');
header('Content-Size: '.filesize('test.txt'));
header('Content-Disposition: attachment; filename=test.txt');

require 'head.php';
 
$query = mysql_query("SELECT * FROM kalender_aftale");
$file = "test.txt";

while ($row = mysql_fetch_array($query)) {
$str .= $row['navn'];
$str .= $row['adresse1'];
}

$fp = fopen($file,"w");
fwrite($fp, $str);
fclose($fp);
echo file_get_contents('test.txt');
?>
Avatar billede algizoft Nybegynder
23. februar 2007 - 15:48 #19
<?
// Sørg for at der ikke skrives fejl ud
ini_set('display_errors', 0);

require 'head.php';

$query = mysql_query("SELECT * FROM kalender_aftale");
$file = "test.txt";

while ($row = mysql_fetch_array($query)) {
$str .= $row['navn'];
$str .= $row['adresse1'];
}

$fp = fopen($file,"w");
fwrite($fp, $str);
fclose($fp);

header('Content-Type: application/octet-stream');
header('Content-Size: '.filesize('test.txt'));
header('Content-Disposition: attachment; filename=test.txt');
echo file_get_contents('test.txt');
// Slet evt. filen på serveren
unlink('test.txt');
?>
Avatar billede algizoft Nybegynder
23. februar 2007 - 15:49 #20
Hvis du vil have flere linier, skal du nok lige rette
$str .= $row['adresse1'];
til
$str .= $row['adresse1']."\n";
Avatar billede jjdk Nybegynder
23. februar 2007 - 15:59 #21
Jeg har nu prøvet nøjagtigt som ovenfor.
Gem-vinduet popper ikke op, men posterne vises på skærmen.
En af de andre skrev, at header skulle lige øverst??
Avatar billede jjdk Nybegynder
23. februar 2007 - 16:07 #22
Her har jeg flyttet header op. Så kommen den godt nok med Gem-vinduet, men det er stadig "gem_komma.php den prøver at gemme, hvilket heller ikke lykedes.

<?
// Sørg for at der ikke skrives fejl ud
ini_set('display_errors', 0);

header('Content-Type: application/octet-stream');
header('Content-Size: '.filesize('test.txt'));
header('Content-Disposition: attachment; filename=test.txt');
require 'head.php';


$query = mysql_query("SELECT * FROM kalender_aftale");
$file = "test.txt";

while ($row = mysql_fetch_array($query)) {
$str .= $row['navn'];
$str .= $row['adresse1'];
}

$fp = fopen($file,"w");
fwrite($fp, $str);
fclose($fp);


echo file_get_contents('test.txt');
// Slet evt. filen på serveren
unlink('test.txt');
?>
Avatar billede jjdk Nybegynder
23. februar 2007 - 17:23 #23
Fejlen fundet.
Kaldet "require 'head.php';" henter mysql koder m.m., men der har ligget noget andet svavs, som har forstyret. Beklager.
Jeg fordeler pointene - sender I lige et svar.
Avatar billede fixxxer Nybegynder
23. februar 2007 - 17:34 #24
readfile() skulle være et bedre alternativ til file_get_content() men jeg kan ikke lige finde noget dokumentation på det.
Avatar billede jjdk Nybegynder
23. februar 2007 - 17:56 #25
fixxxer: Du skrev:

$semikolon = "";

while ($row = mysql_fetch_assoc($query)) {
    $semikolon .= implode(';', $row)."\n";
}

Hvad var meningen?
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