Avatar billede allandk Nybegynder
10. februar 2003 - 01:43 Der er 18 kommentarer og
2 løsninger

Min "while" lister ikke-eksisterende punkter?

Herunder følger koden (oprindelig fra http://www.eksperten.dk/spm/79305):

<?php
$cameFrom = $_SERVER['HTTP_REFERER'];

if ($slet) {
    unlink($slet);
    echo "Filen $slet er blevet slettet";
    }

else if ($kilde) {
    echo "<h2>Viser $kilde</h2>";
    show_source ($kilde);
    }

else if ($rediger) {
//    $redi = fopen($rediger);
    $redi=fopen($basedir.$rediger,"r");
    $contents=fread($redi,filesize($basedir.$rediger));
    fclose($redi);
    fclose($contents);
//    header("Location: $cameFrom");
?>

<form method="post" action="<?=$PHP_SELF; ?>?admin=manage&rediger=slet/vars.php">
<input type="hidden" name="filename" value="<?=$basedir; ?><?=$rediger; ?>">
<textarea rows="10" name="redi2" cols="50"><?=$contents; ?></textarea><br>
<input type="submit" value="submit" name="send">
<input type="reset" value="reset" name="b2">
</form>

<center><a href="<?=$cameFrom; ?>">Tilbage?</a></center>

<?php
    $redi1=fopen($rediger,"r+");
    fputs($redi1,$redi2);
    fclose($redi1);
    }
else {
    //fclose($redi1);
?>

<table border="1" width=100%>
    <tr>
        <td colspan=5>

        <form action="<?=$PHP_SELF?>?admin=manage" method=post>
        Indtast det præcise navn på filen der skal slettes, der tages forbehold for stort og småt!<br>
        Fil: <input type="text" size=30 name="Slet"><input value="Slet" type=submit>
        </form>

        </td>
    </tr>
    <tr>
        <td>#</td>
        <td>Se?</td>
        <td>Slet?</td>
        <td>Vis kilde...</td>
        <td>Rediger?</td>
    </tr>


<?php
    $filer=array();
    $dirname="side";
    $dir=opendir($dirname);
    while($fil=readdir($dir))
    if(is_file($dirname.'/'.$fil))array_push($filer,$fil);
    closedir($dir);

    while($t<=count($filer)) {
?>
<?php
/*    if (eregi('([^.]+)(\.doc|\.txt|\.css|\.php|\.png|\.gif|\.jpg)$',$dirname,$filer) && $filer!='index.php') {
    echo "<td><a href=\"index.php?admin=manage&slet=<?=$filer[$t]; ?>.php\">Test ".ereg_replace("[_,-]", " ", ucwords($a22[1]))."?</a></td>\n";
    }
*/
?>

        <tr>
            <td align=right width="15"><?=$t; ?>.</td>
            <td><a href="<?=$PHP_SELF; ?>?side=<?=$filer[$t]; ?>"><?=$filer[$t]; ?>?</a></td>
            <td><a href="<?=$PHP_SELF; ?>?admin=manage&slet=<?=$filer[$t]; ?>"><?=$filer[$t]; ?></a></td>
            <td><a href="<?=$PHP_SELF; ?>?admin=manage&kilde=side/<?=$filer[$t]; ?>"><?=$filer[$t]; ?></a></td>
            <td><a href="<?=$PHP_SELF; ?>?admin=manage&rediger=side/<?=$filer[$t]; ?>"><?=$filer[$t]; ?></a></td>
        </tr>

<?php
        $t++;
        }
    }
?>

</table>

Med ovenstående liste dokumenter fra angivne mappe - det fungerer fint, bortset fra, at der også vises et ekstra punkter før og efter de eksisterende filer.

Nogle der kan se en fejl?

Desuden tilføjer den tonsvis af \\\\\\ når jeg vælger Redigér og gemmer. Er der nogle der kan se en fejl i dén forbndelse?
Avatar billede jakoba Nybegynder
10. februar 2003 - 02:04 #1
mon ikke $t skal initieres til 0 før while løkken?
og betingelsen i den løkke skal være  $t < count($filer)  (ikke  <= )

mvh JakobA
Avatar billede abpdk Nybegynder
10. februar 2003 - 02:09 #2
...og hvis man kender fra- og til-værdierne for en løkke kan man lige så godt bruge en for-løkke.
Avatar billede allandk Nybegynder
10. februar 2003 - 02:11 #3
jakoba: Hvis jeg sætter $t = "0"; så tæller den godt nok den første fil med, men den tilføjer stadigvæk en mere til sidst.

Jeg kan ikke se, hvor jeg skal ændre betingelsen i min løkke...

abpdk: Så øvet er jeg ikke ;-)
Avatar billede jakoba Nybegynder
10. februar 2003 - 02:14 #4
det er fordi du stadig tester  $t <= count  det skal være  $t < count
apbdk's forslag er nu også værd at følge. en for-løkke er det korrekte her.
Avatar billede abpdk Nybegynder
10. februar 2003 - 02:14 #5
Din løkke kører sikkert én for lang fordi, som jacoba også skriver, du spørger på <= og ikke <, derfor bliver den også udført for t=count($files). Prøv med bare <.
Avatar billede jakoba Nybegynder
10. februar 2003 - 02:16 #6
istedetfor:
  while($t<=count($filer)) {
skriver du
  for ( $t=0; $t<count($filer); $t++ )

og sidst i løkken slettes linien
      $t++;
Avatar billede allandk Nybegynder
10. februar 2003 - 02:21 #7
Hm, den laver et lukket løb uden data, med ovenstående for...
Avatar billede abpdk Nybegynder
10. februar 2003 - 02:22 #8
Du tror ikke du kom til at stave $filer forkert eller sådan noget?
Avatar billede allandk Nybegynder
10. februar 2003 - 02:24 #9
Jeg har indført ændringer her:

<?php
    $t = "0"; // tilføjet efter forslag fra jakoba

    $filer=array();
    $dirname="side";
    $dir=opendir($dirname);
    while($fil=readdir($dir))
    if(is_file($dirname.'/'.$fil))array_push($filer,$fil);
    closedir($dir);

    for ( $t=0; $t<count($filer); $t++ )

//    while($t< count($filer)) { // tilføjet efter forslag fra jakoba
//    while($t<=count($filer)) { // ugyldig

/*    if (eregi('([^.]+)(\.doc|\.txt|\.css|\.php|\.png|\.gif|\.jpg)$',$dirname,$filer) && $filer!='index.php') {
    echo "<td><a href=\"index.php?admin=manage&slet=<?=$filer[$t]; ?>.php\">Test ".ereg_replace("[_,-]", " ", ucwords($a22[1]))."?</a></td>\n";
    }
*/
?>

        <tr>
            <td align=right width="15"><?=$t; ?>.</td>
            <td><a href="<?=$PHP_SELF; ?>?side=<?=$filer[$t]; ?>"><?=$filer[$t]; ?>?</a></td>
            <td><a href="<?=$PHP_SELF; ?>?admin=manage&slet=<?=$filer[$t]; ?>"><?=$filer[$t]; ?></a></td>
            <td><a href="<?=$PHP_SELF; ?>?admin=manage&kilde=side/<?=$filer[$t]; ?>"><?=$filer[$t]; ?></a></td>
            <td><a href="<?=$PHP_SELF; ?>?admin=manage&rediger=side/<?=$filer[$t]; ?>"><?=$filer[$t]; ?></a></td>
        </tr>

<?php
//        $t++; // skal aktiveres, hvis der bruges while, se ovenfor...
//        }
    }
?>
Avatar billede jakoba Nybegynder
10. februar 2003 - 02:25 #10
Næe, det er mig der har kvajet mig. jeg glemte  {  sidst i for-linien
  for ( $t=0; $t<count($filer); $t++ ) {
Avatar billede abpdk Nybegynder
10. februar 2003 - 02:26 #11
Og så skal der selvfølgelig ikke stå $t=0 øverst nu du bruger en for-løkke.
Avatar billede abpdk Nybegynder
10. februar 2003 - 02:27 #12
Og ellers skulle der ha' stået lige før while-løkken. Ellers mister man bare overblikket.
Avatar billede abpdk Nybegynder
10. februar 2003 - 02:29 #13
(der ha' = det ha')
Avatar billede allandk Nybegynder
10. februar 2003 - 02:32 #14
Nu virker det :-)

Jeg har et par bonusspørgsmål, hvis I gider mere... (jeg dobler naturligvis op).

Kan jeg får den til at starte tælling ved 1?
Kan jeg fjerne endelsen .php?
Har noglen af jer testet scriptet og set fejlen når man redigerer en fil?
Avatar billede abpdk Nybegynder
10. februar 2003 - 02:33 #15
Ja, du sætter bare for-løkken til at starte med $t=1.
Nej, ikke uden at ændrer på opsætningen af web-serveren.
Nej, har ikke lige testet det.
Avatar billede abpdk Nybegynder
10. februar 2003 - 02:34 #16
...og du behøver ikke doble op for min skyld.
Avatar billede allandk Nybegynder
10. februar 2003 - 02:37 #17
Hvis jeg ændrer $t til =1 så tæller den ikke den sidste fil med. Lige nu er 6 filer som tælles fra 0-6, men hvis $t=1 så tæller den fra 1-5.
Avatar billede jakoba Nybegynder
10. februar 2003 - 02:37 #18
du kan starte med hvad tal du vil. de filer i arrayet der er før det tal bliver så ikke listet:
  for ( $t=1; $t<count($filer); $t++ ) {  // $filer[0] kommer ikke med
Avatar billede allandk Nybegynder
10. februar 2003 - 02:40 #19
Ok, jeg siger tak til jer begge.

jakoba: svarer du lige?
Avatar billede jakoba Nybegynder
11. februar 2003 - 01:56 #20
ok. takker
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