代码之家  ›  专栏  ›  技术社区  ›  rsz

php中substr和mkdir函数的奇怪结果

  •  0
  • rsz  · 技术社区  · 11 年前

    我用php上传了一个文件,但这无关紧要,因为我真正的问题是我有这样的代码:

    if (!empty($_FILES)) {
        $tempFile = $_FILES['Filedata']['tmp_name'];
    $real = $_FILES['Filedata']['name'];
    $finfo = pathinfo($real);
    $time = time();
    $rand1 = substr(sha1($real.$time),0,4);
    $rand2 = substr(sha1($real.$time),5,-22);
    $fname = preg_replace("#[^A-Za-z1-9]#","_", $_FILES['Filedata']['name']);
    mkdir(UPLOAD_TO."/".$rand2,0777);
    $targetFile = UPLOAD_TO."/".$rand2."/".$real;
                move_uploaded_file($tempFile,$targetFile);
       $query = $db->prepare("INSERT INTO files (realname,filename,extension,filesize,rand1,rand2,uppedby,created) VALUES(:real,:filename,:extension,:filesize,:rand1,:rand2,:uppedby,:created)");
    $query->execute(array(
    ":real" => $real,
    ":filename" => $fname,
    ":extension" => $finfo['extension'],
    ":filesize" => filesize($tempFile),
    ":rand1" => $rand1,
    ":rand2" => $rand2,
    ":uppedby" => $_SERVER['REMOTE_ADDR'],
    ":created" => time()
    ));
    
    }
    

    这个文件已经上传,我正在根据实际的时间戳和实际的文件名创建一个sha1哈希。在我用切割它们之后 substr() 但也有棘手的部分。mkdir不是用剪切的字符串创建目录,而是用奇怪的另一种组合创建目录。 我不知道自己做错了什么。你能看一下吗?

    1 回复  |  直到 11 年前
        1
  •  1
  •   Davit    11 年前

    $rand2 = sha1(sha1($real.$time),0,4);

    这应该是 $rand2 = substr(sha1($real.$time),0,4); #随机2

    请删除 $do = ;

    Under "dev mod" an error would show up:
    
    Warning: sha1() expects at most 2 parameters, 3 given
    

    只是你有一个打字错误或类似的东西

    我用这样的代码在本地服务器上快速检查了一下,它就工作了

    <?php
    DEFINE('UPLOAD_TO',"C:/env/php/www/tests/");
    if (!empty($_FILES))
    {
        $tempFile = $_FILES['Filedata']['tmp_name'];
        $real = $_FILES['Filedata']['name'];
        $finfo = pathinfo($real);
        $time = time();
        $rand1 = substr(sha1($real.$time),0,4);
        $rand2 = substr(sha1($real.$time),5,-22);
        $fname = preg_replace("#[^A-Za-z1-9]#","_", $_FILES['Filedata']['name']);
        mkdir(UPLOAD_TO."/".$rand2,0777);
        $targetFile = UPLOAD_TO."/".$rand2."/".$real;
        move_uploaded_file($tempFile,$targetFile);
    }
    ?>
    <form method="POST" enctype="multipart/form-data" action="">
        <input type="file" name="Filedata" />
        <input type="submit" />
    </form>
    

    你可以检查一下,但问题是你 sha1 应替换为 substr

    更新2

    由于您的文件夹名称有问题,并且对其名称不满意,您可以尝试更改 $rand2 = substr(sha1($real.$time),5,-22); $rand2 = substr(sha1($real.$time),1,5);

    阅读substr的手册 php.net substr 并且适合你的需求,这是非常基本的。

    substr的三个参数是 $STRING, $START and $LENGTH which is optional 。摘录自 php.net 可能会为您清除一切:

    如果start为非负数,则返回的字符串将从 字符串中的起始位置,从零开始计数。例如,在 字符串“abcdef”,位置0处的字符为“a”,位置 位置2是“c”,依此类推。

    在我看来,下面的部分会让你更清楚 (注意反面部分)

    如果给定长度并且为正,则返回的字符串将包含 从开始最多包含个字符(取决于 字符串的长度)。

    如果长度是给定的并且是负数,那么那么那么多字符将是 从字符串末尾省略(在开始位置 当开始为负时计算)。如果start表示 此截断或超过此截断,将返回false。