【问题标题】:PHP mkdir doesn't work anymorePHP mkdir 不再工作
【发布时间】:2024-04-15 04:25:02
【问题描述】:

所以我有了这段代码,起初 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>

【问题讨论】:

  • 请在此处添加代码
  • $target_file = $target_dir . "/" . basename($_FILES["fileToUpload"]["name"]); - 缺少一个斜线。
  • 它不能解决问题。主要问题是 mkdir 不起作用。
  • 然后使用错误报告并设置为捕获/显示。做一个var_dump();

标签: php submit mkdir


【解决方案1】:

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

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

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

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

并继续这种趋势,直到您的目录都被正确映射。

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

error_reporting(E_ALL);

为什么要这样做?

因为如果找不到该路径,您将在尝试设置实际路径时收到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>";
}

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

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

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 函数没有问题。某些东西阻止它工作 - 它没有损坏。你必须有这种心态才能真正调试它。

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

祝你好运!

【讨论】:

    【解决方案2】:

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

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

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

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

    为了修复它,我:

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

    【讨论】: