Avatar billede kimkochrasmussen Nybegynder
23. august 2010 - 07:15 Der er 13 kommentarer og
1 løsning

Hente data, flette - og skrive til csv

Hej

Jeg har en db med to tabeller:

DELTAGER
id
fornavn
efternavn
...

RESULTAT
uid
did (referer til deltager.id)
cat
subcat
resultat
point

I resultat tabellen har hver deltager optil 3 resultater registreret i forskellige subcat. Det ønsker jeg nu at få på en række i en csv fil:
id;fornavn;efternavn;cat;subcat;resultat;point;cat;subcat;resultat;point

- altså fx:

342;Peter;Hansen;spring;længdespring;3.5;726;loeb;60m;9.8;526;kast;kugle;16;514
343;Sarah;Jensen;loeb;800m;201;756;kast;kugle;15;502

Jeg kan ikke gennemskue hvordan jeg henter det data ud af min mysql db - og jeg ved heller ikke præcist hvordan jeg skriver det til en csv fil, som skal hentes ned.

På forhånd tak for hjælpen!
Avatar billede majbom Novice
23. august 2010 - 09:07 #1
SELECT d.*, r.cat, r.subcat, r.resultat, r.point FROM deltager d INNER JOIN resultat r ON d.id=r.did


$csv = "";
$deltager = "";
$first = true;
while($rows=mysql_fetch_assoc($res)){
  if($rows['id']!=$deltager){
      if(!$first){
        $csv .= "\n";
        $first = false;
      }
      $csv .= $rows['id'].";".$rows['fornavn'].";".$rows['efternavn'];
      $deltager = $rows['id'];
  }
  $csv .= ";".$rows['cat'].";".$rows['subcat'].";".$rows['resultat'].";".$rows['point'].";";
}

$fil = "dinCSV.csv";
$fh = fopen($fil, 'w') or die("Kan ikke åbne fil");
fwrite($fh, $csv);
fclose($fh);


utestet...
Avatar billede kimkochrasmussen Nybegynder
26. august 2010 - 19:27 #2
TAK for forslaget, og beklager at jeg har været væk et par dage.

Desværre løser dit forslag ikke mit problem, da resultaterne fortsat kommer i forskellige linier, altså fx
319;Jan;Petersen;loeb;800m;180;215
319;Jan;Petersen;kast;kugle;23.5;117
320;Pia;Jensen;kast;kugle;24;119

Det ønskede var:
319;Jan;Petersen;loeb;800m;180;215;kast;kugle;23.5;117
320;Pia;Jensen;kast;kugle;24;119


Andre forslag modtages meget gerne, tak!
Avatar billede majbom Novice
27. august 2010 - 07:08 #3
nååh ja... mindre fejl, prøv med:

$csv = "";
$deltager = "";
$first = true;
while($rows=mysql_fetch_assoc($res)){
  if(!$first){
      $csv .= "\n";
      $first = false;
  }
  if($rows['id']!=$deltager){
      $csv .= $rows['id'].";".$rows['fornavn'].";".$rows['efternavn'];
      $deltager = $rows['id'];
  }
  $csv .= ";".$rows['cat'].";".$rows['subcat'].";".$rows['resultat'].";".$rows['point'].";";
}

$fil = "dinCSV.csv";
$fh = fopen($fil, 'w') or die("Kan ikke åbne fil");
fwrite($fh, $csv);
fclose($fh);
Avatar billede kimkochrasmussen Nybegynder
27. august 2010 - 07:24 #4
Nej, det virker fortsat ikke - alt kommer ud på en række.
Nu er jeg ikke god til det her, men er problmet ikke at den aldrig kommer indenfor i den første if-sætning? Jeg prøvede så at flytte $first = false; ned udenfor }. Nu kommer der liniedeling, men sådan at hvert resultat står for sig, og ikke som ønsket...

Andre bud?
Avatar billede majbom Novice
27. august 2010 - 07:46 #5
nej, det er mig der er en kegle!

$csv = "";
$deltager = "";
$first = true;
while($rows=mysql_fetch_assoc($res)){
  if($rows['id']!=$deltager){
      if(!$first){
        $csv .= "<br>";
      }
      $first = false;
      $csv .= $rows['id'].";".$rows['fornavn'].";".$rows['efternavn'];
      $deltager = $rows['id'];
  }
  $csv .= ";".$rows['cat'].";".$rows['subcat'].";".$rows['resultat'].";".$rows['point'].";";
}

$fil = "dinCSV.csv";
$fh = fopen($fil, 'w') or die("Kan ikke åbne fil");
fwrite($fh, $csv);
fclose($fh);
Avatar billede kimkochrasmussen Nybegynder
27. august 2010 - 18:33 #6
Virker stadig ikke.
Hvis jeg bytter <br> ud med \n får jeg liniedelinger - MEN de kommer fortsat de samme steder som tidligere nævnt - og altså ikke der hvor de skal komme....

Har du flere gode bud?
Avatar billede majbom Novice
27. august 2010 - 19:20 #7
nej det skal jo heller ikke være <br> når det er til en fil, jeg får sq kaget noget rundt i det idag - sorry.

kan dog ikke forstå at det ikke virker når du laver det om til \n

jeg har flg array:

$res = array(
            array(
                'id'=>1,
                'fornavn'=>'arne',
                'efternavn'=>'petersen',
                'cat'=>'løb',
                'subcat'=>'100m',
                'resultat'=>'11:12',
                'point'=>'37'
            ),
            array(
                'id'=>1,
                'fornavn'=>'arne',
                'efternavn'=>'petersen',
                'cat'=>'kast',
                'subcat'=>'discos',
                'resultat'=>'32',
                'point'=>'12'
            ),
            array(
                'id'=>2,
                'fornavn'=>'lars',
                'efternavn'=>'jensen',
                'cat'=>'kast',
                'subcat'=>'discos',
                'resultat'=>'43',
                'point'=>'17'
            ),
            array(
                'id'=>3,
                'fornavn'=>'lone',
                'efternavn'=>'larsen',
                'cat'=>'kast',
                'subcat'=>'spyd',
                'resultat'=>'12',
                'point'=>'2'
            ),
            array(
                'id'=>3,
                'fornavn'=>'lone',
                'efternavn'=>'larsen',
                'cat'=>'kast',
                'subcat'=>'discos',
                'resultat'=>'27',
                'point'=>'6'
            )
        );


og flg kode:

$csv = "";
        $deltager = "";
        $first = true;
        foreach($res AS $rows){
            if($rows['id']!=$deltager){
                if(!$first){
                    $csv .= ";<br>\n";
                }
                $first = false;
                $csv .= $rows['id'].";".$rows['fornavn'].";".$rows['efternavn'];
                $deltager = $rows['id'];
            }
            $csv .= ";".$rows['cat'].";".$rows['subcat'].";".$rows['resultat'].";".$rows['point'];
        }
        $csv .= ";";
        echo $csv;


som outputter dette: http://majbom.com/testarea/exp/917051/

jeg har så sat en <br> ind for at vise linjeskiftet i browseren og brugt en for-løkke i stedet for while, men er det ikke det output du skal bruge?
Avatar billede kimkochrasmussen Nybegynder
27. august 2010 - 20:01 #8
Hmmm mystisk...

Jo, det output du beskriver er præcist det jeg vil havde.
Hvis jeg prøver med din $res går det også helt fint.
Det må så altså være mit sql kald der er noget galt med - kan du se hvad:

For god ordens skyld, så skrev jeg forkert i første indlæg - jeg har  ikke et resultat.resultat - den hedder resultat.result
Det har jeg naturligvis bare rettet i det tidl. du har skrevet.

Mit sql kald ser således ud:

$res = mysql_query("SELECT d.*, r.cat, r.subcat, r.result, r.point FROM deltager d INNER JOIN resultat r ON d.id=r.did");


Fyrer jeg et følgende sql sætning - altså "SELECT d.*, r.cat, r.subcat, r.result, r.point FROM deltager d INNER JOIN resultat r ON d.id=r.did" af i phpmyadmin får jeg:
id    fornavn    efternavn    unilogin    skole    klasse    gruppe    koen    kast    spring    loeb    cat    subcat    result    point
319    Ilker    Yilmaz        HAD    5A    5    M    K    L    6    K    K    7.72    590
321    Rasmus    Sørensen        HAD    5A    5    M    K    L    6    K    K    8.08    635
322    Mikkel    Carøe        HAD    5A    5    M    K    L    6    K    K    6.94    493

og naturligvis gentages de samme id'er længere nede...

kan du se hvad fejlen er?
Avatar billede majbom Novice
27. august 2010 - 21:13 #9
i stedet for at danne din csv-fil i din while, kan du så ikke:

echo "<pre>";
print_r[$row];
echo "</pre>";
?>


og poste hvad der kommer ud?
Avatar billede kimkochrasmussen Nybegynder
27. august 2010 - 22:49 #10
Array
(
    [id] => 319
    [fornavn] => Ilker
    [efternavn] => Yilmaz
    [unilogin] =>
    [skole] => HAD
    [klasse] => 5A
    [gruppe] => 5
    [koen] => M
    [kast] => K
    [spring] => L
    [loeb] => 6
    [cat] => K
    [subcat] => K
    [result] => 7.72
    [point] => 590
)
Array
(
    [id] => 321
    [fornavn] => Rasmus
    [efternavn] => Sørensen
    [unilogin] =>
    [skole] => HAD
    [klasse] => 5A
    [gruppe] => 5
    [koen] => M
    [kast] => K
    [spring] => L
    [loeb] => 6
    [cat] => K
    [subcat] => K
    [result] => 8.08
    [point] => 635
)
Array
(
    [id] => 322
    [fornavn] => Mikkel
    [efternavn] => Carøe
    [unilogin] =>
    [skole] => HAD
    [klasse] => 5A
    [gruppe] => 5
    [koen] => M
    [kast] => K
    [spring] => L
    [loeb] => 6
    [cat] => K
    [subcat] => K
    [result] => 6.94
    [point] => 493
)


osv. osv.
Avatar billede majbom Novice
27. august 2010 - 23:00 #11
dem der går igen, de har ikke samme id vel?
jeg ved ike hvorfor jeg havde regnet med det, men det er det koden er lavet efter. der er nødt til at være noget unikt for hvert navn, som du kan gå efter, for at gruppere dem. hvis der ikke er andet end navnet må jeg lige lave det om...
Avatar billede kimkochrasmussen Nybegynder
28. august 2010 - 08:01 #12
TAK - så faldt 10-øren endelig for mig.

Naturligvis har de samme id - der er bare over 500 rsultater så jeg klippede lidt i det jeg smed til dig.
MEN med det du skrev opdagede jeg jo at de skal komme lige efter hinanden (og det gør de ikke) - så jeg tilføjede blot et ORDER BY d.id i sql kaldet - og nu spille der bare


TAK for hjælpen - smider du ikke et svar
Avatar billede majbom Novice
28. august 2010 - 08:09 #13
ja, det havde jeg osse lige misset med GROUP BY

SVAR! :)
Avatar billede majbom Novice
29. august 2010 - 18:48 #14
tfp :)
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