[英]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
问题的目标非常明确:
mkdir
确实没有创建目录。mkdir
失败时,您知道原因。mkdir
按预期运行的问题。 我可以自信地向您保证, mkdir
作为 PHP 函数没有问题。 有什么东西在阻止它工作——它没有坏。 您必须处于这种心态才能真正调试它。
这就是我真正能想到的,我不能真正理解你的第二个问题。 重新审视您的问题以详细说明,我将尝试回答第二个问题。
祝你好运!
起初 mkdir 工作正常,直到我想用 $category 和 $random 对其进行一些调整,即使现在我反转它也不起作用
我遇到了同样的问题,结果发现我不小心将错误的值传递给了mkdir
的permissions
参数(可能是null
)。
结果, mkdir
创建了一个对我的 SFTP 客户端不可见的 000 文件夹。
这导致我错误地认为该文件夹不存在,并且mkdir
随后无缘无故地失败,这对调试来说非常令人沮丧。
为了解决它,我:
cd /home/myapp/private_html
)。ls -l
)。rm -r badfolder
删除了坏文件夹。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.