fatfree SQL error handling

后端 未结 1 835
旧巷少年郎
旧巷少年郎 2021-01-06 15:02

If, for whatever reason, there is an error in creation of an entry using the mapper I get an error.

I\'d like to do a custom notification and fail gracefully like so

相关标签:
1条回答
  • 2021-01-06 15:32

    \DB\SQL is a subclass of PDO so it can throw catchable PDO exceptions. Since these are disabled by default, you need to enable them first. This can be done in 2 different ways:

    • at instantiation time, for all transactions:

      $db = new \DB\SQL($dsn, $user, $pwd, array( \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION ));

    • later on in the code, on a per-transaction basis:

      $db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);

    Once PDO exceptions are enabled, just catch them as other exceptions:

    try {
      $db->exec('INSERT INTO mytable(id) VALUES(?)','duplicate_id');
    } catch(\PDOException $e) {
      $err=$e->errorInfo;
      //$err[0] contains the error code (23000)
      //$err[2] contains the driver specific error message (PRIMARY KEY must be unique)
    }
    

    This also works with DB mappers, since they rely on the same DB\SQL class:

    $db=new \DB\SQL($dsn,$user,$pwd,array(\PDO::ATTR_ERRMODE=>\PDO::ERRMODE_EXCEPTION));
    $mytable=new \DB\SQL\Mapper($db,'mytable');
    try {
      $mytable->id='duplicate_id';
      $mytable->save();//this will throw an exception
    } catch(\PDOException $e) {
      $err=$e->errorInfo;
      echo $err[2];//PRIMARY KEY must be unique
    }
    
    0 讨论(0)
提交回复
热议问题