#php
#php
Вопрос:
Я использую следующий код для удаления старого изображения с ftp…
unlink(getcwd() . '/images/' . $row['pic']);
Но он выдает ошибки в случае отсутствия изображения, поэтому я попытался использовать file_exists (), но это тоже не сработало, так как я могу проверить, есть ли изображение, прежде чем пытаться удалить. Спасибо.
if(file_exists(getcwd() . '/images/pics/' . $row['pic']))
{
unlink(getcwd() . '/images/pics/' . $row['pic']);
}
Комментарии:
1. Покажите код, который вы пробовали с
file_exists
Ответ №1:
часто хостеры используют разных пользователей для ftp и apache… может быть, у вас нет chmodded ваших изображений, поэтому www-пользователь не может их удалить?
Редактировать:
возможно, is_writable — лучшее решение для вас:
if(is_writable(dirname(__FILE__) . '/images/pics/' . $row['pic'])){
unlink(dirname(__FILE__) . '/images/pics/' . $row['pic']);
}
Комментарии:
1. он удаляет изображение, только если оно есть, но выдает ошибку, если никакого изображения нет, поэтому я хочу использовать любую функцию, чтобы проверить, существует ли изображение, прежде чем удалять его.
2. почему я должен использовать
is_writeable
вместоgetcwd()
?3. вы имеете в виду dirname() вместо getcwd()? не имеет большого значения.. но вам действительно следует использовать is_writable вместо file_exists, он проверяет, существует ли файл, но также проверяет, достаточно ли у вас прав для его изменения.
Ответ №2:
Сначала проверьте, что возвращает getcwd(). Вероятно, false, так что это означает, что у вас неправильно установлены разрешения. Следовательно, ваш путь построен неправильно. Проверьте документы getcwd(), измените разрешения или обратитесь к системному администратору. Также взгляните на dirname(__FILE__)
Комментарии:
1. он удаляет изображение нормально с помощью getcwd, если изображение есть, но выдает ошибку, если изображения там нет.
2. пожалуйста, предоставьте информацию об ошибке. Если вы используете var_dump() сконструированный путь, что он говорит?
Ответ №3:
Сначала вы можете сохранить путь к изображению в $path
переменной. Затем вы можете проверить, существует ли изображение и доступно ли оно для записи, и только после этого удалите его.
$path = getcwd() . '/images/pics/';
if( file_exists( $path . $row['pic'] ) amp;amp; is_writable( $path . $row['pic'] ) ){
unlink( $path . $row['pic'] );
}
Если вы используете PHP 5 и хотите узнать больше о любом исключении, которое может быть вызвано, тем временем вы можете окружить все выражение try...catch
оператором:
try{
$path = getcwd() . '/images/pics/';
if( file_exists( $path . $row['pic'] ) amp;amp; is_writable( $path . $row['pic'] ) ){
unlink( $path . $row['pic'] );
}
} catch (Exception $exc) {
echo $exc->getMessage();
echo $exc->getTraceAsString();
}
Вероятно, это не решит проблему, но может помочь прояснить, почему это происходит.
Ответ №4:
У меня была такая же проблема. Я разрешил пользователю загружать ДО 8 изображений. Но, допустим, они загрузили только четыре… Затем удалил пост. У меня возникла ошибка для остальных четырех изображений, потому что они не существовали. Итак, это то, что я сделал…
$GetImages = "SELECT * FROM sales_images WHERE ID = $imgID";
$GotImages = $conn->query($GetImages);
while($pic = $GotImages->fetch_assoc())
{
$path = '../images/sales/';
$img1 = $pic['img1'];
$img2 = $pic['img2'];
$img3 = $pic['img3'];
$img4 = $pic['img4'];
$img5 = $pic['img5'];
$img6 = $pic['img6'];
$img7 = $pic['img7'];
$img8 = $pic['img8'];
}
if (!empty($img1)) {
unlink($path . $img1);
}
if (!empty($img2)) {
unlink($path . $img2);
}
if (!empty($img3)) {
unlink($path . $img3);
}
if (!empty($img4)) {
unlink($path . $img4);
}
if (!empty($img5)) {
unlink($path . $img5);
}
if (!empty($img6)) {
unlink($path . $img6);
}
if (!empty($img7)) {
unlink($path . $img7);
}
if (!empty($img8)) {
unlink($path . $img8);
}
Это отлично сработало и не выдало ошибок. Надеюсь, это поможет 🙂
Ответ №5:
Попробуйте добавить @ перед unlink(getcwd() . ‘/images/’ . $row[‘pic’]);
@unlink(getcwd() . ‘/images/’ . $row[‘pic’]);
Если файл существует, он будет удален, а если его нет, вы не получите сообщение об ошибке.
Комментарии:
1. @usoban это будет единственный способ, если это связано с состоянием гонки. Покажите лучший
2. @usoban Можете ли вы объяснить, почему подавление ошибки в этом случае настолько плохо?
3. Потому что подавление ошибок НИКОГДА не является решением. Возможно, вы получите какую-то другую ошибку в рабочей среде, по крайней мере, зарегистрируйте ее где-нибудь, а не подавляйте. Проблема явно в разрешениях.
4. Я согласен с usoban, вы никогда не должны выполнять что-либо, в работе чего вы не уверены на 100%. Даже если это выглядит безобидно, как превышение unlink.