PHP 复选框从文件夹中删除文件
PHP Checkbox delete files from folder
我想从名为 "fajlovi" 的文件夹中删除文件。多个和单个删除应该工作。但它会删除文件夹中的第一个文件(文件夹中文件数组中的 0 位置)。如果我检查任何文件,它将删除前 4 个文件而不是我检查的文件。这是代码:
$a = glob("fajlovi/*");
echo "<br>var_dump of $a ------------------------<br><pre>";
var_export($a);
echo "</pre>end dump od $a ------------------------<br><br>";
echo "Number od files in the directory: " . count($a) . "<br>";
echo "<form method='POST' action='" . $_SERVER['PHP_SELF'] . "'><table >";
echo "<th>File name:</th><th>Size MB:</th><th>Delete:</th>";
foreach ($a as $key => $value) {
echo "<tr><td>" . $value . "</td>";
echo "<td>" . round(filesize($value) / 1024 / 1024, 5) . " MB <br></td>";
echo "<td><input type='checkbox' name='checked[]'>" . $img_number = $key + 1 . "</td>";
}
echo "<tr><td colspan=3><input type='submit' name='delete' value='Delete'></td></tr>";
echo "</table></form>";
if (isset($_POST['delete'])) {
$checkbox = $_POST['checked'];
for ($i = 0; $i <= count($a); $i++) {
if (isset($checkbox[$i])) {
if (unlink($a[$i])) {
echo "Successfully deleted file" . $a[$i] . "<br>";
}
}
}
}
if (!empty($_POST['checked'])) {
var_dump($_POST['checked']);
}
1.这是页面截图:
2.then 我查看要删除的图片:
3。按删除按钮后,结果如下:
4.并且再次进入页面后,可以看到错误的图片被删除了:
您需要给输入一个值
<input type='checkbox' name='checked[]' value='{$key}'>
这里有一些代码可以让您朝着正确的方向前进。
$files = glob('fajlovi/*');
$indicesToDelete = array_intersect((array)($_POST['checked'] ?? []), array_keys($files));
foreach ($indicesToDelete as $index) {
if (unlink($files[$index])) {
echo "Successfully deleted file" . $files[$index] . "<br>";
}
}
虽然我不会像这样实施删除。您不应使用 glob()
提供的索引作为查找要删除的文件的方法,而应使用 唯一且明确地标识 文件的键。至少这意味着使用 文件路径 本身。例如,考虑一个场景,在该场景中,在您的表单显示和您做出并提交要删除的选择之间添加或删除文件。您最终可能会删除错误的文件。
相反,您可以在此处传递文件路径:
<input type='checkbox' name='checked[]' value='{$value}'>
然后使用它们代替索引。
$files = glob('fajlovi/*');
$pathsToDelete = array_intersect((array)($_POST['checked'] ?? []), $files);
foreach ($pathsToDelete as $filepath) {
if (unlink($filepath)) {
echo "Successfully deleted file" . $files[$index] . "<br>";
}
}
最后一点建议:
- 您应该在取消链接之前检查
file_exists()
、is_file()
或类似内容。您应该尽一切努力确保只允许删除您想要删除的文件。
我想从名为 "fajlovi" 的文件夹中删除文件。多个和单个删除应该工作。但它会删除文件夹中的第一个文件(文件夹中文件数组中的 0 位置)。如果我检查任何文件,它将删除前 4 个文件而不是我检查的文件。这是代码:
$a = glob("fajlovi/*");
echo "<br>var_dump of $a ------------------------<br><pre>";
var_export($a);
echo "</pre>end dump od $a ------------------------<br><br>";
echo "Number od files in the directory: " . count($a) . "<br>";
echo "<form method='POST' action='" . $_SERVER['PHP_SELF'] . "'><table >";
echo "<th>File name:</th><th>Size MB:</th><th>Delete:</th>";
foreach ($a as $key => $value) {
echo "<tr><td>" . $value . "</td>";
echo "<td>" . round(filesize($value) / 1024 / 1024, 5) . " MB <br></td>";
echo "<td><input type='checkbox' name='checked[]'>" . $img_number = $key + 1 . "</td>";
}
echo "<tr><td colspan=3><input type='submit' name='delete' value='Delete'></td></tr>";
echo "</table></form>";
if (isset($_POST['delete'])) {
$checkbox = $_POST['checked'];
for ($i = 0; $i <= count($a); $i++) {
if (isset($checkbox[$i])) {
if (unlink($a[$i])) {
echo "Successfully deleted file" . $a[$i] . "<br>";
}
}
}
}
if (!empty($_POST['checked'])) {
var_dump($_POST['checked']);
}
1.这是页面截图:
2.then 我查看要删除的图片:
3。按删除按钮后,结果如下:
4.并且再次进入页面后,可以看到错误的图片被删除了:
您需要给输入一个值
<input type='checkbox' name='checked[]' value='{$key}'>
这里有一些代码可以让您朝着正确的方向前进。
$files = glob('fajlovi/*');
$indicesToDelete = array_intersect((array)($_POST['checked'] ?? []), array_keys($files));
foreach ($indicesToDelete as $index) {
if (unlink($files[$index])) {
echo "Successfully deleted file" . $files[$index] . "<br>";
}
}
虽然我不会像这样实施删除。您不应使用 glob()
提供的索引作为查找要删除的文件的方法,而应使用 唯一且明确地标识 文件的键。至少这意味着使用 文件路径 本身。例如,考虑一个场景,在该场景中,在您的表单显示和您做出并提交要删除的选择之间添加或删除文件。您最终可能会删除错误的文件。
相反,您可以在此处传递文件路径:
<input type='checkbox' name='checked[]' value='{$value}'>
然后使用它们代替索引。
$files = glob('fajlovi/*');
$pathsToDelete = array_intersect((array)($_POST['checked'] ?? []), $files);
foreach ($pathsToDelete as $filepath) {
if (unlink($filepath)) {
echo "Successfully deleted file" . $files[$index] . "<br>";
}
}
最后一点建议:
- 您应该在取消链接之前检查
file_exists()
、is_file()
或类似内容。您应该尽一切努力确保只允许删除您想要删除的文件。