Avatar billede artico Novice
06. september 2011 - 14:21 Der er 8 kommentarer og
1 løsning

Sortere $file_output

Jeg har et database udtræk med ordre hvor der skal lave en tekst fil,

Data kommer således:
varenr - vare - vareantal ... bla, bla..

Disse data skal så gemmmes i en tekst fil som varelinjer, det antal gange som vareantal og det går også fint men, hvordan kan jeg sortere $file_output så alle varenr($iden) udskrives sammen.

altså hvis vare antal nu var 3 for vare 1 og 4 for vare 2 så ser min varefil således ud: :

varenr 1, varenavn, bla,bla
varenr 2, varenavn, bla,bla

varenr 1, varenavn, bla,bla
varenr 2, varenavn, bla,bla

varenr 1, varenavn, bla,bla
varenr 2, varenavn, bla,bla
varenr 2, varenavn, bla,bla

Det skal udskrives:

varenr 1, varenavn, bla,bla
varenr 1, varenavn, bla,bla
varenr 1, varenavn, bla,bla

varenr 2, varenavn, bla,bla
varenr 2, varenavn, bla,bla
varenr 2, varenavn, bla,bla
varenr 2, varenavn, bla,bla

Her er koden:


$iden = trim($row['vare_id']);
$ean = trim($row['ean']);
$varenavn = trim($row['varenavn']);
$salgspris = trim($row['salgspris']);

$arr = array("\r", "\n");
$kvalitet = str_replace($arr, "", $row[kvalitet]);
$varebeskrivelse = str_replace($arr, "", $row[varebeskrivelse]);

        $output .= '<br /><br />';
        $output .= $iden;
        $output .= ';';
        $output .= $ean;
        $output .= ';';
        $output .= $varenavn;
        $output .= ';';
        $output .= $salgspris;
        $output .= ';';
        $output .= $kvalitet;
        $output .= ';';
        $output .= $varebeskrivelse;
        $output .= ';';
        $output .= date('d-m-Y', $ts_prod); //Produktions dato
        $output .= ';';
        $output .= date('d-m-Y', $ts); //Holdbar til
        $output .= "\n";
        $output .= " ";
     
     
        //Kopiere teksten X antal gange og gør det klar til at gemme
        $antal = (isset($row['vare_antal']) && is_numeric($row['vare_antal']) && $row['vare_antal'] > 0) ? intval($row['vare_antal']) : 1;
        $file_output = '';
        for($i = 0; $i < $antal; $i++){
            $file_output .= $output;
        }

Nogen gode bud :-)
06. september 2011 - 14:34 #1
Det lyder, som om problemet er at få linierne sorteret i varenummer rækkefølge.  Hvis linierne er resultatet af en database forespørgsel, er det så ikke blot et spørgsmål om at ordne udtrækket i varenummer rækkefølg?  Hvis queryen for eksempel er:

$result= mysql_query("SELECT * FROM mytable")

skal den udbredes til

$result= mysql_query("SELECT * FROM mytable ORDER BY varenummer")

Eller har jeg misforstået problemstillingen?
Avatar billede artico Novice
06. september 2011 - 14:51 #2
Jo, det var også min første ide, og det har jeg også gjort:

$result = mysql_query("SELECT
            k.kunde_ordre_id,
            k.ordre_nr,
            k.vare_id,
            k.vare_antal,
           
            v.vare_id,
            v.ean,
            v.varenavn,
            v.varebeskrivelse,
            v.kvalitet,
            v.holdbarheds_dage,
            v.salgspris
        FROM
            vare v, kunde_ordre k
        WHERE
            k.vare_id = v.vare_id
        AND
            k.ordre_nr = '".$ordrenr."'
       
        ORDER BY
            k.vare_id ASC
                      ")or die (mysql_error());

$output = '';
    if (mysql_num_rows($result) > 0) {
    while($row = mysql_fetch_assoc($result)) {

// HER kommer så $output koden fra før..

}}



Men den samler ikke varenummeret ($iden) ??
Avatar billede michael_stim Ekspert
06. september 2011 - 15:04 #3
Du skal måske kigge på group by.
06. september 2011 - 15:38 #4
Det er et gæt, men måske forbedres det hvis du, i stedet for 'order by k.vare_id' bruger 'order by v.vare_id'?
Avatar billede artico Novice
07. september 2011 - 15:43 #5
Hey igen, det virkede ikke med Sort/group by ? Jeg roder lidt videre, men måske er det fordi databasen køre igennem data og hvergang tillægger til $output.... hmm roder....
08. september 2011 - 06:51 #6
Hvordan går det med roderie?

Der er ikke noget galt med din query.  Den leverer dine data sorteret efter vare_id nummer.  For test lavede jeg nedenstående tabeller og kørte denne query:

SELECT v.vare_id, v.varenavn, k.kunde_ordre_id, k.vare_antal
FROM articovare v, articokunde k
WHERE v.vare_id = k.vare_id
ORDER BY k.vare_id

og fik dette resultat:

vare_id  varenavn  kunde_ordre_id  vare_antal 
1              varenavn1    6                        16
1              varenavn1    4                          2
2              varenavn2    2                        12
2              varenavn2    1                        25
3              varenavn3    3                        55
3              varenavn3    5                        55

Så det må ligge i din php kode.  Det er ikke så let at gennemskue hensigten med koden for output i sammenhæng med queryen.  Du synes slet ikke at gøre brug af data der kommer fra kunde_ordre tabellen.  Eller er det mig der er bælgøjet?

Her er mine sample tabeller:

CREATE TABLE articovare(vare_id INT, varenavn VARCHAR(10));
INSERT INTO articovare VALUES(1, 'varenavn1');
INSERT INTO articovare VALUES(2, 'varenavn2');
INSERT INTO articovare VALUES(3, 'varenavn3');

CREATE TABLE articokunde(kunde_ordre_id INT, vare_id INT, vare_antal INT);
INSERT INTO articokunde VALUES(1, 2, 25);
INSERT INTO articokunde VALUES(2, 2, 12);
INSERT INTO articokunde VALUES(3, 3, 55);
INSERT INTO articokunde VALUES(4, 1, 2);
INSERT INTO articokunde VALUES(5, 3, 55);
INSERT INTO articokunde VALUES(6, 1, 16);
Avatar billede artico Novice
08. september 2011 - 20:02 #7
Oki.. jeg poster lige hele koden, så kan du måske nemmere få et overblik :-)

$ordrenr = intval($_POST['id']);

    $result = mysql_query("SELECT
            k.kunde_ordre_id,
            k.ordre_nr,
            k.vare_id,
            k.vare_antal,
           
            v.vare_id,
            v.ean,
            v.varenavn,
            v.varebeskrivelse,
            v.kvalitet,
            v.holdbarheds_dage,
            v.salgspris
        FROM
            vare v, kunde_ordre k
        WHERE
            k.vare_id = v.vare_id
        AND
            k.ordre_nr = '".$ordrenr."'
        GROUP BY
            k.vare_id
        ORDER BY
            v.vare_id ASC
                      ")or die (mysql_error());

    $output = '';
    if (mysql_num_rows($result) > 0) {
    while($row = mysql_fetch_assoc($result)) {

        $dagetil_prod = $_POST['produktions_dag'];
        $ts_dd = time(); //Dags dato i timestamp
        $ts_prod = strtotime($dagetil_prod . ' days', $ts_dd); //Læg X dage til $ts

    if (!isset($row['holdbarheds_dage']))
    {
//If not isset -> set with dumy value
    $row['holdbarheds_dage'] = 1;
    }

        $dagetil = $row['holdbarheds_dage'] + $_POST['produktions_dag'];
        $ts = time(); //Dags dato i timestamp
        $ts = strtotime($dagetil . ' days', $ts); //Læg 14 dage til $ts

$iden = trim($row['vare_id']);
$ean = trim($row['ean']);
$varenavn = trim($row['varenavn']);
$salgspris = trim($row['salgspris']);

$arr = array("\r", "\n");
$kvalitet = str_replace($arr, "", $row[kvalitet]);
$varebeskrivelse = str_replace($arr, "", $row[varebeskrivelse]);

        $output .= '<br /><br />';
        $output .= $iden;
        $output .= ';';
        $output .= $ean;
        $output .= ';';
        $output .= $varenavn;
        $output .= ';';
        $output .= $salgspris;
        $output .= ';';
        $output .= $kvalitet;
        $output .= ';';
        $output .= $varebeskrivelse;
        $output .= ';';
        $output .= date('d-m-Y', $ts_prod); //Produktions dato
        $output .= ';';
        $output .= date('d-m-Y', $ts); //Holdbar til
        $output .= "\n";
        $output .= " ";
     
     
        //Kopiere teksten X antal gange og gør det klar til at gemme
        $antal = (isset($row['vare_antal']) && is_numeric($row['vare_antal']) && $row['vare_antal'] > 0) ? intval($row['vare_antal']) : 1;
        $file_output = '';
        for($i = 0; $i < $antal; $i++){
            $file_output .= $output;
        }
        // downloading a file
   
    }}
09. september 2011 - 07:46 #8
Tror du problemet er, at du bytter rundt på $output og $file_output? $output bruger du til de enkelte linier, så $output skal defineres inde i while løkken.  I $file_output samler du så det hele sammen, så den skal defineres udenfor løkken.  For testformål skrev jeg nedenstående forenklede kode, hvor jeg blandt andet definerer $ordrenr = 1 i stedet for at få den fra $_POST['id'], og hvor jeg echoer outputtet i stedet for at placere det i en fil.  Det giver dette resultat, hvilket jeg mener er det du ønsker:

1;varenavn1
1;varenavn1
1;varenavn1

2;varenavn2
2;varenavn2

3;varenavn3
3;varenavn3
3;varenavn3
3;varenavn3

Som en sidebemærkning, eftersom du fra kunde_ordre kun bruger vare_antal, foreslår jeg, at du kun inkluderer denne i queryen.  Det forkommer, blandt andet, at du i $row får to felter begge med navnet 'vare_id'.

Her er så min kode:

require('connect.php');
$ordrenr = 1;
$result = mysql_query("SELECT k.vare_antal, v.vare_id, v.varenavn FROM articokunde k, articovare v WHERE k.vare_id = v.vare_id AND k.kunde_ordre_id = $ordrenr ORDER BY k.vare_id;");
$file_output = '';
if(mysql_num_rows($result) > 0)
{
  while($row = mysql_fetch_assoc($result))
  {
    $output = '';
    $iden = $row['vare_id'];
    $varenavn = $row['varenavn'];
    $antal = $row['vare_antal'];
    $output .= $iden;
    $output .= ';';
    $output .= $varenavn;
    $output .= '<br>';
    for($i = 0; $i < $antal; $i++) $file_output .= $output; 
    $file_output .= '<br />';
  }
}
echo $file_output;
Avatar billede artico Novice
09. september 2011 - 19:50 #9
Yesss... så virker det , mange takker herfa :-)))
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