Avatar billede neo-claw Nybegynder
22. januar 2011 - 13:49 Der er 7 kommentarer

Problemer med kode til at liste software fra mysql

Jeg sidder og er ved at lave et system som skal liste noget software med titel, version og pris; fra en mysql database. Man skal så kunne vælge at købe softwaren ud fra listen, men også kunne se det man allerede har købt.

Mit problem er så at få den til ikke at liste de gamle versioner af software man har købt. Dog hvis man ikke har købt softwaren, skal den vise alle versionerne, da de vil være billigere end den nyeste version.

Jeg ved godt det lyder lidt indviklet og måske lidt dumt, men det skal bruges til et browser spil :)

Her er den kode jeg har indtil videre til at liste softwaren ud i min tabel (dog forenklet lidt):

<?php
    $sql_query = $_sql->query("SELECT * FROM ".$sql_prefix."apps ORDER BY name") or die(mysqli_error($_sql));
    while ($app = mysqli_fetch_assoc($sql_query))
    {   
        $own_check_q = $_sql->query("SELECT * FROM ".$sql_prefix."userapps WHERE owner_id='".$_SESSION['userid']."' AND app_id='".$app['id']."'");
        if (mysqli_affected_rows($_sql) == 1)
        {
            $app_list .= '<tr> <td>OWNED</a></td> <td>'.$app['title'].'</td> <td>v'.$app['version'].'</td> <td>$'.$app['price'].'</td> </tr>';
        }
        else
        {
            $app_list .= '<tr> <td>BUY</a></td> <td>'.$app['title'].'</td> <td>v'.$app['version'].'</td> <td>$'.$app['price'].'</td> </tr>';   
        }
    }
?>
Avatar billede tjens Nybegynder
22. januar 2011 - 22:09 #1
For ikke at udføre så mange sql'er vil jeg anbefale at du læser alle  den konkrete brugers køb ind først, og overfører id'erne til et Array.

Så kan du for hver record fra apps checke om id findes i array.

Programstruktur (demonstreret i javascript):
    var ownedItemId = "-1";
    var breakId = "-1";
    var result = "";

    for (var i = 0; i < items.length; i++) {  // loop der simulerer "varelinierne" fra SQL

        if (ownedItemId == items[i].id)  // Spring varen over hvis den allerede er ejet og udskrevet
            continue;

        var action = " BuyButton ";      // sæt standard knap til køb
        if (owned[items[i].id] === true) {  // hvis id findes i ejet-Array
            ownedItemId = items[i].id;  // Husk id for ejet og udskrevet.
            action = " OWNED";            // Ændre knap hvis ejet
        }

        if ( breakId != items[i].id ) {
            result  += '\n';
            breakId = items[i].id;
        }

        result += items[i].id + '\t' + items[i].title+ '\t' + items[i].version + '\t' + items[i].pris + '\t' + action;
    }


Se programmet køre her: http://tjens.dk/eksperten/929635/

Testdata (javascript array og objekter):
var owned = {
    "AAA":true,
    "DDD":true,
    "FFF":true
    };

var items = [
    {"id":"AAA", "title":"Software A", "version":"1.2", "pris":"25,50"},
    {"id":"AAA", "title":"Software A", "version":"1.1", "pris":"20,50"},
    {"id":"AAA", "title":"Software A", "version":"1.0", "pris":"18,50"},
    {"id":"BBB", "title":"Software B", "version":"1.2", "pris":"25,75"},
    {"id":"BBB", "title":"Software B", "version":"1.1", "pris":"20,75"},
    {"id":"BBB", "title":"Software B", "version":"1.0", "pris":"18,75"},
    {"id":"CCC", "title":"Software C", "version":"1.2", "pris":"25,25"},
    {"id":"CCC", "title":"Software C", "version":"1.1", "pris":"20,25"},
    {"id":"CCC", "title":"Software C", "version":"1.0", "pris":"18,25"},
    {"id":"DDD", "title":"Software D", "version":"1.2", "pris":"25,00"},
    {"id":"DDD", "title":"Software D", "version":"1.1", "pris":"20,00"},
    {"id":"DDD", "title":"Software D", "version":"1.0", "pris":"18,00"},
    {"id":"EEE", "title":"Software E", "version":"1.2", "pris":"25,50"},
    {"id":"EEE", "title":"Software E", "version":"1.1", "pris":"20,50"},
    {"id":"EEE", "title":"Software E", "version":"1.0", "pris":"18,50"},
    {"id":"FFF", "title":"Software F", "version":"1.2", "pris":"25,75"},
    {"id":"FFF", "title":"Software F", "version":"1.1", "pris":"20,75"},
    {"id":"FFF", "title":"Software F", "version":"1.0", "pris":"18,75"},
    {"id":"GGG", "title":"Software G", "version":"1.2", "pris":"25,25"},
    {"id":"GGG", "title":"Software G", "version":"1.1", "pris":"20,25"},
    {"id":"GGG", "title":"Software G", "version":"1.0", "pris":"18,25"}
];
Avatar billede neo-claw Nybegynder
27. januar 2011 - 14:36 #2
Tak for forslaget. Jeg har prøvet at rode med koden, og bikse det her sammen: http://pastebin.com/FtDFvvPd
Men jeg får kun en liste over software jeg IKKE ejer, og der i blandt er også de lavere versioner, som burde være fjernet.. jeg må gøre et eller andet galt :P
Avatar billede neo-claw Nybegynder
27. januar 2011 - 14:38 #3
dette er indholdet af de to javascript arrays når koden er kørt igennem:

var owned = {
"5":true,"6":true,"2":true};

var items = [
{"id":"1", "title":"My test application", "version":"1.4", "pris":"10"},{"id":"3", "title":"My test application", "version":"2.1", "pris":"10"},{"id":"4", "title":"Another test", "version":"2.2", "pris":"14"}];
Avatar billede tjens Nybegynder
27. januar 2011 - 21:01 #4
Du må undskylde at jeg fik dig ledt på vildspor, ved at vise en programstruktur i javascript.

Det var lettest for mig at lave et kørende eksempel, ved at "lege" database-records med javascript-arrays.

Men min ide var, at du skulle programmere samme logik direkte i dit phpscript, og ikke at du skulle bruge javascript.

Hvis jeg skal skrive det om til PHP bliver det ca. sådan her:
$ownedItemId = "-1";
$owned = array();

$ownedSql = $_sql->query("SELECT * FROM ".$sql_prefix."userapps WHERE                owner_id='".$_SESSION['userid']."' ") or die(mysqli_error($_sql);
while ($ownedApp = mysqli_fetch_assoc($sql_query))
{
    $owned[ $ownedApp['app_id'] ] = true;
}

$sql_query = $_sql->query("SELECT * FROM ".$sql_prefix."apps ORDER BY name")        or die(mysqli_error($_sql));
while ($app = mysqli_fetch_assoc($sql_query))
{
    if ($ownedItemId == $app['id'])  // Spring varen over hvis den allerede er ejet og udskrevet
        continue;

    if ( array_key_exists( $app['id'], $owned )  ) {  // hvis app-id findes i ejet-Array
        $ownedItemId = $app['id'];                // Husk id for ejet og udskrevet.
        $app_list .= '<tr> <td>OWNED</a></td>'; 
    }
    else
    {
        $app_list .= '<tr> <td>BUY</a></td>';   
    }

    $app_list .= '<td>'.$app['title'].'</td> <td>v'.$app['version'].'</td> <td>$'.$app['price'].'</td> </tr>';

}

Der er derfor kun brug for 1 array: Til at huske de allerede ejede app-id'er.

Det er dog ikke testet, da det er for besværligt for mig at oprette tabeller og data.

Måske skal din ORDER BY udvided med "version desc", da det er vigtigt at versionerne kommer faldende, når vi kun udskriver den første.
Avatar billede tjens Nybegynder
27. januar 2011 - 21:09 #5
Har fået øje på første fejl i #4:
første [code]  mysqli_fetch_assoc($sql_query))[/code]
skal være
[code]  mysqli_fetch_assoc($ownedSql))[/code]
Avatar billede neo-claw Nybegynder
27. januar 2011 - 21:20 #6
aaah, haha. Ja kan godt se at jeg var helt galt på den :)
Men kan stadig ikke få den til ikke at vise de versioner der er under det software man har købt. :/
Avatar billede tjens Nybegynder
27. januar 2011 - 21:50 #7
Jeg ved ikke om jeg har forstået opgaven helt så:

Mit script udskriver alle ikke købte-versioner, samt den nyeste version af købte ( hvis du har "ORDER BY version DESC" på).

Ellers må du forklare opgaven forfra med flere ord på.
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