У вас не хватает трейлинг /
дважды .. В glob()
вы даете /home/user/public_html*.*
в качестве аргумента, я думаю, что вы имеете в виду /home/user/public_html/*.*
.
Именно поэтому я ставлю пари, что ничего не соответствует файлам в вашей таблице. Это не даст ошибки ни потому, что синтаксис в порядке.
Затем, где вы unlink()
, вы делаете это снова .. ваш аргумент home/user/public_htmltestfile.html
должен быть home/user/public_html/testfile.html
.
Мне нравится этот синтаксис style: "{$directory}/{$file}"
, потому что он короткий и читаемый. Если отсутствует /, вы сразу увидите его. Вы также можете изменить его на $directory . "/" . $file
, это вы предпочитаете. То же самое относится и к одной линии условных операторов .. Так вот он приходит ..
<?php
$directory = "/home/user/public_html";
$files = glob("{$directory}/*.*");
foreach($files as $file)
{
$sql = mysql_query("SELECT id FROM files WHERE FileName=\"{$file}\";");
if(mysql_num_rows($sql) == 0)
{
unlink("{$directory}/{$file}");
}
}
?>
EDIT: Вы запросили рекурсию. Здесь он идет.
Вам нужно сделать функцию, которую вы можете запустить один раз с помощью пути в качестве аргумента. Затем вы можете запустить эту функцию изнутри этой функции в подкаталогах. Например:
<?php
/*
ListDir list files under directories recursively
Arguments:
$dir = directory to be scanned
$recursive = in how many levels of recursion do you want to search? (0 for none), default: -1 (for "unlimited")
*/
function ListDir($dir, $recursive=-1)
{
// if recursive == -1 do "unlimited" but that's no good on a live server! so let's say 999 is enough..
$recursive = ($recursive == -1 ? 999 : $recursive);
// array to hold return value
$retval = array();
// remove trailing/if it is there and then add it, to make sure there is always just 1/
$dir = rtrim($dir,"/") . "/*";
// read the directory contents and process each node
foreach(glob($dir) as $node)
{
// skip hidden files
if(substr($node,-1) == ".") continue;
// if $node is a dir and recursive is greater than 0 (meaning not at the last level or disabled)
if(is_dir($node) && $recursive > 0)
{
// substract 1 of recursive for ever recursion.
$recursive--;
// run this same function again on itself, merging the return values with the return array
$retval = array_merge($retval, ListDir($node, $recursive));
}
// if $node is a file, we add it to the array that will be returned from this function
elseif(is_file($node))
{
$retval[] = $node;
// NOTE: if you want you can do some action here in your case you can unlink($node) if it matches your requirements..
}
}
return $retval;
}
// Output the result
echo "<pre>";
print_r(ListDir("/path/to/dir/",1));
echo "</pre>";
?>
Косые черты отсутствовали ^^ Входит ли этот поиск в подпапки? Это важно. Кроме того, поскольку я планирую использовать ваши косые черты в сочетании с массивом (хотите запустить его как можно чаще, поэтому я хочу избегать запросов) есть ли команда для перечисления всех файлов (в том числе в подпапках) в формате массива? Поэтому мне не нужно создавать массив в ответе ниже файла по файлу. Благодаря! –
Нет Это не будет, я изменю ответ на рекурсивный поиск. – Chris
Awesome :) Спасибо большое, я собираюсь сделать это в один раз код и поделиться им здесь =) –