PHP mkdir不再工作了

时间:2015-10-28 15:29:01

标签: php submit mkdir

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

1 个答案:

答案 0 :(得分:0)

虽然我无法确切说明mkdir在这种情况下无法正常运行的原因,但您需要对您的开发方式进行一些更改。

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

如果上传目录与脚本位于同一目录中,则可以执行以下操作define('UPLOADS_DIR', realpath('uploads'));

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

继续这个趋势,直到你的目录都被正确映射。

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

error_reporting(E_ALL);

为什么这样做?

因为如果找不到该路径,在尝试设置realpath时会得到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按预期运行的问题。
  5. 我可以自信地向您保证mkdir作为PHP函数没有问题。某些东西阻止它的工作 - 它没有被破坏。你必须有这种心态来真正调试它。

    这就是我能真正想到的,我无法理解你的第二个问题。重新审视你的问题以便详细说明,我会在回答第二个问题时采取行动。

    祝你好运!