09. juni 2010 - 21:55Der 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 :)
Hos Computerworld it-jobbank er vi stolte af at fortsætte det gode partnerskab med folkene bag IT-DAY – efter vores mening Danmarks bedste karrieremesse for unge og erfarne it-kandidater.
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')
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)
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
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? :)
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 :)?
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
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 :)
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
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.
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. }
$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.
... 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
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
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> "; } } }
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...
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?
$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> "; } } //}
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.
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).
$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> "; } } }
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
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.