Avatar billede napisok Nybegynder
01. marts 2005 - 23:27 Der er 13 kommentarer og
1 løsning

try and catch(exception) i PHP5

Jeg har lavet en funktion med try og catch, men den vil gå ned i catch (eksempelvis hvis der ikke er nogle database forbindelse) går den ikke ned i catch (er det ikke det der er meningen, hvis try blokken ikke lykkes gå ned i catch, her er min kode:

function createCustomer($customer)
    {   
        try
        {       
            global $connect;
                pg_query("begin");
       
$selectTest = pg_query("select * from customer where \"vatNo\" = '$customer->vat'");
                $row=pg_fetch_row($selectTest);
            if($row[4]>=1)
            {
                return -1;
              }
            else
            {
               
$test = pg_query("insert into customer values ('$customer->name', '$customer->adr', '$customer->post', '$customer->vat')");
    $oid = pg_getlastoid($test);
$query_for_id = "SELECT * FROM customer WHERE oid=$oid;";
    $result = pg_query($query_for_id);
        $arr = pg_fetch_row($result);
    pg_query( "commit");
    pg_close($connect);

    return $arr[4];
        throw new Exception("En exception blev kastet");

            }
        }
        catch(Exeception $e)
        {
        return $e->getMessage();
        }
    }
Avatar billede napisok Nybegynder
01. marts 2005 - 23:28 #1
hvor er fejlen eller er det mig der ikke kan håndtere fejlmeddelser
Avatar billede coderdk Praktikant
01. marts 2005 - 23:59 #2
Try/Catch virker kun ved exceptions - Hvis du vil bruge exceptions skal du bruge en database-wrapper som smider en exception hvis der f.eks. ikke er en gyldig databaseforbindelse...
Avatar billede coderdk Praktikant
02. marts 2005 - 00:02 #3
Til det andet kan du f.eks. bruge set_error_handler() og selv håndtere dine fejl (ikke exceptions)
Avatar billede coderdk Praktikant
02. marts 2005 - 00:17 #4
Tænkte egentlig lige på noget, dette virker:

<?php

    function error_to_exception( $errno, $errstr, $file, $line, $context )
    {
        throw new Exception( "Error $errno ($errstr) in $file at line $line" );
    }

    set_error_handler( "error_to_exception" );
   
    function test()
    {
        try
        {
            $fp = fopen( 'nonexistant', 'r');
            while ( !feof( $fp ) )
            {
                echo fread( $fp, 1024 );
            }
            fclose( $fp );
        }
        catch ( Exception $e )
        {
            die( $e->getMessage() );
        }
    }
   
    test();

?>
Avatar billede napisok Nybegynder
02. marts 2005 - 09:07 #5
Det der er meningen er at, hvis der ikke er forbindelse til databasen skal den returnere -3, hvis der er forbindelse til database og den bare ikke kan oprette objektet skal den returnere -2. Det er noget i den stil. Jeg har før leget med javakode og ville gerne have den til at virke som denne her javakode
//Fejl meddelelser: -1 hvis der er fejl til forbindelse til db, -2 hvis bruger ikke existerer
    public synchronized int OpretPerson(Person person)
    {
    Connection con = getConnection();
    if(person.getBrugernavn().equals(""))
        return -2;
    try {       
        Statement s = con.createStatement ( );
        ResultSet b=s.executeQuery("select PersonId from Person where BrugerNavn='" + person.getBrugernavn() + "'");
        if(b.first())
        {
            return -2;
        }
        s=con.createStatement();
        String insertPerson = "INSERT INTO Person (Navn, Adresse, PostNrF, TlfNr, MobilNr, Email, BrugerNavn, Password, BrugerNiveau) VALUES('" +
        person.getNavn() + "','" +
        person.getAdresse() + "','" +
        person.getPostnr() + "','" +
        person.getTelefonnummer() + "','" +
        person.getMobil() + "','" +
        person.getEmail() + "','" +
        person.getBrugernavn() + "','" +
        person.getPassword() + "'," +
        person.getBrugerniveau() + ")";
        s.execute ( insertPerson );
        int personId=getLastId(s);
        close(con);
        return personId;
    }
    catch ( java.sql.SQLException e ){
        System.out.println("AAAHhhh.. pis");
        System.out.println(e);
        return -1;
    }
    }
Avatar billede alaflam Nybegynder
02. marts 2005 - 11:47 #6
jeg vidste ikke der er kommet TRY og CATCH i den nye version SEJT
Avatar billede coderdk Praktikant
02. marts 2005 - 11:53 #7
alaflam, Det er rimelig fucked i PHP5 - De fleste ting raiser ikke exceptions, de laver errors, så du kan ikke bryge try/catch, hvilket er lidt latterligt... Men jo, det er da fedt at det er kommet, så må vi bare håbe at de fixer det ;P
Avatar billede googolplex Novice
02. marts 2005 - 11:59 #8
De steder hvor der er mulighed for en fejl, bør man vel tjekke dette og så evt. selv kaste en exception. Eller er der noget jeg har misforstået ?
Avatar billede coderdk Praktikant
02. marts 2005 - 12:08 #9
Hvis jeg var dig ville jeg lave en databasewrapper:

class pgDatabase
{
  private $connection;
  private $querystack = array();
  function connect()
  {
      if ( !is_resource( $this->connection ) )
      {
        $conn = pg_connect( "host=localhost port=5432 dbname=mary" );
        if ( !is_resource( $conn ) )
        {
            throw new Exception( "Could not connect to database!" );
        }
        $this->connection = $conn;
      }
      return true;
  }
  function query( $sql )
  {
      if ( !is_resource( $this->connection ) )
      {
        $this->connect();
      }
      $qry = pg_query( $sql );
      if ( is_resource( $qry ) )
      {
        array_push( $this->querystack[], $qry );
      }
  }
  function free()
  {
      if ( count( $this->querystack ) > 0 )
      {
        $qry = array_pop( $this->querystack );
        pg_free_result( $qry );
      }
  }
}

osv osv - Du kan selv udbygge ;)
Avatar billede coderdk Praktikant
02. marts 2005 - 12:10 #10
Faktisk burde metoden query() se sådan ud:

  function query( $sql )
  {
      if ( !is_resource( $this->connection ) )
      {
        $this->connect();
      }
      $qry = pg_query( $sql );
      if ( is_resource( $qry ) )
      {
        array_push( $this->querystack[], $qry );
      }
      else
      {
        throw new Exception( "Query error. " . pg_last_error() );
      }
  }
Avatar billede napisok Nybegynder
02. marts 2005 - 12:12 #11
Det ser fint ud, men hvordan modtager man den oppe på gui(website), at forbindelsen til databasen er brudt
Avatar billede napisok Nybegynder
02. marts 2005 - 12:27 #12
evt. et popup billede, der siger at forbindelsen er brud
Avatar billede coderdk Praktikant
02. marts 2005 - 12:53 #13
Well, næsten som du selv har gjort... Hvis vi lige udvider klassen:

class pgDatabase
{

  private $connection;
  private $querystack = array();
  private $activeQuery;

  function connect()
  {
      if ( !is_resource( $this->connection ) )
      {
        $conn = pg_connect( "host=localhost port=5432 dbname=mary" );
        if ( !is_resource( $conn ) )
        {
            throw new Exception( "Could not connect to database!" );
        }
        $this->connection = $conn;
      }
      return true;
  }
 
  function query( $sql )
  {
      if ( !is_resource( $this->connection ) )
      {
        $this->connect();
      }
      $qry = pg_query( $sql );
      if ( is_resource( $qry ) )
      {
        array_push( $this->querystack[], $qry );
        $this->activeQuery = $qry;
      }
      else
      {
        throw new Exception( "Query error. " . pg_last_error() );
      }
  }
 
  function free()
  {
      if ( count( $this->querystack ) > 0 )
      {
        $qry = array_pop( $this->querystack );
        pg_free_result( $qry );
        if ( count( $this->querystack ) > 0 )
        {
            $this->activeQuery = $this->querystack[ count( $this->querystack ) - 1 ];
        }
        else
        {
            $this->activeQuery = NULL;
        }
      }
  }

  function num_rows()
  {
      if ( is_resource( $this->activeQuery ) )
      {
          return pg_num_rows( $this->activeQuery );
      }
      else
      {
          throw new Exception( "num_rows: No active queries left" );
      }
  }

  function getrow()
  {
      if ( is_resource( $this->activeQuery ) )
      {
          $res = pg_fetch_assoc( $this->activeQuery );
          if ( $res === false )
          {
              throw new Exception( "getrow: Failed!" );
          }
          return $res;
      }
      else
      {
          throw new Exception( "getrow: No active queries left" );
      }
  }
 
}

Og så noget kode:

$db = new pgDatabase;
try
{
  $db->query( "SELECT * FROM tabel" );
  if ( $db->num_rows() > 0 )
  {
      while ( $row = $db->getrow() )
      {
        echo "$row[felt]<br>";
      }
  }
  $db->free();
}
catch ( Exception e )
{
  // Smid fejlbeskeden ud!
  die( "Died with " . $e->getMessage() );
}
Avatar billede napisok Nybegynder
02. marts 2005 - 13:20 #14
Tak for det
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester