Avatar billede lsskaarup Nybegynder
02. december 2010 - 16:59 Der er 12 kommentarer og
1 løsning

Hjemmelavet stifinder driller

Jeg har fortsat gang i et projekt, med at opgradere et intranet til nyere verionser af bl.a. php.

Derfor løber ind i nogle ting, som ikke virker længere bl.a. dette.

Jeg har en lille stifinder, som kigger i en bestemt mappe på en server, ud fra et tilbuds- eller ordre-nummer. Samtidig oprettet stifinderen hovedmappen + nogle forudbestemme undermapper, hvis disse ikke findes.

Men efter jeg har opgraderet php, så virker stifinderen ikke længere.

Jeg får bl.a. følgende fejl
Warning: mkdir() [function.mkdir]: File exists in C:\wamp\www\stifinder.php on line 22

Warning: mkdir() [function.mkdir]: Invalid argument in C:\wamp\www\stifinder.php on line 22
Derudover får jeg også denne fejl, selvom det ikke er mkdir, så tror jeg faktisk de har noget med hinanden at gøre.
Warning: Invalid argument supplied for foreach() in C:\wamp\www\stifinder.php on line 254


Det er som om at stien som funktionerne får ikke er helt korrekt, for når jeg tester i funktion forceDir, så returnere explode() ikke noget i de 2 første elementer af arrayet, altså [0] og [1].

Men jeg har stirret mig blind på koden nu, kan bare ikke se hvad fejlen er, så nu får I chancen... :-)

Koden:

<?php
    include('static/opsaetning.php');
     
/*
echo '<p>$SERVER: '.$SERVER.'</p>';
echo $KATALOG."<br>";
echo $SERVER."<br>";
*/
function forceDir($dir){//Funktion der opretter alle undermapper
    echo $dir."<br>";
    $subs = explode('/', $dir);
    echo $subs[1]."<br>";
    $tmp = '';
    foreach($subs as $name){
        echo $name."<br>";
        $tmp = $tmp . $name;
        //echo $tmp."<br>";
        echo file_exists($tmp);
        if (!file_exists($tmp)) {
            echo $tmp."<br>";
            echo "Filen findes ikke";
            mkdir( $tmp );
          }
          $tmp = $tmp . '/';
      }
    return $dir;
}


function showDir($root, $dir) {

    include('static/opsaetning.php');

    //$KATALOG = "katalognavnet";
    $SERVER = "servernavnet";

    $filliste = array();
    //$showdir = "//" . $SERVER . "/" . $KATALOG . "/" . $root;
    $type = substr("$root", 0, strpos($root, "/"));
    $mappe1;
    $mappe2;
    if ($type == Tilbud) {//Tjekker hvilken type sagen er, tilbud/ordre
        $num = substr("$root", -6);
        $mappe1 = substr($num, -5, 1);
        $mappe2 = substr($num, -4, 1);
        $ubermappe = substr($num, -6, 2);
        $slutmappe;
        $mapper = $mappe1 . $mappe2;

        if ($mapper > 9){
            $startmappe = $mappe2 . "000";
        } else {
            $startmappe = $mapper . "000";
        }

        if ($mappe1 == 0){
            $slutmappe = (($mappe2 +1) . "000") - 1;
            $startmappe = $mappe2 . "000";
        } else {
            $slutmappe = ((($mappe1 . $mappe2)+1) . "000" -1);
        }


        if ($slutmappe<"1000"){
            $mappenavn = $ubermappe . $startmappe ."-". $ubermappe . "0".$slutmappe;
        } else {
            if($slutmappe > 10000){
                $mappenavn = $ubermappe . $startmappe ."-". substr($ubermappe, -2, 1) . $slutmappe;
            } else {
                $mappenavn = $ubermappe . $startmappe ."-". $ubermappe . $slutmappe;
            }
        }
       
        $mappenavn;

        $root = $type . "/" . $mappenavn . "/" . $num;
    } else {
        $num = substr("$root", -5);
        $mappe1 = substr($num, -4, 2);
        if ($mappe1 > 9) {
            $mappe2 = $mappe1+1;
        } else {
            $mappe1 = substr($num, -3, 1);
            $mappe2 = $mappe1 +1;
        }

        $ubermappe = substr($num, -6, 2);//retunere de 2 første cifre
        if ($mappe1 > 9){
            $mappe1 = substr($num, -3, 1);
            $mappe1 = $mappe1 . "00";

        } else {
            $mappe1 = $mappe1 . "00";
        }

        //Laver slutmappen
        $slutmappe1 = ((substr($num, -3, 1) + 1)."00") -1;
        if ($slutmappe1 < 100) {
            $slutmappe1 = "0". $slutmappe1;
        }

        $mappenavn = $ubermappe . $mappe1 . "-" . $ubermappe . $slutmappe1;
        $root = $type . "/" . $mappenavn . "/" . $num;
    }

    //echo $type;

    $showdir = "//" . $SERVER . "/" . $KATALOG . "/" . $root;


    forceDir($showdir);//Kalder funktion som opretter undermapper

    if ($type == Tilbud) {

        for($i=1; $i<=count($TILBUD); $i++){
            $mail = "//" . $SERVER . "/" . $KATALOG . "/" . $root . "/" . $TILBUD[$i];
   
            /*     Tjekker mappens navn, er de 2 første tegn ikke 0_,
                tjekkes der for om mappen findes i forvejen med 0_ foran i mappenavnet.
                Findes den ikke, så oprettes der en mappe men uden 0_ i navnet
            */
            if( substr($TILBUD[$i], 0, 1) != "0_") {
                $tmpMail = "//" . $SERVER . "/" . $KATALOG . "/" . $root . "/0_" . $TILBUD[$i];
                if ( !file_exists($tmpMail) ) {
                    mkdir($mail);
                } else {
                    mkdir($tmpMail);           
                }
            }
        }
    } else {
   
            for($i=1; $i<=count($ORDRE); $i++){
            $mail = "//" . $SERVER . "/" . $KATALOG . "/" . $root . "/" . $ORDRE[$i];
           
            /*     Tjekker mappens navn, er de 2 første tegn ikke 0_,
                tjekkes der for om mappen findes i forvejen med 0_ foran i mappenavnet.
                Findes den ikke, så oprettes der en mappe men uden 0_ i navnet
            */
            if( substr($ORDRE[$i], 0, 1) != "0_"){
                $tmpMail = "//" . $SERVER . "/" . $KATALOG . "/" . $root . "/0_" . $ORDRE[$i];
                if ( !file_exists($tmpMail) ) {
                    mkdir($mail);
                } else {
                    mkdir($tmpMail);           
                }
            }
        }
   
    }

if($dir != ""){
    $showdir .= $dir;
    $filliste[] = "<a href=\"stifinder.php?root=$root&dir=" . substr_replace($dir, '', strrpos($dir, '/')    ) . "\"> <img src=\"/gfx/mappe.gif\" border=\"0\" width=\"18\"> </a>
            <a href=\"stifinder.php?root=$root&dir=" . substr_replace($dir, '', strrpos($dir, '/')    ) . "\">..</a>";
}


$files = array();
$dirs = array();
if ( $dh = opendir( $showdir ) ) {
    while ( $fil = readdir( $dh ) ) {
        if ( is_dir( $showdir . '/' . $fil ) && $fil != '.' && $fil != '..' ) {
            $dirs[] = $showdir . '/' . $fil;
              } else if ( !is_dir( $showdir . '/' . $fil ) ) {
                $files[] = $showdir . '/' . $fil;
        }
      }
}

sort( $dirs );
sort( $files );

if(count($dirs)<1){
    echo "<a href=\"stifinder.php?root=$root&dir=" . substr_replace($dir, '', strrpos($dir, '/')    ) . "\"> <img src=\"/gfx/mappe.gif\" border=\"0\" width=\"18\"> </a>
                <a href=\"stifinder.php?root=$root&dir=" . substr_replace($dir, '', strrpos($dir, '/')    ) . "\">..</a>";
} else {
    for($i=0;$i<count($dirs);$i++){
        echo "<a href=\"stifinder.php?root=$root&dir=".$dir."/".basename($dirs[$i])."\"> <img src=\"/gfx/mappe.gif\" width=\"18\" border=\"0\"> ".basename($dirs[$i])." </a><br>";
    }
}

for($i=0;$i<count($files);$i++){
    $tmp=explode( '.', basename($files[$i]) );
    if(strtolower($tmp[1]) == "rtf" || strtolower($tmp[1]) == "doc" || strtolower($tmp[1]) == "docx") {
        $ikon="/gfx/ikon_word.gif";
    } else if(strtolower($tmp[1]) == "xls" || strtolower($tmp[1]) == "xlsx") {
        $ikon="/gfx/ikon_excel.gif";
    } else if(strtolower($tmp[1]) == "pdf") {
        $ikon="/gfx/ikon_pdf.gif";
    } else {
        $ikon="/gfx/ikon_fil.gif";
    }

    echo "<a target=\"_blank\" href=\"file:".$files[$i]."\"> <img src=\".$ikon.\" width=\"18\" border=\"0\"> ".basename($files[$i])." </a><br>";
}

}
?>

<html>
<style>
body, table, tr, td {
    margin-bottom : 0px;
    margin-left : 0px;
    margin-right : 0px;
    margin-top : 0px;
    font-family : Geneva, Arial, Helvetica, sans-serif;
    font-size: 13px;
}
a {
    text-decoration: none;
    color: black;

}
</style>
<body>
<table width="500">
<?php
$filliste = showDir($_GET['root'], $_GET['dir']);
foreach($filliste as $fil) {
  echo "<tr><td>$fil</td></tr>";

}

?>
</table>
</body>
</html>

Avatar billede majbom Novice
02. december 2010 - 17:16 #1
et hurtigt kig på din funktion forceDir siger mig at $tmp ikke bliver sat til ""; for hver iteration, og derfor bliver der "bygget videre på den" og er derfor kun korrekt første gang løkken kører.
Avatar billede The_Buzz Novice
02. december 2010 - 17:22 #2
what splazz sagde...
Avatar billede lsskaarup Nybegynder
02. december 2010 - 20:22 #3
Mener I at den markerede linje i nedenstående ikke bliver sat korrekt?

function forceDir($dir){//Funktion der opretter alle undermapper
    echo $dir."<br>";
    $subs = explode('/', $dir);
    echo $subs[1]."<br>";
    $tmp = ''; <===================================
    foreach($subs as $name){
        echo $name."<br>";
        $tmp = $tmp . $name;
        //echo $tmp."<br>";
        echo file_exists($tmp);
        if (!file_exists($tmp)) {
            echo $tmp."<br>";
            echo "Filen findes ikke";
            mkdir( $tmp );
          }
          $tmp = $tmp . '/';
      }
    return $dir;
}
Avatar billede majbom Novice
02. december 2010 - 20:45 #4
ja, det ville giver mere mening at have den som det første i din foreach
Avatar billede majbom Novice
02. december 2010 - 20:45 #5
give*
Avatar billede lsskaarup Nybegynder
02. december 2010 - 20:56 #6
Hvordan det?

Jeg skal lige sige her, at det ikke er mig, der har lavet koden, det er et system jeg har "arvet", og kender derfor ikke tanken bagved.
Avatar billede majbom Novice
02. december 2010 - 21:06 #7
nej undskyld, det gik for stærkt - bare glem hvad jeg skrev...

kigger nærmere på det hvis ikke en anden kommer mig i forkøbet...
Avatar billede lsskaarup Nybegynder
02. december 2010 - 21:12 #8
Helt i orden, et eller andet må der jo være galt, siden det ikke virker.
Avatar billede miqe Nybegynder
03. december 2010 - 00:27 #9
Windows system?
Forstår mkdir() og file_exists() forward slashes (/) i stier?

Nedenstående 2 linjer antyder muligvis hvorfor foreach() fejler:
$showdir = "//" . $SERVER . "/" . $KATALOG . "/" . $root;
forceDir($showdir);//Kalder funktion som opretter undermapper

explode('/', "//" . $SERVER . "/" . $KATALOG . "/" . $root);
->
0. ""
1. ""
2. "Indhold af $SERVER"
3. "Indhold af $KATALOG"
4. "Indhold af $root"
Avatar billede lsskaarup Nybegynder
03. december 2010 - 13:08 #10
Ja, det er på Windows.

Det slog mig også i går, at explode kommer til at være tom i de 2 første.

Omvendt sådan har det altid været, og på den tidligere version, virker det godt nok, og det er det der undre mig. Funktionerne kan selvfølgelig godt være ændret, men jeg kan ikke finde forskellen fra før og til nu.

Kan det være en indstilling i ini-filen, der definerer at warnings ikke skal vises?
Avatar billede lsskaarup Nybegynder
04. december 2010 - 20:00 #11
Foreach fejler fordi $filliste ikke var et array. Tilføjede jeg [], så får jeg ikke den fejl længere. Dem gamle version af php har så bare ikke være så pirlig med typerne.

Men jeg har stadig problemer med at den mkdir() advarer om at filen findes, selvom der tjekkes for dette.
Avatar billede lsskaarup Nybegynder
04. december 2010 - 20:36 #12
Sådan, nu tror jeg den er løst.

function forceDir($dir){//Funktion der opretter alle undermapper
    $subs = explode('/', $dir);
    $tmp = '';
    foreach($subs as $name){
        $tmp = $tmp . $name;
        if ($tmp != "" && $tmp != "/" && $tmp != "//srv-fil2") {
            if (!file_exists($tmp)) {
                mkdir( $tmp );
            }
        }
          $tmp = $tmp . '/';
      }
    return $dir;
}


Netop fordi explode gør at der ikke er noget i de 2 første arrayelementer, så "fejler" mkdir, eller rettere den siger de allerede findes. Hvis jeg tager højde for en tom + en /, så undgår jeg den fejl.

Den sidste fejl, men at mkdir() melder invalid argument tilbage skyldes, at den åbenbart ikke forstår //SERVER. Den kan selvfølgelig heller ikke oprette en server, men hvorfor fejlede den så ikke på det før?

Men miqr, du bragte mig tættere på løsningen, så point til dig.
Avatar billede miqe Nybegynder
04. december 2010 - 21:57 #13
Glad for at du kom tættere på.
Må hellere lægge et svar så :-)

mkdir skal have et path den forstår.
Har personligt ikke set "//" blive brugt i roden før, men skal ikke kunne sige om det er rigtigt eller forkert.

Prøv at ændre forekomsterne af "//". til indholde en absolut sti til dine kartotekers rodmappe "/path/to/myroot/".
eller en variable der indeholder denne sti. $PATH = "/path/to/myroot/"
$SERVER antyder at du har lokalt kartotek for forskellige servere.

For $SERVER = "example.com" og $KATALOG = "Katalog1"
får du
$PATH . $SERVER . "/" . $KATALOG . "/" . $root
->
"/path/to/myroot/example.com/Katalog1/".$_GET['root']
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