2009-05-27 3 views
1

Недавно я работал в проекте, где мне нужно было переименовать картинку. Проблема заключается в том, когда я переименовать картину, переименованную но показать предупреждающее сообщение, как сильфонКак я могу избежать предупреждения «Нет такого файла или каталога»

Внимание: переименовывать (ищущий/SeekerPhoto/katr.jpg, ищущий/SeekerPhoto/ussl.jpg) [function.rename]: Нет такой файл или каталог в /subdomains/www/html/ussl/job/insphoto.php в строке 100

Как избежать этого предупреждающего сообщения. Это означает, что предупреждение было, это пойдет для следующей задачи.

ответ

0

Если вы имеете в виду, что вы просто хотите, чтобы подавить предупреждение, вы можете использовать оператор @

$file = @operation(); 
6

Вы можете использовать @ operator, который подавляет сообщения об ошибках для отдельных операторов.

@rename($oldFileName, $newFileName); 

В качестве альтернативы, вы можете уменьшить значение error_reporting если вы хотите подавить предупреждения для нескольких операторов:

$oldErrorReportingValue = error_reporting(0); 
rename($oldFileName, $newFileName); 
# do something else .... 
error_reporting($oldErrorReportingValue); 

Обратите внимание, что предупреждения там по причине. Лучшим подходом было бы изучить , почему операция генерирует предупреждение и заботится о том, чтобы ваш код мог справляться с этими ситуациями. Вы должны только игнорировать предупреждения как последнее средство.

+0

Вы только скрывая проблему ... –

+0

Это только частично правильно - обновил ответ, чтобы отразить это. Иногда такая обработка ошибок действительно требуется - посмотрите на ответ VolkerK, он все равно получит предупреждение в случае состояния гонки. – soulmerge

0

Вы можете посмотреть на PHP инструкции для метода ini_set, а также appendix Вам нужно добавить это в верхней части вашего файла PHP:

ini_set('display_errors','1'); 
12

Вы можете сделать некоторые тесты на перед переименованием файла.

if (!file_exists($oldfile) || !is_readable($oldfile)) { 
    // some error handling here 
} 
else { 
    $b = rename($oldfile, $newfile); 
}

Редактировать: Я не ожидал, что этот ответ будет отмечен так сильно по сравнению с остальными. Пожалуйста, обратите внимание на комментарии. Очень сложно/практически невозможно протестировать все условия, которые могут вызвать предупреждение здесь заранее. Выполняйте то, что когда-либо тестировалось в файловой системе, когда вы выполняете фактическое действие, которое может потерпеть неудачу. Поле тестовых таблиц, разрешений или того, что вам нужно, и ваш SQL-запрос может завершиться неудачно (например, сервер с сервером 2006-MySQL ушел, может произойти в любое время). И так далее и дальше. Тем не менее вы можете проверить параметры для более вероятных причин и позволить скрипту обрабатывать эти ошибки «изящно».

+0

+1 Это был бы правильный способ сделать это – soulmerge

+0

YAY! Кто-то, кто знает PHP/и/знает, как писать чистый код. –

+0

... и все еще это не совсем правильно. Вам нужно будет проверить доступ на чтение/запись к старому файлу и написать разрешения для нового файла (и, как упоминалось, касаются условий гонки, если они могут возникнуть). Но в любом случае ... это всего лишь пример ;-) И я не совсем против @ в этом случае. Вы можете подавить вывод предупреждения и по-прежнему проверять возвращаемое значение, устанавливать свой собственный обработчик ошибок, использовать track_errors/$ php_errormsg, ... – VolkerK

3

Две вещи, используемые вместе должны наилучшим образом служить вам:

  1. error_reporting()
  2. ini_set('display_errors', (boolean)showInBrowser)

Используйте error_reporting(), чтобы установить соответствующий уровень многословие для предупреждающих сообщений. обратите внимание, что только устанавливает, какие предупреждения, уведомления и/или ошибки регистрируются, а не отображаются ли они.

В вашем случае возможно «error_reporting(E_ERROR | E_USER_ERROR);» который будет регистрировать только что-то, если это на самом деле ошибка, а не только уведомление или предупреждение, которое на самом деле ничего не сломает.

В целом, это, вероятно, хорошая идея, чтобы сделать что-то вроде этого:

if (getenv('PHP_DEBUG')=='1') 
{ 
    error_reporting(E_ERROR | E_USER_ERROR); 
    ini_set('display_errors', true); 
} 
else 
{ 
    error_reporting(E_ERROR | E_USER_ERROR); 
    ini_set('display_errors', false); 
} 

, а затем на сервере разработки вы могли бы иметь следующую строку в .htaccess или директивы VirtualHost:

SetEnv PHP_DEBUG=1 

нет необходимости устанавливать его на всех в производстве, так как не установлено ≠ 1.

на стороне записки, я лично предпочитаю, чтобы мой error_reporting сделать, чтобы установить:

error_reporting(E_ALL | E_STRICT); 

который вы могли читать по-английски, как «предупредить на все, что я мог бы сделать неправильно, чтобы заставить меня сделать лучшую работу», потому что я чувствую, что если я могу побить все уведомления и предупреждения, просто проверяя некоторые прежде чем использовать его и правильно инициализировать переменные, конечный результат будет, по крайней мере, немного более безопасным.

редактировать: некоторые разъяснения:

Поскольку Ариф не просил, чтобы убедиться, что операция прошла успешно, только чтобы не получить сообщение. Который я интерпретировал как «не волнует, работает ли операция». Ofcourse лучшего способа идти об этом было бы что-то вроде следующего для вашей функции библиотеки:

/** 
* @author: Kris 
* @license: see http://sam.zoy.org/wtfpl/ 
* 
* PLEASE NOTE THAT THE FOLLOWING CODE IS TESTED BY ME, NOT QUALITY ASSURANCE 
*/ 

/** 
* Move a file 
* 
* If uses filename from $source if $destination is a directory 
* 
* @param string $source 
* @param string $destination 
* @param bool $overwrite 
* @return bool 
*/ 
function my_move_file($source, $destination, $overwrite = false) 
{ 
    return _internal_my_move_or_copy_file($source, $destination, true, $overwrite); 
} 

/** 
* Copy a file 
* 
* If uses filename from $source if $destination is a directory 
* 
* @param string $source 
* @param string $destination 
* @param bool $overwrite 
* @return bool 
*/ 
function my_copy_file($source, $destination, $overwrite = false) 
{ 
    return _internal_my_move_or_copy_file($source, $destination, false, $overwrite); 
} 

define('__internal_my_move_or_copy_file_e_error', E_USER_ERROR);  // change to E_USER_NOTICE if not meant to be fatal 
define('__internal_my_move_or_copy_file_e_notice', E_USER_NOTICE); 

/** 
* Should not be called by userland code, use my_move_file or my_copy_file instead 
* 
* one function to implement both move and copy because almost all of the required validations is identical. 
* 
* @param string $source 
* @param string $destination 
* @param bool $is_move 
* @param bool $overwrite 
* @return bool 
*/ 
function _internal_my_move_or_copy_file($source, $destination, $is_move, $overwrite) 
{ 
// what we'll be returning 
    $result = false; 

    // input sanity checks 
    if (!is_string($source) || !is_callable($source, '__toString')) 
    { 
     trigger_error( 
      "_internal_my_move_or_copy_file: expects \$source to be a string.", 
      __internal_my_move_or_copy_file_e_error); 
     return false; 
    } 
    elseif (!is_string($destination) || !is_callable($destination, '__toString')) 
    { 
     trigger_error( 
      "_internal_my_move_or_copy_file: expects \$destination to be a string.", 
      __internal_my_move_or_copy_file_e_error); 
     return false; 
    } 
    elseif (! is_bool($is_move)) 
    { 
     trigger_error( 
      "_internal_my_move_or_copy_file: expects \$is_move to be a bool.", 
      __internal_my_move_or_copy_file_e_error); 
     return false; 
    } 
    elseif (! is_bool($overwrite)) 
    { 
     trigger_error( 
      "_internal_my_move_or_copy_file: expects \$overwrite to be a bool.", 
      __internal_my_move_or_copy_file_e_error); 
     return false; 
    } 

    $action_word = $is_move ? 'move' : 'copy'; 

    if (file_exists($source) && is_readable($source)) 
    { 
     $to = preg_split('/\//', $destination, -1, PREG_SPLIT_NO_EMPTY); 
     $destination = '/'.implode('/', $to); 

     if (is_dir($destination)) 
     { 
     // make sure we don't accidentally allow ../ etc 
      if (in_array('..', $to) || in_array('.', $to)) 
      { 
       trigger_error("my_{$action_word}_file: \$destination does not allow path traversion using /../ or /./", $e_error_code); 
      } 

      // make sure we have a filename on $destination 
      if (is_dir($destination)) 
      { 
      // user gave a directory but no filename so use the filename in $source 
       $to[] = basename($source); 
       $destination = '/'.implode('/', $to); 
      } 
     } 

     if (file_exists($destination) && is_writable($destination)) 
     { 
      if (! $overwrite) 
      { 
       trigger_error(
        "my_{$action_word}_file: \$destination already exists and I am instructed not to overwrite.", 
        __internal_my_move_or_copy_file_e_notice); 
       return false; 
      } 
     } 
     elseif (is_dir(dirname($destination)) || is_writable(dirname($destination))) 
     { 
     // we can write 
     } 
     else // all allowable situations are already passed 
     { 
      trigger_error( 
       "my_{$action_word}_file: $destination directory does not exist or cannot be written to.", 
       __internal_my_move_or_copy_file_e_error); 
     } 


     if ($is_move) 
     { 
     // if we are going to move a file the source also needs to be writable 
      if (! is_writable($source)) 
      { 
       trigger_error( 
        "my_{$action_word}_file: Cannot {$action_word} \$source because it cannot be written.", 
        __internal_my_move_or_copy_file_e_error); 
      } 

      $result = rename($source, $destination); 
     } 
     else 
     { 
      $result = copy($source, $destination); 
     } 

     // see if what php's built in function gave us is acceptible 
     if ($result === false) 
     { 
      trigger_error( 
       "my_{$action_word}_file: unexpected failure to {$action_word} \$source to \$destination.", 
       __internal_my_move_or_copy_file_e_error); 
     } 

     // postflight check if the work we did was successful 
     if (!file_exists($destination)) 
     { 
      trigger_error( 
       "my_{$action_word}_file: unexpected failure to {$action_word} \$destination does not exist after {$action_word} operation.", 
       __internal_my_move_or_copy_file_e_error); 
     } 
    } 
    else // file does not exists or is unreadable 
    { 
     trigger_error( 
      "my_{$action_word}_file: \$source \"$source\" does not exist or cannot be read.", 
      __internal_my_move_or_copy_file_e_error); 
    } 

    return $result; 
} 
+0

Что-то испортило некоторые отступы в коде, и я ненавижу, когда это происходит: - / – Kris

0

вы можете использовать «dispaly_errors»

API-интерфейс является here

Смежные вопросы