繁体   English   中英

PHP mkdir 不再工作

[英]PHP mkdir doesn't work anymore

所以我有这段代码,起初 mkdir 工作正常,直到我想用 $category 和 $random 稍微调整它,即使现在我反转它也不起作用也许你可以帮助我? 另外如何生成 $random 代码并检查它是否已经存在并循环直到找到空闲代码?

<?php

require_once('admin/connection.php');

$email=$_POST['email'];
$first_name=$_POST['first_name'];
$last_name=$_POST['last_name'];
$description=$_POST['description'];
$category=$_POST['category'];
$fileToUpload=$_POST['fileToUpload'];



  if(isset($_POST['submit'])){
    $numbers = range(6, 1);
            $random = '';
            shuffle($numbers);
            foreach ($numbers as $number) {
                $random.= $number;
            }

if ("SELECT `application_ID` FROM `applications` WHERE `application_ID` = '".$random."'") {
            $numbers = range(6, 1);
            $random = '';
            shuffle($numbers);
            foreach ($numbers as $number) {
                $random.= $number;
            }
}


if (!file_exists("uploads/$category/$random")) {
    mkdir("uploads/$category/$random", 0777, true);
}
$target_dir = "uploads/$category/$random";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = pathinfo($target_file,PATHINFO_EXTENSION);
// Check if file already exists
if (file_exists($target_file)) {
    echo "Sorry, file already exists.";
    $uploadOk = 0;
}
// Check file size
if ($_FILES["fileToUpload"]["size"] > 500000) {
    echo "Sorry, your file is too large.";
    $uploadOk = 0;
}
//// Allow certain file formats
//if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
//&& $imageFileType != "gif" ) {
//    echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
//    $uploadOk = 0;
//}
// Check if $uploadOk is set to 0 by an error
if ($uploadOk == 0) {
    echo "Sorry, your file was not uploaded.";
// if everything is ok, try to upload file
} else {
    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
        echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
    } else {
        echo "Sorry, there was an error uploading your file.";
    }
}
$filename=basename( $_FILES['fileToUpload']['name']);




        // taking information from inputs and adding it to database tables.
        $query = "INSERT INTO applications VALUES ($random, '$email', '$first_name', '$last_name', '$description', '$category', NOW());";
       if ($conn->query($query) === TRUE) {
        $query2 = "INSERT INTO `uploads` (`application_ID`, `file`) VALUES ($random, '$filename');";
       if ($conn->query($query2) === TRUE) {
            echo "Good luck! <a href='index.php'>Home page</a>";
        } else {
            echo "Error: " . $query2 . "<br>" . $conn->error;
        } 
            echo "<br>Order detail success ";
        } else {
            echo "Error: " . $query . "<br>" . $conn->error;
        }     
        }

?>

<h3>Upload your application</h3>


<form method="post" enctype="multipart/form-data">
<input type="email" name="email" placeholder="Email" required><br>
<input type="text" name="first_name" placeholder="First name" required><br>
<input type="text" name="last_name" placeholder="Last name" required><br>
<input type="textarea" name="description" placeholder="Description" required><br>
<select name="category">
  <option value="front-end">Front-end developer</option>
  <option value="back-end">Back-end developer</option>
  <option value="design">Designer</option>
</select><br>
<input type="file" name="fileToUpload" placeholder="CV"><br>

<button type="submit" name="submit">Submit</button>
</form>

虽然我不能确切说明为什么mkdir在这种情况下不起作用,但您需要对开发方式进行一些更改。

首先,使用绝对 URL。 它会在您的初始开发中增加一些开销,但无疑是值得的。 例如:

如果您在与脚本相同的目录中有一个上传目录,则可以执行以下操作: define('UPLOADS_DIR', realpath('uploads'));

然后,对于您的类别路径: define('CAT_PATH', realpath(UPLOADS_DIR . "/" . $category));

并继续这一趋势,直到您的目录全部正确映射。

接下来,将其放在脚本的顶部:

error_reporting(E_ALL);

为什么要这样做?

因为如果找不到该路径,您将在尝试设置false路径时得到false响应。 这意味着您在尝试创建目录时会出错,而不是在其他地方实际创建目录。 通过正确的程序(例如确保这些常量不是FALSE ),您将尝试实际创建目录之前知道。 也就是说,你就知道毫无疑问,你的路是正确的。 这对任何开发人员来说都是非常宝贵的信息!

养成使用映射到实际路径的常量/变量进行开发的习惯。 您最不想要的就是打字错误或其他人为错误导致脚本中出现错误。 您只需设置一次路径,不必再担心错误。 一遍又一遍地重复使用常量,并确保您的路径是正确的。

错误报告可帮助您调试您面临的所有问题。 当某些事情不起作用时,您的目标应该是找出原因。 没有什么编程,简单地“不工作”,相反,事情根本没有工作。 由您来挖掘错误并找到解决方案。

现在 - 至于你的问题

if (!file_exists("uploads/$category/$random")) {
    mkdir("uploads/$category/$random", 0777, true);
}

上面的代码有一些固有的问题。 首先,您不是在检查uploads/$category独立于$random存在。 我个人会把它改成这样:

if (!file_exists("uploads/$category")) {
    mkdir("uploads/$category", 0777, true);
}

if (!file_exists("uploads/$category/$random")) {
    mkdir("uploads/$category/$random", 0777, true);
}

现在,如果我想快速修复。 或者,如果我使用随机路径,我会遍历每个目录并绝对确保整个路径中的每个目录都存在,但这只是我。 以上可能适合您的需求。

您需要进行一些调试 - 似乎您没有在一个好的 IDE 中使用停止。 如果是这种情况,只需抛出一些调试信息,以便您以后可以丢弃/评论:

if (!file_exists("uploads/$category")) {
    mkdir("uploads/$category", 0777, true);
} else {
    echo "{$category} exists...<br>";
}

if (!file_exists("uploads/$category/$random")) {
    mkdir("uploads/$category/$random", 0777, true);
} else {
    echo "{$category}/{$random} exists...<br>";
}

您可能已经知道,回声中不需要大括号,但是,我已经习惯了。

运行代码。 发生什么了? 如果它说两个路径都存在,而您没有看到它们,则您的路径/代码中存在错误。 尝试这样的事情来验证您实际上是在创建您认为自己所在的目录:

if (!file_exists("uploads/$category")) {
    mkdir("uploads/$category", 0777, true);
} else {
    echo realpath("uploads/$category") . " exists...<br>";
}

if (!file_exists("uploads/$category/$random")) {
    mkdir("uploads/$category/$random", 0777, true);
} else {
    echo realpath("uploads/$category/$random") . " exists...<br>";
}

因此,这就是您创建基于实路径的常量的原因。 它减轻了对上述代码的需求,并在尝试调试诸如mkdir未按预期运行之类的东西时完全让您放心。

您调试此mkdir问题的目标非常明确:

  1. 验证它正在寻找/创建的路径是否正是您所想的。
  2. 验证以上正确, mkdir确实没有创建目录。
  3. 确保启用错误报告,以便如果/当mkdir失败时,您知道原因。
  4. 解决阻止mkdir按预期运行的问题。

我可以自信地向您保证, mkdir作为 PHP 函数没有问题。 有什么东西在阻止它工作——它没有坏。 您必须处于这种心态才能真正调试它。

这就是我真正能想到的,我不能真正理解你的第二个问题。 重新审视您的问题以详细说明,我将尝试回答第二个问题。

祝你好运!

起初 mkdir 工作正常,直到我想用 $category 和 $random 对其进行一些调整,即使现在我反转它也不起作用

我遇到了同样的问题,结果发现我不小心将错误的值传递给了mkdirpermissions参数(可能是null )。

结果, mkdir创建了一个对我的 SFTP 客户端不可见的 000 文件夹。

在此处输入图像描述

这导致我错误地认为该文件夹不存在,并且mkdir随后无缘无故地失败,这对调试来说非常令人沮丧。

为了解决它,我:

  • 开始与 PuTTY 的 SSH 会话。
  • 将工作目录更改为父文件夹( cd /home/myapp/private_html )。
  • 识别出错误文件夹及其错误权限 ( ls -l )。
  • 使用rm -r badfolder删除了坏文件夹。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM