Avatar billede lsskaarup Nybegynder
08. september 2010 - 10:36 Der er 16 kommentarer og
1 løsning

Tjekke hvor langt en while er kommet

Simpelt spørgsmål men er der ikke en funktion til at jekke hvor langt man er kommet i en while(), hvor udtrækket kommer fra en database?

Jeg skal nemlig have udført en enkelt ting, når whilen er løbet igennem alle records.
Avatar billede lsskaarup Nybegynder
08. september 2010 - 10:43 #1
Eller bliver jeg nød til at lave en tæller, trække antallet af records ud, og så sammenlige disse?
Avatar billede repox Seniormester
08. september 2010 - 10:43 #2
Ikke forstået?

Når din while løkke er slut, er du jo løbet igennem alle records?
Avatar billede lsskaarup Nybegynder
08. september 2010 - 11:06 #3
Jeg har følgende kodestump

                       
$counter=1;
$ar = mysql_num_rows($fore);
while ($fores = mysql_fetch_array($fore)) {
    if ($fores['kolonnenr'] == 0){
        $fores['kolonnenr'] = 1;
    }
    if ($fores['kp_id'] == 0){
        $fores['kp_id'] = 0;
    }
                                    ?>
        <input type="text" class="inputextrasmall" name="kostpris[<?php echo $fores['id'];?>][<?php echo $fores['kolonnenr'];?>][<?php echo $fores['kp_id'];?>]" value="<?php echo $fores['kostpris']; ?>" <?php if ($kolonner_låst['kolonne'][$k_tæller] == $k_tæller+1 && $kolonner_låst['låst'][$k_tæller] == '1') echo "readonly";?> />
        <?php
    if ($counter == $ar && $fores['låst'] == "1") {
    //Skal kun udføres efter sidste celle/kolonne, hvis denne er låst?>
        <input type="text" class="inputextrasmall" name="kostpris[<?php echo $fores['id'];?>][<?php echo $fores['kolonnenr']+1;?>][]">
                                    <?php }
    $counter+=1;
}

Jeg laver altså nogle inputfelter ud fra dataudtrækket, men sidste felt skal jeg tjekke på om det er låst eller ej. Er det låst skal jeg lave et nyt tomt felt.
Avatar billede repox Seniormester
08. september 2010 - 11:17 #4
Den sidste $fores array vil alligevel være tilgængelig efter while-løkken slutter.

Gør noget ala:
while ( $fores = mysql_fetch_array($fore) ):
    if ($fores["kolonnenr"] == 0)
        $fores["kolonnenr"] = 1;
   
    if ($fores["kp_id"] == 0)
        $fores["kp_id"] = 0;
?>
    <input type="text" class="inputextrasmall" name="kostpris[<?php echo $fores['id'];?>][<?php echo $fores['kolonnenr'];?>][<?php echo $fores['kp_id'];?>]" value="<?php echo $fores['kostpris']; ?>" <?php if ($kolonner_låst['kolonne'][$k_tæller] == $k_tæller+1 && $kolonner_låst['låst'][$k_tæller] == '1') echo "readonly";?> />     
<?php endwhile; ?>

<?php if( $fores["låst"] == 1 ): ?>
    <input type="text" class="inputextrasmall" name="kostpris[<?php echo $fores['id'];?>][<?php echo $fores['kolonnenr']+1;?>][]">
<?php endif; ?>
Avatar billede jannick281090 Nybegynder
08. september 2010 - 11:22 #5
repox -> Tror han mener at han gerne vil ekserkvere forskellige stykker kode alt efter hvor langt løkken er.

Ovenstående kan som du selv skrev opnåes ved hjælp af at lave en counter og så tjekke på værdien inde i din løkke, og derefter ekserkvere det stykke kode du ønsker.

Har lige foretaget nogle mindre rettelser i din kode så test lige om det virker :)

<?php
$counter = 0;
$ar = mysql_num_rows($fore);
while ($fores = mysql_fetch_array($fore)) {
    if ($fores['kolonnenr'] == 0){
        $fores['kolonnenr'] = 1;
    }
    if ($fores['kp_id'] == 0){
        $fores['kp_id'] = 0;
    }
    ?>
    <input type="text"
          class="inputextrasmall"
          name="kostpris[<?php echo $fores['id'];?>][<?php echo $fores['kolonnenr'];?>][<?php echo $fores['kp_id'];?>]"
          value="<?php echo $fores['kostpris']; ?>" <?php if ($kolonner_låst['kolonne'][$k_tæller] == $k_tæller+1 && $kolonner_låst['låst'][$k_tæller] == 1) echo "readonly";?> />
    <?php
    if ($counter == $ar && $fores['låst'] == "1") {
        //Skal kun udføres efter sidste celle/kolonne, hvis denne er låst?>
        <input type="text" class="inputextrasmall" name="kostpris[<?php echo $fores['id'];?>][<?php echo $fores['kolonnenr']+1;?>][]">
        <?php
        $counter++;
    }
}
?>
Avatar billede lsskaarup Nybegynder
08. september 2010 - 11:41 #6
repox -> Tror han mener at han gerne vil ekserkvere forskellige stykker kode alt efter hvor langt løkken er.

Tja, det er kun efter den sidste og kun hvis den har en bestemt værdi.

Den sidste $fores array vil alligevel være tilgængelig efter while-løkken slutter.

Hvis jeg smider
if($fore[låst]==1)
uden for while-løkken sker der ikke noget, selvom den sidste record er låst=1

Men det er ikke noget I skal bruge lang tid på, jeg har løst det via en tæller. Jeg undrede mig bare, og mente at der da måtte være en mere elegant løsning.
Avatar billede repox Seniormester
08. september 2010 - 11:46 #7
if($fore[låst]==1)

er jo også forkert - du skal bruges $fores - ikke $fore
Avatar billede lsskaarup Nybegynder
08. september 2010 - 12:54 #8
Ja, selvfølgelig det var en tyrkfejl... ;-)

Men det gør nu ikke den store forskel. Jeg tror altså den bliver tømt, for prøver jeg bare at echo'er $fores['låst'] får jeg ikke noget ud.

Og det er jo et eller andet sted klart nok, for $fores bliver og først lavet i while og dør vel også sammen med den.
Avatar billede repox Seniormester
08. september 2010 - 12:56 #9
Nej, din while løkke mister ingen data efter indkapslingen... er du sikker på det ikke er dit indeksnavn der fejler? Virker $fores["låst"] korrekt i de andre rækker?
Avatar billede lsskaarup Nybegynder
08. september 2010 - 13:18 #10
Laver jeg præcist den samme kode inde i whilen, så virker det.
Avatar billede repox Seniormester
08. september 2010 - 13:20 #11
Pøv at lave:
var_dump($fores)

lige efter while løkken og fortæl mig hvad den siger...
Avatar billede lsskaarup Nybegynder
08. september 2010 - 15:25 #12
Så returnerer den bool(false)
Avatar billede coderdk Praktikant
08. september 2010 - 21:22 #13
Før din $counter++ bare lav en $last = $fores; så har du den sidste, efter dit while-loop, eller hvis du kun skal bruge den, $locked = $fores['locked'] eller lignende.
Avatar billede repox Seniormester
09. september 2010 - 09:19 #14
#12
Hvis jeg havde tænkt mig lidt mere om, er det naturligvis klart at den returnerer false. Idét while() fortsætter så længe at mysql_fetch_array() returnerer en række (da det i sig selv evaluerer som sandt) vil den sidste omgang i løkken mysql_fetch_array() returnere false og $fores værdi er dermed også false.

Det 'hurtige' fiks på det kunne være:
while ( $tmp = mysql_fetch_array($fore) ):
    $fores = $tmp;
    if ($fores["kolonnenr"] == 0)
    ...


Årsagen er at $fores ikke bliver overskrevet efter at $tmp evalueres som false.
Avatar billede lsskaarup Nybegynder
09. september 2010 - 19:35 #15
Hvis jeg havde tænkt mig lidt mere om, er det naturligvis klart at den returnerer false. Idét while() fortsætter så længe at mysql_fetch_array() returnerer en række (da det i sig selv evaluerer som sandt) vil den sidste omgang i løkken mysql_fetch_array() returnere false og $fores værdi er dermed også false.

Det 'hurtige' fiks på det kunne være:

while ( $tmp = mysql_fetch_array($fore) ):    $fores = $tmp;    if ($fores["kolonnenr"] == 0)    ...

Årsagen er at $fores ikke bliver overskrevet efter at $tmp evalueres som false.


Det er jo egentlig meget logisk, når du forklarer det sådan. Jeg har løst det på en anden måde, men det kan da være jeg skal bygge koden om.

Smid et svar.
Avatar billede repox Seniormester
09. september 2010 - 19:46 #16
Det fik du her
Avatar billede lsskaarup Nybegynder
09. september 2010 - 22:05 #17
og tak for hjælpen
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