На одном из моих серверов команда New-WebSite перестала работать сегодня (вчера она работала нормально), выдав исключение «Индекс находился за пределами массива». pic_brief и pic_detail на самом деле хранят путь к изображению, например, значение, сохраненное в одном из трех объектов, будет выглядеть следующим образом upload / file / pic_title1.jpg
Моя проблема заключается в том, что я запускаю свой первый цикл for успешно удаляет таблицу без проблем, но файл, который существует в каталоге файлов, остается без изменений. я тоже хочу удалить этот файл, чтобы удалить этот файл, я подумал о добавлении еще одного цикла for, который я сделал что-то вроде этого
for($j=0;$j<$count;$j++){
$delete_id = $checkbox[$j];
$query = "SELECT news.pic_title, news.pic_brief, news.pic_detail FROM news WHERE id = '$delete_id'";
$result = mysql_query($query);
$row = mysql_fetch_array($result);
unlink($row['pic_title']);
unlink($row['pic_brief']);
unlink($row['pic_detail']);
}
Приведенный выше код не может удалить запрошенный файл, моя строка запроса отлично работает, я проверил ее с помощью удаляя функцию unlink и печатая значения, она печатает все выбранное значение, но отказывается удалять файл, и когда я пытаюсь запустить цикл, она показывает ошибку в трех последних строках, хотя я почти уверен, что $ row ['pic_title'], $ row ['pic_brief'], $ row ['pic_brief'], укажите полный путь к изображению.
unlink($row['pic_title']);
unlink($row['pic_brief']);
unlink($row['pic_brief']);
где я ошибаюсь?
PS: нет ничего плохого в разрешении файла, потому что, когда я пытаюсь запустить функцию unlink, я удаляю файл из того же каталога.
РЕДАКТИРОВАТЬ: Это сообщение об ошибке, которое я получаю
Warning: unlink() [function.unlink]: No error in C:\wamp\www\bn\admin-login\action.php on line 580
Warning: unlink() [function.unlink]: No error in C:\wamp\www\bn\admin-login\action.php on line 581
Warning: unlink() [function.unlink]: No error in C:\wamp\www\bn\admin-login\action.php on line 582
Чтобы быть более точным, я протестировал эту функцию индивидуально в php, и она прекрасно работает
$target = 'upload/file/file1.jpg';
unlink($target);
, и по этой причине я не думаю, что файл разрешение вызывает ошибку, я думаю, что где-то не так с логикой.
@Lekensteyn дал мне решение, спасибо Lekensteyn.
На самом деле мне пришлось сначала сохранить значение в переменной, а затем отсоединить файл. рабочий код выглядит следующим образом.
for($j=0;$j<$count;$j++){
$delete_id = $checkbox[$j];
$query = "SELECT * FROM news WHERE id = '$delete_id'";
$result = mysql_query($query);
$row = mysql_fetch_array($result);
$pic_title = $row['pic_title'];
$pic_brief = $row['pic_brief'];
$pic_detail = $row['pic_detail'];
unlink($pic_title);
unlink($pic_brief);
unlink($pic_detail);
}
Это могут быть права доступа к файлам. Вы должны быть владельцем файла, чтобы удалить его.
Некоторые хостеры запускают веб-сайт под пользователем «apache» (или подобным), но файлы принадлежат пользователю ftpuser (например, accountxxxx).
Проверьте также текущий рабочий каталог с помощью echo getcwd()
, если пути не абсолютны.
Ваш скрипт также уязвим для SQL-инъекции, почтовый запрос с флажком[]='||1||'
удаляет все.
Добавьте
error_reporting(E_ALL);
в начало скрипта.
Ваша проблема связана с потоком программы и может быть обнаружена только с помощью отладки.
Начните с отображения ВСЕХ возникших ошибок и исправьте их. Это, скорее всего, приведет вас к причине, по которой вы не можете удалить свои файлы.
Вероятно, проблема в вашем пути загрузки. В вашем тестовом сценарии:
$target = 'upload/file/file1.jpg';
unlink($target);
Бьюсь об заклад, вы запустили это из каталога прямо под 'upload/', верно?
А этот скрипт удаления, наверное, не в том же каталоге?
Я рекомендую использовать полный путь к каталогу 'upload/file/'; это зависит от вашей конфигурации, но, вероятно, выглядит как /www/htdocs/upload/file или /var/www/public_html/upload/file.
Чтобы сделать скрипт более переносимым, вы можете использовать константу PHP FILE для определения каталога. Я обычно устанавливаю это приложение/сайт широко в загрузочном или универсальном файле конфигурации, в соответствии с
define('PATH', dirname(__FILE__)); # sets PATH with the directory name of the bootstrap file where this code lives
Иногда я нажимаю на что-то на своем пути, на что я могу положиться, например, на имя моего приложения. Скажем, мой бутстрап находится здесь:
/www/apps/golf-scorecard/bootstrap.php
Я мог бы разделить на «карту результатов гольфа».
list($path,) = explode('golf-scorecard',dirname(__FILE__)); # $path should be /www/apps/
define('PATH', $path.'golf-scorecard'); # since I split on it, I have to add it back in
Это означает, что если я перенесу приложение/сайт на другой сервер или клонирую его из репозитория на компьютер, где находится корень документа, скажем, /home/username/apps/golf-scorecard/htdocs/
, то это не имеет значения. Это связано с названием приложения, но я согласен с этим.