Search code examples
phpmkdir

mkdir create a folder in ../ - failed to open stream


Folder structure (windows)

[root] level 0
      - [lib] level 1
        - core.php
      - [logs] level 1
         -[preg_match number] level 2
          - preg_match number.log
      - [ajax] level 1
         - log_gen.php
      - log_gen_root.php 
[/root]

lib/core.php fragment of the generator

if (preg_match('~\d{24}~', $fname, $m)){
//var_dump($m[1]);
    if (!file_exists('logs/'.$m[0])) {
    mkdir('logs/'.$m[0], 0777, true);
}
}

I have located in lib/core.php the mkdir function, the preg_match gets the number ( as $fname ) and returns the number ( as $m[0] ).. There are two options

$fname equal to : variant 1. First variant is created from the root folder for example log_gen_root.php, everything works here

logs/544444466666666666666667/544444466666666666666667.log

$fname equal to : variant 2. The second variant is when I try to access the same mkdir from location ajax/log_gen.php which results in an error. In both cases the log folder is placed in root.

../logs/544444466666666666666666/544444466666666666666666.log

Warning: file_put_contents(../logs/544444466666666666666666/544444466666666666666666.log): failed to open stream: No such file or directory in C:\xampp\htdocs\proj\lib\core.php on line 103


Solution

  • Two things could be happening here:

    1. You don't have the correct permissions on the lib directory to create a new folder
    2. Your path is incorrect.

    Try using the below code to grab the directory instead of using relative paths.

    $folder = realpath(__DIR__ . '/..') . '/lib/';
    
    if (!file_exists($folder . $m[0])) {
        mkdir($folder . $m[0], 0777, true);
    }