Avatar billede allandk Nybegynder
01. juli 2013 - 22:38 Der er 9 kommentarer og
1 løsning

Sidder fuldstændig fast i for/each/while/loop med mysql

Jeg forsøger at skrive en løkke med en løkke. Det går ikke. Kan du finde fejlen?

Løkke (1) skal tælle til 5 og for hver gang værdien øges skal løkke (2) liste tre række fra db.

Problemet er, at enten listes alle rækkerne tre gange eller også tælles der til 5 for hver række.

Her er koden:

<?php
$menuquery2="SELECT * FROM minskolebod_dage WHERE dage_datoer BETWEEN '$monday' AND '$friday' LIMIT 5";
$menuresult2 = mysql_query($menuquery2) or die ("Query to get data failed: ".mysql_error());
if (mysql_num_rows($menuresult2) > 0) { 
?>

<form action="..." method="post" name="updateweekplan"> 
<table>...
<?php

for($day=1; $day<=5; $day++) {

while ($menurow2 = mysql_fetch_array($menuresult2)) {
    $dage_ugedage=$menurow2["dage_ugedage"];
    $dage_datoer=$menurow2["dage_datoer"];
    $dage_retter=$menurow2["dage_retter"];   
?>

<tr>
<td width="80"><?php echo ucfirst($dage_ugedage); ?><input name="dato[<?php echo $day; ?>]" id="dato[<?php echo $day; ?>]" type="hidden" value="<?php echo $dage_datoer; ?>" readonly="true" /><?php echo $dage_datoer; ?></td>
<td>
<select name="course[<?php echo $day; ?>]" id="course[<?php echo $day; ?>]">
<?php foreach($menuresult_array1 as $menuresult1): ?><?php if($menuresult1 == $dage_retter) { ?>
<option value="<?php echo ucfirst(utf8_encode($menuresult1)); ?>" selected="selected"><?php echo ucfirst(utf8_encode($menuresult1)); ?></option>
<?php } else {?>
<option value="<?php echo ucfirst(utf8_encode($menuresult1)); ?>"><?php echo ucfirst(utf8_encode($menuresult1)); ?></option>
<?php } ?><?php endforeach; ?>
</select>
</td></tr>
<?php
} ?>
    </tbody>
</table>

<input type="submit" name="updateweekplan" id="updateweekplan" value="Opdatér" class="full-width" />
</form>
<?php } ?>


P.S. Jeg har spurgt om noget lignende her: http://www.eksperten.dk/spm/982585
02. juli 2013 - 07:38 #1
Du bruger du i løkke2 $menuresult_array1, men du viser ikke hvor den kommer fra. 
Jeg tror du laver en bestillingsformular for frokostretter, hvor der hver dag skal være valget mellem et antal (tre?) retter, og disse retter er forskellige fra dag til dag.  Mandag skipperlakskovs, frikadeller, eller fiskefile, tirsdag medister, stegt flæsk, eller rødspætte, o.s.v. 
Hvis det er korrekt, hvor i databasen gemmer du hvilke retter der skal tilbydes hvilke dage?  Hvordan ser tabellen minskolebod ud?
Hvis jeg har misforstået hvad det er du vil, så forklar nærmere.
Med dine svar på dette skulle kan vi velsagtens få dine løkker til at virke.
Avatar billede allandk Nybegynder
02. juli 2013 - 08:33 #2
Det er ganske rigtigt forstået :-)

Jeg henter rækker til en dropdown:

$menuquery1 = "SELECT menuer_retter FROM minskolebod_menuer WHERE menuer_pause = '0' OR menuer_pause = '100' ORDER BY menuer_retter ASC";
$menuresult1 = mysql_query($menuquery1) or die ("Query to get data failed: ".mysql_error());
$result_array1 = array();
while($menurow1 = mysql_fetch_row($menuresult1))
{
    $menuresult_array1[] = $menurow1[0];
}

minskolebod_menuer: menuer_id | _retter | _noter | _ priser | _pause

Den vises også fint nok:

<select name="course[<?php echo $day; ?>]" id="course[<?php echo $day; ?>]">
<?php foreach($menuresult_array1 as $menuresult1): ?><?php if($menuresult1 == $dage_retter) { ?>
<option value="<?php echo ucfirst(utf8_encode($menuresult1)); ?>" selected="selected"><?php echo ucfirst(utf8_encode($menuresult1)); ?></option>
<?php } else {?>
<option value="<?php echo ucfirst(utf8_encode($menuresult1)); ?>"><?php echo ucfirst(utf8_encode($menuresult1)); ?></option>
<?php } ?><?php endforeach; ?>



Hvis ellers alt går vel, opdateres db længere nede:

if(isset($_POST['updateweekplan'])) {
    include("include/db/config.php");
    include("include/db/opendb.php");
   
    if((isset($_POST['dato'])) && (isset($_POST['course']))) {   
        $dato = $_POST['dato'];
        $course = $_POST['course'];

        if (count($dato) > 0) {
            for ($i=1;$i<=5; $i++) {
                $ugensdag = strftime('%A',strtotime($year."W".$week_number.$i));
                $ugensdato = strftime('%d/%m',strtotime($year."W".$week_number.$i));   

                $sqlupdateweekplan=("UPDATE minskolebod_dage SET dage_retter = '" . utf8_decode($course[1]) . "' WHERE dage_datoer = '$ugensdato'");
               
                $resultupdateweekplan=mysql_query($sqlupdateweekplan) or die(mysql_error());
            }
   
            if(isset($resultupdateweekplan)) {
                echo '<h2>Madplanen er opdateret og kan ses af alle</h2><p>Siden opdateres ...</p>';
                echo '<meta http-equiv="refresh" content="3;url=admin.php?side=addWeekPlan&week_no=' . $week_number . '" />';
                }
            }
    }
}

minskolebod_dage: dage_id | _ugedage | _datoer | _retter

Giver det mening?
02. juli 2013 - 10:09 #3
Det er nok mig der er for dum til at forstå dig.  Måske burde jeg stoppe her.  Jeg prøver en gang mere at forstå sammenhængen.  Så du har tabellen minskolebod_menuer, hvor du har alle retterne stående.  Formularen i dit oprindelige spørgsmål er ikke beregnet til at eleverne kan vælge middagsret som jeg troede.  I stedet er formålet, at bodens administrator kan vælge retter for den kommende uge og gemme sit valg i databasen.  Er det rigtigt forstået?

Jeg prøver så at forstå hvordan middagsretterne gemmes i databasen.  Hvis der kun vælges en enkelt ret per dag, så er det ligetil.  Tabellen minskolebod har en række for hver dag, og rettens id gemmes i feltet _retter.  Så kan man senere se retterne per dag ved en query "SELECT ....  FROM minskolebod_dage d JOIN minskolebod_retter r ON d.dage_retter = r.menuer_id"

Men jeg havde forstået, at der for hver dag skulle være tre retter at vælge imellem.  Så hvordan gemmer du det?  Har du for hver dag tre rækker i tabellen minskolebod_dage?

Det er også forvirrende, at den kode du viser i dit oprindelige spørgsmål forudsætter den kode du viser i #2 idet den bruger $result_array1 i løkken, men samtidig forudsætter koden i #2 koden i d$it oprindelige spørgsmål, idet du gør brug af variabler såsom $day og $dage_retter.  Kan du ikke lige vise hele koden som den hænger sammen?  Helst her, så alle kan se det og følge med.
Avatar billede allandk Nybegynder
02. juli 2013 - 10:18 #4
Det er rigtigt forstået; admin kan vælge en uge, fx uge 27. Udfra valget af uge bestemmes datointervallet mellem mandag og fredag.

Findes denne uge allerede i db (minskolebod_dage), vises retterne og man kan ændr/opdatere dem.

Findes de ikke, kan man vælge en ret (hentes fra minskolebod_menuer) i en dropdown (én for hver af de fem viste dage) og derefter gemme dem.

Giver det mere mening?
02. juli 2013 - 10:54 #5
Nej, desværre ikke.  Jeg forstår det du her fortæller om problemstillingen, men for at kunne forholde mig til en mulig løsning er der noget jeg er nødt til at vide og har spurgt om (er der altid kun en enkelt ret for en dag, eller kan der være flere retter? - hvis der kan være flere retter for en dag, hvordan gemmes det i databasen hvilke retter der hører til hvilke dage? - de koder du viser i dit oprindelige spørgsmål og i #2, hvordan hænger de sammen? - vis venligst hele koden,) men det vil du ikke ind på at snakke om.  Med de oplysninger du er parat til at fortælle mig kan jeg ikke komme videre, så jeg må stoppe.  Forhåbenligt er der andre der er klogere end mig og kan hjælpe.
Avatar billede allandk Nybegynder
02. juli 2013 - 11:41 #6
Der kan kun være én ret pr. dag og således kun fem pr. uge.
02. juli 2013 - 12:00 #7
Se det kunne du jo passende have fortalt mig, efter at jeg i #1 kom med den formodning, at der var tre retter per dag.  (Den formodning fik jeg fra ordlyden af dit oprindelige spørgsmål, det med en løkke med tre indeni en løkke med 5.)  Du sagde, at det var ganske rigtigt forstået!  Mine øvrige spørgsmål kommer du ikke ind på.  Så jeg må stoppe.  Jeg vil ikke spilde mere af din tid (og jeg må også selv igang med noget andet.)
Avatar billede allandk Nybegynder
02. juli 2013 - 14:52 #8
Tak for tiden hidtil.
Avatar billede allandk Nybegynder
02. juli 2013 - 17:12 #9
Jeg lukker... Du er velkommen til at smide et svar for ulejligheden. Jeg lukker senere i dag.
02. juli 2013 - 17:54 #10
I såfald, svar fra mig.
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

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