Nasıl benim kod veritabanı eylem girişiminde bulunan ancak başarısızlık kod çalıştırmaya devam etmek yazabilirim?

4 Cevap

Sanırım basit bir soru, bunu ben başarısızlık oturum ama kod çalıştırmaya devam etmek istiyor olmaz ise, benim veritabanında varolan bir satır için bir güncelleme yazmak için PHP kullanmak istiyorum. Başarısız güncelleme benim kullanıcı için o kadar önemli değil, ne de herhangi bir başka kodun çalışmasını etkileyecek, sorunları izini başarısızlıklarının kayıtları olması güzel olurdu da; Sorgu bir bilgi 'kozmetik' ama tamamen gereksiz parça için basitçe.

Benim veritabanı sınıfının sorgusu fonksiyon yetersizliği ölmek ayarlanır, bunu değiştirmek ya da benim standart sorgu kodu değiştirmeden bunu yapmanın başka bir yolu var ki?

4 Cevap

Bu istisnalar iyi budur.

Mysql kullanılarak küçük bir örnek

class Db
{
  function query( $sql )
  {
    $result = @mysql_query( $sql );
    $error = mysql_error();
    if ( !empty( $error ) )
    {
      throw new DbException( $error );
    }
    return $result;
  }
}

sınıf DbException İstisna {} uzanır

Sonra

try {
  $db = new Db;
  $db->query( 'select * from table' );
}
catch ( DbException $e )
{
  // do nothing - we want silent failure
}

(kalıp kurtulmak) o zaman?

Id 'trigger_error() yerine kalıp kullanmanızı öneririm. Bu standart hata çıkışı üzerinden hata haberdar edilecektir.

Eh, ben sadece die() dışarı alacaktı. Yani, tek başına, bütün CGI yürütme durdurma onu koruyacaktır. Eğer bir şekilde hataları oturum açmak istiyorsanız, neden bir günlük dosyasına yazar bir işlev eklemek değil, ya da (eğer yüksek bir oranda başarısız bahsediyoruz ve sadece ayıklamak istediğiniz değilseniz) belki size yetmezliği olan bir e-posta gönderir .

I / postaları hata günlükleri bir yöntem uygulamak. Sizin son kullanıcılar hiç bir şey fark etmez.

$query = mysql_query($sql) or log_error($sql);

// continue executing code

function log_error($sql) {
  // Code that writes to a log file

  // Notify tech support 
  mail("user@example.com", "Error while updating DB", $sql . " at time: " . time());
}