Avatar billede DonTorro Nybegynder
09. juni 2010 - 21:55 Der er 55 kommentarer og
1 løsning

Tøm køleskabet funktion

Hey.. er igang med at lave en funktion hvor man tømmer køleskabet.
brugeren kommer fra en anden side hvor de har sat $_POST['submit'] men af en eller anden grund kan jeg ikke få det til at virke.. og har set mig rimlig blind på det :)

Håber nogen kan hjælpe mig lidt her :)

<?
if(isset($_POST['Submit'])){
    if(is_array($_POST['checkbox'])){
                foreach($_POST[checkbox] as $key => $val){
                "$key: $val<br />";
        $new_array[$key] = $val;
                }
        $ingrediens_antal = count($new_array);

$sql = "SELECT * FROM opskrift
WHERE opskrift_id IN (SELECT opskrift_id FROM op_ingredienser WHERE ingrediens_navn = '$new_array[0]')";

for ($i = 1; $i < $ingrediens_antal; $i++) {
    $sql .= " AND opskrift_id IN (SELECT opskrift_id FROM op_ingredienser WHERE ingrediens_navn = '$new_array[$i]')";
}
$result = mysql_query($sql);
    while ($row = mysql_fetch_array($result)) {
        if (mysql_num_rows($result)==0) {
            echo "Intet resultat";
        }else{
        echo "<a href='drink_vis.php?opskrift_id=".$row['opskrift_id']."'>".$row['opskrift_navn']."</a><br />";
        }
       
        $sqli = "SELECT * FROM op_ingredienser where opskrift_id = '$row[opskrift_id]'";
        $resulti = mysql_query($sqli);
            for ($i = 0; $i < $ingrediens_antal; $i++) {
                while ($row1 = mysql_fetch_array($resulti)) {
           
                    if ($row1['ingrediens_navn'] == $new_array[$i]) {
                        echo "<span style='font-size: 11px; color: red;'>$row1[ingrediens_navn],</span> ";                   
                    }else{
                   
            echo "<span style='font-size: 11px;'>$row[ingrediens_navn],</span> ";
            }
                }
            }
            echo "<br />";
        }
        }
    } else{
        echo "Der skete en fejl, prøv venligst igen";
    }
?>
Avatar billede majbom Novice
09. juni 2010 - 22:08 #1
hvad er det præcist der ikke virker? har du en ide om hvor det går galt?

du kunne prøve at udskrive din $sql inden du fyrer den af, du kunne også sætte en or die(mysql_error()) på din mysql_query();
Avatar billede DonTorro Nybegynder
09. juni 2010 - 22:17 #2
Ja, glemte jeg måske at skrive :)

Men ideen er jo at dem man har flest ingredienser til skal komme øverst.

indtil videre får jeg Opskrift navn ud, men kun den sidste ingrediens (ud af 3, i dette ekspempel) :/
Avatar billede DonTorro Nybegynder
09. juni 2010 - 22:18 #3
den viser også kun de opskrifter som har alle de ingredienser man vælger og ikke dem som mangler f.eks 1
Avatar billede majbom Novice
09. juni 2010 - 22:27 #4
men som sagt, så prøve med lidt basal fejlsøgning, prøv hvad jeg skrev før og se om ikke dette kan give dig et hint eller 2 :)
Avatar billede ggxdg Nybegynder
10. juni 2010 - 00:16 #5
foreach($_POST[checkbox] as $key => $val){
        "$key: $val<br />";
        $new_array[$key] = $val;
}

Jeg er lidt rusten i PHP, men mangler der ikke noget i den første linie i foreach'en? - altså:

"$key: $val<br />";
Avatar billede DonTorro Nybegynder
10. juni 2010 - 00:31 #6
burde faktisk bare slette den linie da jeg ikke echoer den ud :p
Avatar billede DonTorro Nybegynder
10. juni 2010 - 00:36 #7
Splazz
når jeg echo'er begge forespørgsler ud:
SELECT * FROM opskrift WHERE opskrift_id IN (SELECT opskrift_id FROM op_ingredienser WHERE ingrediens_navn = 'Abrikos-likør')SELECT * FROM opskrift WHERE opskrift_id IN (SELECT opskrift_id FROM op_ingredienser WHERE ingrediens_navn = 'Abrikos-likør') AND opskrift_id IN (SELECT opskrift_id FROM op_ingredienser WHERE ingrediens_navn = 'Absint')

Har 2 SELECT * FROM ..?

mysql_error() giver ingenting
Avatar billede ggxdg Nybegynder
10. juni 2010 - 18:14 #8
}else{
  echo "<span style='font-size: 11px;'>$row[ingrediens_navn],</span> ";
}



}else{
  echo "<span style='font-size: 11px;'>$row1[ingrediens_navn],</span> ";
}

? :)
Avatar billede majbom Novice
10. juni 2010 - 19:17 #9
og så lige et par glyffer på:

}else{
  echo "<span style='font-size: 11px;'>$row1['ingrediens_navn'],</span> ";
}

så spiller det 100 :)
Avatar billede DonTorro Nybegynder
10. juni 2010 - 21:41 #10
så viser den alle ingredienserne .. satte glyffer og fjernede den med red - så nu er de alle samme farve, hul i det..

Men - den viser stadig ikke de opskrifter hvor man mangler f.eks. en ingrediens? Hvordan skal den mon laves ;o?

nogen ideer?
Avatar billede ggxdg Nybegynder
10. juni 2010 - 21:43 #11
Jeg kan se der mangler "glyffer" i meget af koden nu du lige nævner det splazz.

DonTorro:
Hvis du skal have placeret flere af disse "glyffer" er du nok nød til at escape nogle af i noget af koden (dem der echo'es til HTML ellers får du problemer med PHP-delen)


" = \"
' = \'
Avatar billede DonTorro Nybegynder
10. juni 2010 - 22:22 #12
har gjort: echo "html".$row['ingrediens_navn']."html"

tror det virker 100% . men den viser selfølgelig ikke de opskrifter hvor man mangler nogle ingredienser da jeg ikke ved hvordan den lige skal gennemtænkes :p
Avatar billede ggxdg Nybegynder
11. juni 2010 - 10:44 #13
Kan du ikke linke til siden, så man kan få sig en fornemmelse af hvordan du vil have det til at fungere, eller forklare helt fra bunden hvad planen er? :)
Avatar billede DonTorro Nybegynder
11. juni 2010 - 11:30 #14
sender link i post :)
Avatar billede majbom Novice
11. juni 2010 - 12:31 #15
så man vælger hvad man har i skabet, og hvad skal den så finde?

drinks hvor ikke andet end de ting indgår? den skal vel ikke finde hvor der lige nøjagtig indgår det hele, ej heller nogle hvor der indgår mere?
Avatar billede DonTorro Nybegynder
11. juni 2010 - 14:04 #16
Altså tænkte at hvis de første resultater var drinks hvor man havde det hele , også skader det vel ikke der kommer nogle hvor man lige mangler en ting eller to, som man så skal ud og købe :)?
Avatar billede majbom Novice
11. juni 2010 - 18:47 #17
kan du ikke poste tabelstrukturen på de opskrifter og op_ingredienser og forklare hvordan de er relateret?
Avatar billede DonTorro Nybegynder
11. juni 2010 - 21:36 #18
Opskrift:
opskrift_id
opskrift_navn
brugernavn
beskrivelse

Op_ingredienser:
ingrediens_id
ingrediens_navn
opskrift_id
maengde
kat

Og det er kun opskrift_id der fletter de to sammen.

Var det, det du mente? :/
Avatar billede majbom Novice
11. juni 2010 - 21:46 #19
aah okay, så ingredienserne optræder flere gange i tabellen op_ingredienser? eller det kan de?

går lige i tænkebox...
Avatar billede DonTorro Nybegynder
11. juni 2010 - 22:00 #20
Ja altså alt efter hvor mange ingredienser der er til en drink.
så den liste bliver betydeligt størrere :)

Giver dig tænke ro så, høhø
Avatar billede DonTorro Nybegynder
13. juni 2010 - 20:03 #21
kan du komme på noget :)?
Avatar billede majbom Novice
13. juni 2010 - 20:23 #22
nej jeg kan sq ikke lige se hvordan man kan lave det smartest...
Avatar billede ggxdg Nybegynder
13. juni 2010 - 20:44 #23
Ja jeg syntes også den er lidt svær at kringle. Man plejer at hente mange oplysninger ud fra et enkelt eller to valg, men at skulle finde en enkelt ud fra flere, er lidt af en udfordring, i hvert fald med min lidt begrændsede programmerings/kodnings-erfaring :P

Men jeg tror jeg ville gøre det ved at loope hvert valg igennem og lave arrays i et array, altså et array for hver opskrift der er respons på, lagre og så lagre indgredienserne i et array, så den af dem der er flest resultater i vises, eller den/de som bare mangler en enkel indgrediens.

Jeg tror ikke lige jeg kan give dig noget eksempel på stående fod, so jeg håber du ved hvad jeg mener, selv om det er ret kringlet beskrevet :P
Avatar billede DonTorro Nybegynder
13. juni 2010 - 22:49 #24
hehe, forstår godt hvad du mener, burde også kunne lade sig gøre.. men går selv kun på hovedforløbet som web-integrator :) så har heller ikke den helt store erfaring indenfor php , hehe :)
Avatar billede ggxdg Nybegynder
16. juni 2010 - 23:15 #25
Jeg har måske en løsning, som med lidt fikseri måske kan flettes ind i din nuværende kode, jeg har skrevet lidt af det, men det skal lige pudses lidt af, så jeg skriver nok lige igen imorgen, hvis du ikke selv har fikset det endnu.

Det bliver utestet kode, så det er nok fyldt med fejl :P
Avatar billede ggxdg Nybegynder
16. juni 2010 - 23:16 #26
Kan du ikke lige smide dit script ind som det ser ud nu forresten?
Avatar billede DonTorro Nybegynder
17. juni 2010 - 07:32 #27
fuck hvor nice :)

if(isset($_POST['Submit'])){
    if(is_array($_POST['checkbox'])){
                foreach($_POST[checkbox] as $key => $val){
                "$key: $val<br />";
        $new_array[$key] = $val;
                }
        $ingrediens_antal = count($new_array);

    $sql = "SELECT * FROM opskrift
WHERE opskrift_id IN (SELECT opskrift_id FROM op_ingredienser WHERE ingrediens_navn = '$new_array[0]')";

for ($i = 1; $i < $ingrediens_antal; $i++) {
    $sql .= " AND opskrift_id IN (SELECT opskrift_id FROM op_ingredienser WHERE ingrediens_navn = '$new_array[$i]')";
}
$result = mysql_query($sql);
    while ($row = mysql_fetch_array($result)) {
        if (mysql_num_rows($result)==0) {
            echo "Intet resultat";
        }else{
        echo "<a href='drink_vis.php?opskrift_id=".$row['opskrift_id']."'>".$row['opskrift_navn']."</a><br />";
        }
       
        $sqli = "SELECT * FROM op_ingredienser where opskrift_id = '$row[opskrift_id]'";
        $resulti = mysql_query($sqli);
            for ($i = 0; $i < $ingrediens_antal; $i++) {
                while ($row1 = mysql_fetch_array($resulti)) {
            echo "<span style='font-size: 11px;'>".$row1['ingrediens_navn']." | </span>";
            }
            echo "<br />";
                }
            }
            echo "<br />";
        }
       
    } else{
        echo "Der skete en fejl, prøv venligst igen";
    }
Avatar billede ggxdg Nybegynder
17. juni 2010 - 18:24 #28
Så er jeg lige ved at være der, men jeg skal lige høre om de opskrifter der har alle ingrdienser skal outputtes adskildt fra dem der mangler ingredienser, eller om det bare skal sorteres efter mindst antal manglene ingredienser, således at dem man har alt til, bare står helt i toppen.
Avatar billede DonTorro Nybegynder
17. juni 2010 - 19:51 #29
Ej hvor lækkert ;)

Det er helt find hvis de bare kommer efter hinanden uden at de er adskilt, hvor dem man har alle ingredienser til er i toppen :)
Avatar billede ggxdg Nybegynder
17. juni 2010 - 22:16 #30
if(isset($_POST['Submit'])){
    if(is_array($_POST['checkbox'])){
        foreach($_POST[checkbox] as $key => $val){
            $new_array[$key] = $val;
        }
        echo "<br />";
        findOpskrifter("1");
        //findOpskrifter($_POST['maning']); //hvis du vil stilføje mulighed for at vælge antal ingredienser der maksimalt må mangle.
    }
     
} else{
    echo "Der skete en fejl, prøv venligst igen";
}


function findOpskrifter($manIng)
{
    $ingrediens_antal = count($new_array);

    $sql = "SELECT * FROM opskrift WHERE opskrift_id IN (SELECT opskrift_id FROM op_ingredienser WHERE ingrediens_navn = '$new_array[0]')";

    for ($i = 1; $i < $ingrediens_antal; $i++) {
        $sql .= " OR opskrift_id IN (SELECT opskrift_id FROM op_ingredienser WHERE ingrediens_navn = '$new_array[$i]')";
    }
    $iAO = 0; //Integer Array Opskriftnavn
    $iAI = 0; //Integer Array Ingrediensnavn
    $iAIm = 0; //Integer Array Ingredienser der mangler



    $result = mysql_query($sql);
    while ($row = mysql_fetch_array($result)) {
        $ingrediens_result[$iAO][0][0] = $row[opskrift_id]; //Ingrediens navn
        $iAO++;


        if (mysql_num_rows($result)==0) {
            echo "Intet resultat";
        }else{
            //echo "<a href='drink_vis.php?opskrift_id=".$row['opskrift_id']."'>".$row['opskrift_navn']."</a><br />";
        }
 
        $sqli = "SELECT * FROM op_ingredienser where opskrift_id = '$row[opskrift_id]'";
        $resulti = mysql_query($sqli);
        for ($i = 0; $i < $ingrediens_antal; $i++) {
            while ($row1 = mysql_fetch_array($resulti)) {
                if ($row1['ingrediens_navn'] == $new_array[$i]) {
                    $ingrediens_result[$iAO][1][$iAI] = $row1['ingrediens_navn']; //Ingredienser brugeren har
                    $iAI++;                 
                } else {
                    $ingrediens_result[$iAO][2][$iAIm] = $row1['ingrediens_navn']; //Ingredienser brugeren ikke har
                    $iAIm++;
                }
                //echo "<span style='font-size: 11px;'>".$row1['ingrediens_navn']." | </span>";
            }
            echo "<br />";
        }
    }
    $ioi = 0;
    for ($io = 0; $io < $iAO; $io++) {
        if (count(ingrediens_result[$io][2]) <= $manIng) { //Sorter resultater fra der mangler mere end det tiladte
            $opskriftindex[$ioi] = $io; //Lav et indeks over interresante opskrifter
            $ioi++;
        }
    }
    $ioi2 = 0;
    for ($im = 0; $im < $ioi; $im++) {
        if (count(ingrediens_result[$im][2]) == $im) { //Sorter resultater efter hvor mange ingredienser der mangler
            $opskriftindex2[$ioi2] = $im; //Gem ny rækkefølge
            $ioi2++;
        }
    }
    for ($ie = 0; $ie < $ioi2; $ie++) {
        if (count(ingrediens_result[$im][2]) == $im) { //Sorter resultater efter hvor mange ingredienser der mangler
            echo "<a href='drink_vis.php?opskrift_id=".ingrediens_result[$ie][0][0]."'>".$row['opskrift_navn']."</a><br />"; //echo opskrift navn
            for ($ieh = 0; $ieh < count($ingrediens_result[$ie][1]); $ieh++) { //echo ingredienser brugeren har
                echo "<span style='font-size: 11px; color: red;'>".$ingrediens_result[$ie][1][$ieh].",</span> ";
            }
            for ($iehi = 0; $iehi < count($ingrediens_result[$ie][2]; $iehi++) { //echo ingrdienser brugeren ikke har
                echo "<span style='font-size: 11px;'>".$ingrediens_result[$ie][2][$iehi].",</span> ";
            }
            $ie++;
        }
    }
}


Det kan sikkert gøres med meget mindre kode, og det er nok fuld af fejl, men jeg har ikke lige nogen mulighed for at teste det - og jeg skal nok lige prøve at gå det igennem igen senere, men det her skulle give en idé om hvordan det kunne gøres.

Jeg er lidt rusten i PHP så jeg kan ikke lige huske om arrays skal defineres først. Nogle af "for"-loopene kan nok erstattes med "sort()" funktionen, eller evt. bare laves om til while loops i stil med den for en query.

Meget kort beskrevet:
- Find alle opskrifter med en hvilken som helst af ingredienserne
- Sortér alle opskrifter fra der mangler mere end det tilladte
antal ingredienser
- Sortér de resterende opskrifter efter hvor mange ingredienser der mangler
Skriv lige når/hvis du har testet det - fejl/problemer/succeser.
Avatar billede ggxdg Nybegynder
17. juni 2010 - 22:20 #31
argh! Har allerede fundet første fejl:

"$ie++;" i bunden skal da vidst lige slettes!
Avatar billede ggxdg Nybegynder
17. juni 2010 - 22:23 #32
Arrayet skulle nogenlunde se ud som følger:
[0][0][0] Opskrift ID
[0][1][0] Ingrediens 1
[0][1][1] Ingrediens 2
[0][2][0] 1. manglene ingrediens
[0][2][1] 2. manglene ingrediens
[1][0][0] Opskrift ID
[1][1][0] Ingrediens 1
[1][1][1] Ingrediens 2
[1][1][2] Ingrediens 3
[1][2][0] 1. manglene ingrediens
[1][2][1] 2. manglene ingrediens
Avatar billede DonTorro Nybegynder
17. juni 2010 - 23:33 #33
ser rigtigt godt ud, der manglede lige nogle $ foran ingrediens_result nogle steder, eller intet..

Der er bare et problem, den viser ikke nogle ingredienser :(
kan lige kigge på det imorgen tidlig..

Godnat
Avatar billede ggxdg Nybegynder
18. juni 2010 - 10:45 #34
copy/paste er farlig hvis man er lidt døsig :P



...
    for ($ie = 0; $ie < $ioi2; $ie++) {
        echo "<a href='drink_vis.php?opskrift_id=".ingrediens_result[$ie][0][0]."'>".$row['opskrift_navn']."</a><br />"; //echo opskrift navn
        for ($ieh = 0; $ieh < count($ingrediens_result[$ie][1]); $ieh++) { //echo ingredienser brugeren har
            echo "<span style='font-size: 11px; color: red;'>".$ingrediens_result[$ie][1][$ieh].",</span> ";
        }
        for ($iehi = 0; $iehi < count($ingrediens_result[$ie][2]; $iehi++) { //echo ingrdienser brugeren ikke har
            echo "<span style='font-size: 11px;'>".$ingrediens_result[$ie][2][$iehi].",</span> ";
        }
    }
}

Jeg tror der kom en "if" for meget ind i den sidste overordnede "for", prøv ovenstående og se om det hjælper, jeg kigger lige det hele grundigt igennem igen i eftermiddag/aften
Avatar billede ggxdg Nybegynder
20. juni 2010 - 12:13 #35
Så har jeg fået givet den en grundig overhaling. Der var ret mange fejl i mine loops kunne jeg se... Jeg har stadig ikke lige mulighed for at teste det, men hvis du er i tvivl om noget, så spørg endeligt.
Jeg har lavet 2 versioner, fordi jeg tror du har et for-loop, som laver en masse unødvendige lookups, men ejg er ikke sikker på det passer for mig, så her er første version, med det omtalte for-loop

if(isset($_POST['Submit'])){
    if(is_array($_POST['checkbox'])){
        foreach($_POST[checkbox] as $key => $val){
            $new_array[$key] = $val;
        }
        echo "<br />";
        findOpskrifter("1");
    }
   
} else{
    echo "Der skete en fejl, prøv venligst igen";
}


function findOpskrifter($manIng)
{
    $ingrediens_antal = count($new_array);

    $sql = "SELECT * FROM opskrift WHERE opskrift_id IN (SELECT opskrift_id FROM op_ingredienser WHERE ingrediens_navn = '$new_array[0]')";

    for ($i = 1; $i < $ingrediens_antal; $i++) {
        $sql .= " OR opskrift_id IN (SELECT opskrift_id FROM op_ingredienser WHERE ingrediens_navn = '$new_array[$i]')";
    }
    $iAO = 0; //Integer Array Opskriftnavn
    $iAI = 0; //Integer Array Ingrediensnavn
    $iAIm = 0; //Integer Array Ingredienser der mangler

    $result = mysql_query($sql);
    while ($row = mysql_fetch_array($result)) {
       
        if (mysql_num_rows($result)==0) {
            echo "Intet resultat";
        }else{
            //echo "<a href='drink_vis.php?opskrift_id=".$row['opskrift_id']."'>".$row['opskrift_navn']."</a><br />";
            $ingrediens_result[$iAO][0][0] = $row['opskrift_id']; //Ingrediens ID
            $ingrediens_result[$iAO][0][1] = $row['opskrift_navn']; //Ingrediens navn
        }

        $sqli = "SELECT * FROM op_ingredienser where opskrift_id = '$row[opskrift_id]'";
        $resulti = mysql_query($sqli);
        for ($i = 0; $i < $ingrediens_antal; $i++) { //jeg tror man får en masse overflødige lookups her, som på sigt nok vil gøre dette script langsom, jeg laver også lige en version uden dette for-loop...
            while ($row1 = mysql_fetch_array($resulti)) {
                if ($row1['ingrediens_navn'] == $new_array[$i]) {
                    $ingrediens_result[$iAO][1][$iAI] = $row1['ingrediens_navn']; //Ingredienser brugeren har
                    $iAI++;               
                } else {
                    $ingrediens_result[$iAO][2][$iAIm] = $row1['ingrediens_navn']; //Ingredienser brugeren ikke har
                    $iAIm++;
                }
            }
            echo "<br />";
        }
        $iAO++;
    }

    $ioi = 0;
    for ($i = 0; $i < $iAO; $i++) {
        if (count($ingrediens_result[$i][2]) <= $manIng) { //Sorter resultater fra der mangler mere end det tiladte
            $opskriftindex[$ioi] = $i; //Lav et indeks over interresante opskrifter
            $ioi++;
        }
    }

    $ioi2 = 0;
    for ($i = 0; $i < $manIng; $i++) { //Loop antal manglende ingredienser
        for ($im = 0; $im < $ioi; $im++) { //Loop opskriftindekset igennem, og find resultater med det aktuelle antal manglene ingredienser
            $ingresind = $opskriftindex[$im]; //Find tallet på en interresant opskrift i opskriftindekset
            if (count($ingrediens_result[$ingresind][2]) == $i) { //Jeg bruger $i fra det overordnede for-loop, men jeg kan ikke huske om det er muligt, eller om for-loops kører deres eget instance.
                $opskriftindex2[$ioi2] = $ingresind; //Gem ny rækkefølge
                $ioi2++;
            }
        }
    }

    for ($i = 0; $i < $ioi2; $i++) {
        $ingresind2 = $opskriftindex2[$i];
        echo "<a href='drink_vis.php?opskrift_id=".$ingrediens_result[$ingresind2][0][0]."'>".$ingrediens_result[$ingresind2][0][1]."</a><br />"; //echo opskrift navn
        for ($ieh = 0; $ieh < count($ingrediens_result[$ingresind2][1]); $ieh++) { //echo ingredienser brugeren har
            echo "<span style='font-size: 11px; color: red;'>".$ingrediens_result[$ingresind2][1][$ieh].",</span> ";
        }
        for ($iehi = 0; $iehi < count($ingrediens_result[$ingresind2][2]; $iehi++) { //echo ingrdienser brugeren ikke har
            echo "<span style='font-size: 11px;'>".$ingrediens_result[$ingresind2][2][$iehi].",</span> ";
        }
    }
}
Avatar billede ggxdg Nybegynder
20. juni 2010 - 12:21 #36
Ok, for-loopet kan ikke ungåes, men jeg tror så at man kan bytte om på while- og for-loop'ene:

        $sqli = "SELECT * FROM op_ingredienser where opskrift_id = '$row[opskrift_id]'";
        $resulti = mysql_query($sqli);
        while ($row1 = mysql_fetch_array($resulti)) {
            for ($i = 0; $i < $ingrediens_antal; $i++) {
                if ($row1['ingrediens_navn'] == $new_array[$i]) {
                    $ingrediens_result[$iAO][1][$iAI] = $row1['ingrediens_navn']; //Ingredienser brugeren har
                    $iAI++;               
                } else {
                    $ingrediens_result[$iAO][2][$iAIm] = $row1['ingrediens_navn']; //Ingredienser brugeren ikke har
                    $iAIm++;
                }
            }
            //echo "<br />";
        }
Avatar billede ggxdg Nybegynder
20. juni 2010 - 12:26 #37
For lige at sætte mig selv på plads:
Jeg ved ikke hvorfor jeg bliver ved med at tænke at query'en foregår i while loopet, men eftersom det ikke er tilfældet, er din måde at gøre det på, helt fin...

Sorry :P
Avatar billede DonTorro Nybegynder
20. juni 2010 - 22:57 #38
Hey.. Sorry jeg ikke har svaret tilbage, har haft lidt mange ting at se til ;)

Jeg tester den som det første imorgen tidlig!
Glæder mig rigtigt meget til at se om det virker hehe..

ser meget avanceret ud ;)
Avatar billede DonTorro Nybegynder
21. juni 2010 - 08:58 #39
for ($iehi = 0; $iehi < count($ingrediens_result[$ingresind2][2]; $iehi++) { //echo ingrdienser brugeren ikke har
            echo "<span style='font-size: 11px;'>".$ingrediens_result[$ingresind2][2][$iehi].",</span> ";
        }

Den giver fejl i denne linje :/
Avatar billede DonTorro Nybegynder
21. juni 2010 - 08:59 #40
ved [$ingresind2][2];
Avatar billede DonTorro Nybegynder
21. juni 2010 - 09:00 #41
ah der manglede bare ) for at afslutte count..

Men den viser stadig ingenting :(
Avatar billede ggxdg Nybegynder
21. juni 2010 - 10:09 #42
Det er så svært lige at lave det rigtigt når man ikke selv sidder med det. Jeg plejer at smide nogle echoes in forskellige steder, dels for at se hvor langt den kommer i scriptet, men også for at se hvad arrays osv. indeholder.

Kan du evt. prøve at eksportere tabel strukturen, og paste det her, så jeg selv kan sidde og rode lidt med det?
Avatar billede DonTorro Nybegynder
21. juni 2010 - 21:01 #43
ah kan se at når jeg echo'er $sql ud, så skriver den :


SELECT * FROM opskrift WHERE opskrift_id IN (SELECT opskrift_id FROM op_ingredienser WHERE ingrediens_navn = '')

ingrediens_navn er tomt
Avatar billede DonTorro Nybegynder
21. juni 2010 - 21:21 #44
nu fik jeg leget lidt med det, men den sorterer dem ikke rigtigt..

ud kommenterede funktionen da den åbenbart ikke kunne bruge arrayet


if(isset($_POST['Submit'])){
    if(is_array($_POST['checkbox'])){
        foreach($_POST[checkbox] as $key => $val){
          $new_array[$key] = $val;
        }
        echo "<br />";
      // findOpskrifter("1");
    }
 
} else{
    echo "Der skete en fejl, prøv venligst igen";
}


//function findOpskrifter($manIng)
//{
   
    $ingrediens_antal = count($new_array);

          $sql = "SELECT * FROM opskrift WHERE opskrift_id IN (SELECT opskrift_id FROM op_ingredienser WHERE ingrediens_navn = '$new_array[0]')";

    for ($i = 1; $i < $ingrediens_antal; $i++) {
        $sql .= " OR opskrift_id IN (SELECT opskrift_id FROM op_ingredienser WHERE ingrediens_navn = '$new_array[$i]')";
    }
    $iAO = 0; //Integer Array Opskriftnavn
    $iAI = 0; //Integer Array Ingrediensnavn
    $iAIm = 0; //Integer Array Ingredienser der mangler

    $result = mysql_query($sql);
    while ($row = mysql_fetch_array($result)) {
     
        if (mysql_num_rows($result)==0) {
            echo "Intet resultat";
        }else{
            echo "<a href='drink_vis.php?opskrift_id=".$row['opskrift_id']."'>".$row['opskrift_navn']."</a><br />";
            $ingrediens_result[$iAO][0][0] = $row['opskrift_id']; //Ingrediens ID
            $ingrediens_result[$iAO][0][1] = $row['opskrift_navn']; //Ingrediens navn
        }

        $sqli = "SELECT * FROM op_ingredienser where opskrift_id = '$row[opskrift_id]'";
        $resulti = mysql_query($sqli);
        for ($i = 0; $i < $ingrediens_antal; $i++) { //jeg tror man får en masse overflødige lookups her, som på sigt nok vil gøre dette script langsom, jeg laver også lige en version uden dette for-loop...
            while ($row1 = mysql_fetch_array($resulti)) {
                if ($row1['ingrediens_navn'] == $new_array[$i]) {
                  echo $ingrediens_result[$iAO][1][$iAI] = $row1['ingrediens_navn']." | "; //Ingredienser brugeren har
                    $iAI++;             
                } else {
                  echo $ingrediens_result[$iAO][2][$iAIm] = $row1['ingrediens_navn']." | "; //Ingredienser brugeren ikke har
                    $iAIm++;
                }
            }
            echo "<br />";
        }
        $iAO++;
    }

    $ioi = 0;
    for ($i = 0; $i < $iAO; $i++) {
        if (count($ingrediens_result[$i][2]) <= $manIng) { //Sorter resultater fra der mangler mere end det tiladte
            $opskriftindex[$ioi] = $i; //Lav et indeks over interresante opskrifter
            $ioi++;
        }
    }

    $ioi2 = 0;
    for ($i = 0; $i < $manIng; $i++) { //Loop antal manglende ingredienser
        for ($im = 0; $im < $ioi; $im++) { //Loop opskriftindekset igennem, og find resultater med det aktuelle antal manglene ingredienser
            $ingresind = $opskriftindex[$im]; //Find tallet på en interresant opskrift i opskriftindekset
            if (count($ingrediens_result[$ingresind][2]) == $i) { //Jeg bruger $i fra det overordnede for-loop, men jeg kan ikke huske om det er muligt, eller om for-loops kører deres eget instance.
                $opskriftindex2[$ioi2] = $ingresind; //Gem ny rækkefølge
                $ioi2++;
            }
        }
    }

    for ($i = 0; $i < $ioi2; $i++) {
        $ingresind2 = $opskriftindex2[$i];
        echo "<a href='drink_vis.php?opskrift_id=".$ingrediens_result[$ingresind2][0][0]."'>".$ingrediens_result[$ingresind2][0][1]."</a><br />"; //echo opskrift navn
        for ($ieh = 0; $ieh < count($ingrediens_result[$ingresind2][1]); $ieh++) { //echo ingredienser brugeren har
            echo "<span style='font-size: 11px; color: red;'>".$ingrediens_result[$ingresind2][1][$ieh].",</span> ";
        }
        for ($iehi = 0; $iehi < count($ingrediens_result[$ingresind2][2]); $iehi++) { //echo ingrdienser brugeren ikke har
            echo "<span style='font-size: 11px;'>".$ingrediens_result[$ingresind2][2][$iehi].",</span> ";
        }
    }
//}
Avatar billede ggxdg Nybegynder
22. juni 2010 - 16:05 #45
Jeps... du har helt ret...
Arrayet er lavet uden for funktionen, så global variabel skal enten bruges, eller også skal funktionen kaldes med arrayet, eller også skulle man bare rykke rundt på det som du havde det først.

Jeg prøver lige at rykke det tilbage.
Avatar billede ggxdg Nybegynder
22. juni 2010 - 16:23 #46
Ok, jeg foretrækker alligevel lige at smide ting i funktioner for ordens skyld, så hvis flg. stadig ikke fungerer af samme grund, skal jeg nok lige fjerne funktionen (jeg er ikke lige helt sikker på om det er så simpelt at pas'se et array til en funktion).


if(isset($_POST['Submit'])){
    if(is_array($_POST['checkbox'])){
        foreach($_POST[checkbox] as $key => $val){
          $new_array[$key] = $val;
        }
        echo "<br />";
        findOpskrifter($new_array, "1");
    }

} else{
    echo "Der skete en fejl, prøv venligst igen";
}


function findOpskrifter($newarr, $manIng = "1")
{
 
    $ingrediens_antal = count($newarr);

    $sql = "SELECT * FROM opskrift WHERE opskrift_id IN (SELECT opskrift_id FROM op_ingredienser WHERE ingrediens_navn = '$newarr[0]')";

    for ($i = 1; $i < $ingrediens_antal; $i++) {
        $sql .= " OR opskrift_id IN (SELECT opskrift_id FROM op_ingredienser WHERE ingrediens_navn = '$newarr[$i]')";
    }
    $iAO = 0; //Integer Array Opskriftnavn
    $iAI = 0; //Integer Array Ingrediensnavn
    $iAIm = 0; //Integer Array Ingredienser der mangler

    $result = mysql_query($sql);
    while ($row = mysql_fetch_array($result)) {
   
        if (mysql_num_rows($result)==0) {
            echo "Intet resultat";
        }else{
            echo "<a href='drink_vis.php?opskrift_id=".$row['opskrift_id']."'>".$row['opskrift_navn']."</a><br />";
            $ingrediens_result[$iAO][0][0] = $row['opskrift_id']; //Ingrediens ID
            $ingrediens_result[$iAO][0][1] = $row['opskrift_navn']; //Ingrediens navn
        }

        $sqli = "SELECT * FROM op_ingredienser where opskrift_id = '$row[opskrift_id]'";
        $resulti = mysql_query($sqli);
        for ($i = 0; $i < $ingrediens_antal; $i++) { //jeg tror man får en masse overflødige lookups her, som på sigt nok vil gøre dette script langsom, jeg laver også lige en version uden dette for-loop...
            while ($row1 = mysql_fetch_array($resulti)) {
                if ($row1['ingrediens_navn'] == $newarr[$i]) {
                  echo $ingrediens_result[$iAO][1][$iAI] = $row1['ingrediens_navn']." | "; //Ingredienser brugeren har
                    $iAI++;           
                } else {
                  echo $ingrediens_result[$iAO][2][$iAIm] = $row1['ingrediens_navn']." | "; //Ingredienser brugeren ikke har
                    $iAIm++;
                }
            }
            echo "<br />";
        }
        $iAO++;
    }

    $ioi = 0;
    for ($i = 0; $i < $iAO; $i++) {
        if (count($ingrediens_result[$i][2]) <= $manIng) { //Sorter resultater fra der mangler mere end det tiladte
            $opskriftindex[$ioi] = $i; //Lav et indeks over interresante opskrifter
            $ioi++;
        }
    }

    $ioi2 = 0;
    for ($i = 0; $i < $manIng; $i++) { //Loop antal manglende ingredienser
        for ($im = 0; $im < $ioi; $im++) { //Loop opskriftindekset igennem, og find resultater med det aktuelle antal manglene ingredienser
            $ingresind = $opskriftindex[$im]; //Find tallet på en interresant opskrift i opskriftindekset
            if (count($ingrediens_result[$ingresind][2]) == $i) { //Jeg bruger $i fra det overordnede for-loop, men jeg kan ikke huske om det er muligt, eller om for-loops kører deres eget instance.
                $opskriftindex2[$ioi2] = $ingresind; //Gem ny rækkefølge
                $ioi2++;
            }
        }
    }

    for ($i = 0; $i < $ioi2; $i++) {
        $ingresind2 = $opskriftindex2[$i];
        echo "<a href='drink_vis.php?opskrift_id=".$ingrediens_result[$ingresind2][0][0]."'>".$ingrediens_result[$ingresind2][0][1]."</a><br />"; //echo opskrift navn
        for ($ieh = 0; $ieh < count($ingrediens_result[$ingresind2][1]); $ieh++) { //echo ingredienser brugeren har
            echo "<span style='font-size: 11px; color: red;'>".$ingrediens_result[$ingresind2][1][$ieh].",</span> ";
        }
        for ($iehi = 0; $iehi < count($ingrediens_result[$ingresind2][2]); $iehi++) { //echo ingrdienser brugeren ikke har
            echo "<span style='font-size: 11px;'>".$ingrediens_result[$ingresind2][2][$iehi].",</span> ";
        }
    }
}
Avatar billede DonTorro Nybegynder
22. juni 2010 - 18:57 #47
det virker :)

men den sorterer stadig ikke efter hvilke man mangler ingredienser til osv. :/
Avatar billede ggxdg Nybegynder
23. juni 2010 - 09:29 #48
Jeg overvejer lidt at lave om på måden den sorterer resultaterne på, ved at tilføje en manglene indgrediens værdi, i den overordnede array, og så bruge en af sorterings funktionerne der findes til array.

Så det bliver nok noget med array_map() og asort().
Men jeg skal lige have testet lidt forskellige muligheder :P
Avatar billede ggxdg Nybegynder
23. juni 2010 - 23:13 #49
jeg har lige siddet og eksperimenteret lidt, og hvis arrayet ser ud som jeg håber/tror det gør, skulle flg. virke, med lidt tilpadsning:

for ($i = 0; $i <= $manIng; $i++) {
    foreach($newarr as $key1=>$val1) {
        if (count($val1[2]) == $i) {
            echo "<br />Opskrift: ".$val1[0][0]."<br />Har:<br />";
            foreach($val1[1] as $key2=>$val2) {
                echo $val2."<br />";
            }
            echo "Mangler:<br />";
            foreach($val1[2] as $key3=>$val3) {
                echo $val3."<br />";
            }
        }
    }
}


Jeg tilpasser det lige i løbet af imorgen. kan jeg ikke få dig til at copy/paste resultatet af et

print_r($ingrediens_result);

efter du har valgt nogle ingredienser, så jeg kan se om arrayet outputter alt i det format som det skal?
Avatar billede ggxdg Nybegynder
24. juni 2010 - 00:06 #50
det echo du får vil være ret groft her, men hvis arrayet bliver lavet som det skal, fungerer flg.:

if(isset($_POST['Submit'])){
    if(is_array($_POST['checkbox'])){
        foreach($_POST[checkbox] as $key => $val){
          $new_array[$key] = $val;
        }
        echo "<br />";
        findOpskrifter($new_array, "1");
    }

} else{
    echo "Der skete en fejl, prøv venligst igen";
}


function findOpskrifter($newarr, $manIng = "1")
{

    $ingrediens_antal = count($newarr);

    $sql = "SELECT * FROM opskrift WHERE opskrift_id IN (SELECT opskrift_id FROM op_ingredienser WHERE ingrediens_navn = '$newarr[0]')";

    for ($i = 1; $i < $ingrediens_antal; $i++) {
        $sql .= " OR opskrift_id IN (SELECT opskrift_id FROM op_ingredienser WHERE ingrediens_navn = '$newarr[$i]')";
    }
    $iAO = 0; //Integer Array Opskriftnavn
    $iAI = 0; //Integer Array Ingrediensnavn
    $iAIm = 0; //Integer Array Ingredienser der mangler

    $result = mysql_query($sql);
    while ($row = mysql_fetch_array($result)) {
 
        if (mysql_num_rows($result)==0) {
            echo "Intet resultat";
        }else{
            echo "<a href='drink_vis.php?opskrift_id=".$row['opskrift_id']."'>".$row['opskrift_navn']."</a><br />";
            $ingrediens_result[$iAO][0][0] = $row['opskrift_id']; //Ingrediens ID
            $ingrediens_result[$iAO][0][1] = $row['opskrift_navn']; //Ingrediens navn
        }

        $sqli = "SELECT * FROM op_ingredienser where opskrift_id = '$row[opskrift_id]'";
        $resulti = mysql_query($sqli);
        for ($i = 0; $i < $ingrediens_antal; $i++) {
            while ($row1 = mysql_fetch_array($resulti)) {
                if ($row1['ingrediens_navn'] == $newarr[$i]) {
                  echo $ingrediens_result[$iAO][1][$iAI] = $row1['ingrediens_navn']." | "; //Ingredienser brugeren har
                    $iAI++;         
                } else {
                  echo $ingrediens_result[$iAO][2][$iAIm] = $row1['ingrediens_navn']." | "; //Ingredienser brugeren ikke har
                    $iAIm++;
                }
            }
            echo "<br />";
        }
        $iAO++;
    }


    for ($i = 0; $i <= $manIng; $i++) {
        foreach($ingrediens_result as $key1=>$val1) {
            if (count($val1[2]) == $i) {
                echo "<br />Opskrift: ".$val1[0][0]."<br />Har:<br />";
                foreach($val1[1] as $key2=>$val2) {
                    echo $val2."<br />";
                }
                if ($i != 0) {
                    echo "Mangler:<br />";
                    foreach($val1[2] as $key3=>$val3) {
                        echo $val3."<br />";
                    }
                }
                echo "<br /><br />";
            }
        }
    }
}
Avatar billede ggxdg Nybegynder
24. juni 2010 - 00:12 #51
Linien

echo "<br />Opskrift: ".$val1[0][0]."<br />Har:<br />";

ændres til:

echo "<br />Opskrift: ".$val1[0][1]."<br />Har:<br />";

for at få navnet i stedet for ID'en
Avatar billede ggxdg Nybegynder
24. juni 2010 - 11:26 #52
Der var en fejl i måden array-keys var nummererede, flg. skulle have alle ændringer:

if(isset($_POST['Submit'])){
    if(is_array($_POST['checkbox'])){
        foreach($_POST[checkbox] as $key => $val){
          $new_array[$key] = $val;
        }
        echo "<br />";
        findOpskrifter($new_array, "1");
    }
} else { echo "Der skete en fejl, prøv venligst igen"; }
function findOpskrifter($newarr, $manIng = "1")
{
    $ingrediens_antal = count($newarr);
    $sql = "SELECT * FROM opskrift WHERE opskrift_id IN (SELECT opskrift_id FROM op_ingredienser WHERE ingrediens_navn = '$newarr[0]')";
    for ($i = 1; $i < $ingrediens_antal; $i++) {
        $sql .= " OR opskrift_id IN (SELECT opskrift_id FROM op_ingredienser WHERE ingrediens_navn = '$newarr[$i]')";
    }
    $iAO = 0; //Integer Array Opskriftnavn
    $result = mysql_query($sql);
    while ($row = mysql_fetch_array($result)) {
        if (mysql_num_rows($result)==0) {
            echo "Intet resultat";
        }else{
            $ingrediens_result[$iAO][0][0] = $row['opskrift_id']; //Ingrediens ID
            $ingrediens_result[$iAO][0][1] = $row['opskrift_navn']; //Ingrediens navn
        }
        $sqli = "SELECT * FROM op_ingredienser where opskrift_id = '$row[opskrift_id]'";
        $resulti = mysql_query($sqli);
        $iAI = 0; //Integer Array Ingrediensnavn
        $iAIm = 0; //Integer Array Ingredienser der mangler
        for ($i = 0; $i < $ingrediens_antal; $i++) {
            while ($row1 = mysql_fetch_array($resulti)) {
                if ($row1['ingrediens_navn'] == $newarr[$i]) {
                    $ingrediens_result[$iAO][1][$iAI] = $row1['ingrediens_navn']; //Ingredienser har
                    $iAI++;         
                } else {
                    $ingrediens_result[$iAO][2][$iAIm] = $row1['ingrediens_navn']; //Ingredienser har ikke
                    $iAIm++;
                }
            }
            echo "<br />";
        }
        $iAO++;
    }
    for ($i = 0; $i <= $manIng; $i++) {
        foreach($ingrediens_result as $key1=>$val1) {
            if (count($val1[2]) == $i) {
                echo "<br />Opskrift: <a href='drink_vis.php?opskrift_id=".$val1[0][0]."'>".$val1[0][1]."</a><br />Har:<br />";
                foreach($val1[1] as $key2=>$val2) {
                    echo $val2."<br />";
                }
                if ($i != 0) {
                    echo "Mangler:<br />";
                    foreach($val1[2] as $key3=>$val3) {
                        echo $val3."<br />";
                    }
                }
                echo "<br /><br />";
            }
        }
    }
}

Se om det hele fungerer nu, og smid lige en:
<pre>
print_r($ingrediens_result);
</pre>
igen, så jeg lige kan se om arrayet er som det skal være nu :)
Avatar billede DonTorro Nybegynder
26. juni 2010 - 05:04 #53
ggxdg smid endelig svar.. hvis du vil have 200 mere så skriv det  lige i dit svar ;)
Avatar billede ggxdg Nybegynder
29. juni 2010 - 21:06 #54
Jeg smider lige løsningen ind ogsp, hvis det kan være til hjælp for andre i fremtiden :P

function findOpskrifter($newarr, $manIng = "1")
{
    $ingrediens_antal = count($newarr);
    $sql = "SELECT * FROM opskrift WHERE opskrift_id IN (SELECT opskrift_id FROM op_ingredienser WHERE ingrediens_navn = '$newarr[0]')";
    for ($i = 1; $i < $ingrediens_antal; $i++) {
        $sql .= " OR opskrift_id IN (SELECT opskrift_id FROM op_ingredienser WHERE ingrediens_navn = '$newarr[$i]')";
    }
    $iAO = 0; //Integer Array Opskriftnavn
    $result = mysql_query($sql);
    while ($row = mysql_fetch_array($result)) {
        if (mysql_num_rows($result)==0) {
            echo "Intet resultat";
        }else{
            $ingrediens_result[$iAO][0][0] = $row['opskrift_id']; //Ingrediens ID
            $ingrediens_result[$iAO][0][1] = $row['opskrift_navn']; //Ingrediens navn
        }
        $sqli = "SELECT * FROM op_ingredienser where opskrift_id = '$row[opskrift_id]'";
        $resulti = mysql_query($sqli);
        while ($row1 = mysql_fetch_array($resulti)) {
            if (in_array($row1['ingrediens_navn'], $newarr)) {
                $ingrediens_result[$iAO][1][] = $row1['ingrediens_navn']; //Ingredienser har
            } else {
                $ingrediens_result[$iAO][2][] = $row1['ingrediens_navn']; //Ingredienser har ikke
            }
        }
        $iAO++;
    }
    for ($i = 0; $i <= $manIng; $i++) {
        foreach($ingrediens_result as $key1=>$val1) {
            if (count($val1[2]) == $i) {
                echo "<br />Opskrift: <a href='drink_vis.php?opskrift_id=".$val1[0][0]."'>".$val1[0][1]."</a><br />Har:<br />";
                foreach($val1[1] as $key2=>$val2) {
                    echo $val2."<br />";
                }
                if ($i != 0) {
                    echo "Mangler:<br />";
                    foreach($val1[2] as $key3=>$val3) {
                        echo $val3."<br />";
                    }
                }
                echo "<br /><br />";
            }
        }
    }
}

Og nej... De 200 du i forvejen giver er fint, jeg kan godt li' en lille udfordring :P
Avatar billede DonTorro Nybegynder
29. juni 2010 - 22:02 #55
amen dog:D tusind tak for hjælpen, havde ikke klaret den uden dig!!

Skriv hvis du en dag kommer i point mangle så ;)
Avatar billede DonTorro Nybegynder
29. juni 2010 - 22:02 #56
mangel*
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