Nasıl php uyarı iletisi önleyebilirsiniz

4 Cevap php

Son zamanlarda ben projede çalıştı. Orada ben bir yeniden adlandırmak için bir resim gerekir. i değiştirildi resmi yeniden adlandırabilir, ancak bağırma gibi bir uyarı mesajı göstermek zaman sorun

Uyarı: [function.rename] (arayan / SeekerPhoto / katr.jpg, arayan / SeekerPhoto / ussl.jpg) yeniden adlandırmak: Böyle bir dosya ya da dizin yok in / subdomain / www / html / ussl / iş / insphoto.php hattında 100

nasıl ben bu uyarı mesajını önleyebilirsiniz. Bu uyarı önümüzdeki görev için gidecek ne olursa olsun anlamına gelir.

Arif .... Teşekkürler

4 Cevap

Dosyayı yeniden adlandırma önce parametre üzerinde bazı testler yapabilirsiniz.

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

edit: Bu cevap diğerlerine kıyasla o kadar upvoted bekliyoruz vermedi. Yorumlarınızı lütfen unutmayın. Bu, önceden burada bir uyarı iletisi neden olabilecek tüm koşulları test etmek neredeyse imkansız / çok zor. Eğer başarısız olabilir fiili eylemi gerçekleştirdiğinizde, dosya sistemi üzerinde ne istediğini hiç test yapmak. Test tablo alanları, izinler veya her ne istiyorsanız ve hala sql sorgusu (herhangi bir zamanda olabilir, örneğin 2006-MySQL server has gone away) başarısız olabilir. Ve böylece ve üzerinde. Yine de daha olası nedenleri için parametreleri test script "incelikle" bu hataları ele sağlayabilirsiniz.

Ile birlikte kullanılan iki şey en iyi hizmet etmelidir:

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

error_reporting() uyarı mesajları için ayrıntı uygun bir düzeyini ayarlamak için kullanın. uyarılar, bildirimler ve / veya hatalar sadece giriş setleri, onlar görüntülenir olmadığını unutmayın.

Sizin durumunuzda muhtemelen "error_reporting( E_ERROR | E_USER_ERROR );" bu da aslında bir hata değil, sadece bir uyarı ya da gerçekten bir şey bölmez bir uyarı ise sadece bir şey oturum olacaktır.

Tüm bu muhtemelen böyle bir şey yapmak için iyi bir fikirdir:

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

. Ve sonra geliştirme sunucusu üzerinde sizin htaccess veya VirtualHost yönergesinde aşağıdaki satırı olabilir:

SetEnv PHP_DEBUG=1

≠ 1 girilmedi yana üretim tüm ayarlamak gerek yok.

Bir yan not olarak, ben şahsen error_reporting ayarlanır yapmak zorunda tercih:

error_reporting( E_ALL | E_STRICT );

Ben hissediyorum çünkü "Ben belki daha iyi bir iş yapmak için beni zorlamak yanlış yapmış olabilir her şeyi uyarmak" olarak ingilizce okuyabilir ki ben sadece bunu kullanmadan önce bazı şeyler kontrol ve başlatılırken her haber ve uyarı yenebilir değişkenleri düzgün, sonuç muhtemelen en azından biraz daha güvenli olacaktır.

edit: bazı açıklamalar:

Arif sadece mesajı almak değil, emin operasyon başarılı yapmak istemedim beri. Ben olarak yorumlanır Hangi "operasyon çalıştı umurumda değil". Tabii bu konuda giderek daha iyi bir şekilde işlev kütüphanesine aşağıdaki gibi bir şey olacaktır:

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

Eğer sadece uyarı bastırmak istediğiniz anlamına ederseniz, @ operatörünü kullanabilirsiniz

$file = @operation();