2016-07-13 11 views
-1

Die Dokumentation für php-interbase ist gut - aber nicht vollständig. Insbesondere gibt es keine vollständigen Beispiele für die Arbeit mit Firebird. Wie würdest du es tun?Best Practices bei der Verwendung von PHP mit Firebird oder Interbase

+1

... ist dies eine Frage? – jonrsharpe

+1

Bitte formuliere das als Frage und poste den Rest als Antwort auf deine eigene Frage. Es könnte sogar besser sein, es in mehrere Fragen aufzuteilen, da Sie mindestens drei verschiedene Punkte ansprechen. –

Antwort

1

Grundlegende Richtlinien.

  1. Die Wahl zwischen ibase_connect() vs ibase_pconnect() - die weniger Zeit Verbindungen aktiv sind die weniger möglichen Konflikte und die einfachere Wartung & Backups durchgeführt werden können. Wenn die Verbindung zur Datenbank in Bezug auf die Verarbeitungszeit nicht "teuer" ist (Sie führen große Mengen von Lese-/Schreibvorgängen in Echtzeit durch), verwenden Sie ibase_connect() nach Bedarf.
  2. Verwenden Sie immer explizite Transaktionen. Immer. Es ist einfach - nehmen wir an, dass jeder Aufruf von ibase_prepare() oder ibase_query() eine Transaktionskennung benötigt - niemals eine "rohe" Verbindungskennung.
  3. Folgen Sie immer einer Transaktion mit entweder ibase_commit() oder ibase_rollback().

Grund Vorlage für einen Lesevorgang:

// These would normally come from an include file... 
$db_path = '/var/lib/firebird/2.5/data/MyDatabase.fdb'; 
$db_user = 'SYSDBA'; 
$db_pass = 'masterkey'; 

// use php error handling 
try { 
    $dbh = ibase_connect($db_path, $db_user, $db_pass); 
    // Failure to connect 
    if (!$dbh) { 
     throw new Exception('Failed to connect to database because: ' . ibase_errmsg(), ibase_errcode()); 
    } 

    $th = ibase_trans($dbh, IBASE_READ+IBASE_COMMITTED+IBASE_REC_NO_VERSION); 
    if (!$th) { 
     throw new Exception('Unable to create new transaction because: ' . ibase_errmsg(), ibase_errcode()); 
    } 

    $qs = 'select FIELD1, FIELD2, from SOMETABLE order by FIELD1'; 
    $qh = ibase_query($th, $qs); 

    if (!$qh) { 
     throw new Exception('Unable to process query because: ' . ibase_errmsg(), ibase_errcode()); 
    } 

    $rows = array(); 
    while ($row = ibase_fetch_object($qh)) { 
     $rows[] = $row->NODE; 
    } 

    // $rows[] now holds results. If there were any. 

    // Even though nothing was changed the transaction must be 
    // closed. Commit vs Rollback - question of style, but Commit 
    // is encouraged. And there shouldn't <gasp>used the S word</gasp> 
    // be an error for a read-only commit... 

    if (!ibase_commit($th)) { 
     throw new Exception('Unable to commit transaction because: ' . ibase_errmsg(), ibase_errcode()); 
    } 

    // Good form would dictate error traps for these next two... 
    // ...but these are the least likely to break... 
    // and my fingers are getting tired. 
    // Release PHP memory for the result set, and formally 
    // close the database connection. 
    ibase_free_result($qh); 
    ibase_close($dbh); 
} catch (Exception $e) { 
    echo "Caught exception: $e\n"; 
} 

// do whatever you need to do with rows[] here...