2009-05-27 5 views
1

Récemment, j'ai travaillé dans un projet où j'avais besoin de renommer une image. Le problème est quand je renomme l'image il renommé mais affiche un message d'avertissement comme ci-dessousComment puis-je éviter le message d'avertissement "No tel fichier ou répertoire"

Avertissement: renommer (demandeur/SeekerPhoto/katr.jpg, demandeur/SeekerPhoto/ussl.jpg) [function.rename]: Non tel fichier ou répertoire dans /subdomains/www/html/ussl/job/insphoto.php à la ligne 100

Comment puis-je éviter ce message d'avertissement? Cela signifie que quel que soit l'avertissement, il ira à la tâche suivante.

Répondre

0

Si vous voulez dire que voulez juste supprimer l'avertissement, vous pouvez utiliser l'opérateur @

$file = @operation(); 
6

Vous pouvez utiliser le @ operator, qui supprime les messages d'erreur pour les déclarations simples.

@rename($oldFileName, $newFileName); 

Alternativement, vous pouvez réduire la valeur error_reporting si vous voulez supprimer les avertissements pour plusieurs déclarations:

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

Notez que les avertissements sont là pour une raison. La meilleure approche serait de regarder dans pourquoi l'opération génère un avertissement et prend soin que votre code peut gérer ces situations. Vous devriez seulement ignorer les avertissements en dernier recours.

+0

Vous êtes seulement cacher le problème ... –

+0

Ce n'est que partiellement correct - mis à jour la réponse pour refléter cela. Parfois, une telle manipulation d'erreur est vraiment nécessaire - jetez un oeil à la réponse de VolkerK, il recevrait un avertissement de toute façon dans le cas d'une condition de concurrence. – soulmerge

0

Vous pouvez consulter le manuel PHP pour la méthode ini_set ainsi que la appendix Vous aurez besoin d'ajouter ceci au début de votre fichier php:

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

Vous pouvez faire quelques tests sur la paramètre avant de renommer le fichier.

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

edit: Je ne m'attendais pas à ce que cette réponse soit mise en minorité par rapport aux autres. S'il vous plaît noter les commentaires. Il est très difficile/pratiquement impossible de tester toutes les conditions qui pourraient provoquer un message d'avertissement ici à l'avance. Faites ce que vous voulez tester sur le système de fichiers, lorsque vous effectuez l'action réelle, il peut échouer. Tester les champs de la table, les autorisations ou ce que vous voulez et votre requête sql peut encore échouer (par exemple, le serveur MySQL 2006 a disparu, peut arriver à tout moment). Et ainsi de suite. Néanmoins, vous pouvez tester les paramètres pour les causes les plus probables et laisser le script gérer ces erreurs "gracieusement".

+0

+1 Ce serait la bonne façon de le faire – soulmerge

+0

YAY! Quelqu'un qui connaît PHP/et/sait comment écrire du code propre. –

+0

... et encore ce n'est pas tout à fait correct. Vous devez vérifier l'accès en lecture/écriture à l'ancien fichier et les droits d'écriture pour le nouveau fichier (et comme mentionné précédemment, traiter les conditions de concurrence si elles peuvent se produire). Mais de toute façon ... ce n'est qu'un exemple ;-) Et je ne suis pas entièrement opposé au @ dans ce cas. Vous pouvez supprimer la sortie de l'avertissement et toujours vérifier la valeur de retour, définir votre propre gestionnaire d'erreurs, utilisez track_errors/$ php_errormsg, ... – VolkerK

3

Deux choses utilisées ensemble devrait mieux vous servir:

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

Utilisez error_reporting() pour définir un niveau de verbosité approprié pour les messages d'avertissement. Notez que seuls les ensembles d'avertissements, d'avis et/ou d'erreurs sont enregistrés, et non s'ils sont affichés.

Dans votre cas, probablement "error_reporting(E_ERROR | E_USER_ERROR);" qui ne consignera que quelque chose si c'est en fait une erreur, pas seulement un avis ou un avertissement qui ne casse vraiment rien.

Dans l'ensemble, il est probablement une bonne idée de faire quelque chose comme ceci:

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); 
} 

Et puis sur le serveur de développement, vous pourriez avoir la ligne suivante dans votre .htaccess ou directive VirtualHost:

SetEnv PHP_DEBUG=1 

pas besoin de le mettre tout en production depuis pas encore défini ≠ 1.

sur une note de côté, je préfère personnellement avoir mon error_reporting ne modifiee:

error_reporting(E_ALL | E_STRICT); 

que vous pouvez lire en anglais « mettre en garde sur tout ce que je aurais pu faire mal afin de me forcer à faire un meilleur travail » parce que je pense que si je peux battre tous les avis et avertissement juste en vérifiant quelques-uns Avant de l'utiliser et d'initialiser correctement les variables, le résultat final sera probablement au moins un peu plus sécurisé.

modifier: quelques précisions:

Depuis Arif n'a pas demandé de vous assurer que l'opération a réussi, juste pour ne pas faire passer le message. Ce que j'ai interprété comme "ne se soucie pas si l'opération a fonctionné". Ofcourse la meilleure façon d'aller à ce sujet serait quelque chose comme ce qui suit à votre bibliothèque de fonctions:

/** 
* @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

Quelque chose a gâché une indentation dans le code et je déteste quand cela arrive: - / – Kris

0

vous pouvez utiliser « dispaly_errors »

l'api est here

Questions connexes