Deux choses utilisées ensemble devrait mieux vous servir:
error_reporting()
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;
}
Vous êtes seulement cacher le problème ... –
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