首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >php中substr和mkdir函数的奇怪结果

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

Stack Overflow用户
提问于 2013-03-18 07:03:57
回答 1查看 188关注 0票数 0

我有一个php的fileupload,但这是无关紧要的,因为我真正的问题是我有以下代码:

代码语言:javascript
运行
复制
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()
));

}

THe文件被上传,我正在从实际的时间戳和真实的文件名创建一个sha1散列。在我用substr()对它们进行裁剪之后,这里有个棘手的部分。mkdir不是用截断的字符串创建目录,而是用奇怪的另一种组合。我不知道我做错了什么。你能帮我看一下吗?

EN

Stack Overflow用户

回答已采纳

发布于 2013-03-18 07:10:42

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

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

并且请删除$do = ;

在"dev mod“下,

会显示一个错误:警告: sha1()最多需要2个参数,给定3个

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

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

代码语言:javascript
运行
复制
<?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>

您可以检查它,但问题是应该用substr替换您的sha1函数

更新2

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

php.net substr上阅读substr的手册,并根据您的需要进行调整,顺便说一句,它非常基础。

substr的三个参数是$STRING, $START and $LENGTH which is optionalphp.net的摘录可能会让你明白这一切:

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

在我看来,下面的部分会让你更清楚地了解它(注意负面的部分)

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

如果长度是给定的,并且是负数,那么从字符串的结尾将省略这些字符(在开始位置为负数的情况下计算出开始位置之后)。如果start表示此截断的位置或更远,将返回false。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15467358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档