Jedes Datenbank-Management-System (DBMS) hat seine eigenen Verhaltensweisen, trotz des gemeinsamen SQL-Standards. Z.B. einige Datenbanken geben den Spaltennamen in Großbuchstaben aus, andere in Kleinbuchstabe, und manche wie er definiert wurde. Diese Eigenarten erschweren die Kompatibilität von Skripten zwischen verschieden DBMS. PEAR::DB bemüht sich dieses Unterschiede zu minimieren, damit Programme unter verschiedenen DBMS funktionieren.
Sie können den Portabilitäts-Modus mit der Konfigurations-Option portability aktivieren. Diese können Sie bei der Methode connect() setzen oder über die setOption()-Methode.
Es stehen verschieden Modi zur Verfügung, die miteinander bei Bit-Verknüpfung kombiniert werden können. Dazu benutzen Sie das Zeichen | zum verknüpfen und das Zeichen ^ um einen Modus zu entfernen. Weiter unten finden Sie einige Beispiele, die dies zeigen.
DB_PORTABILITY_ALL
Aktiviert alle Portabilitäts-Funktionen
DB_PORTABILITY_DELETE_COUNT
Erzwingt die Rückmeldung, wieviele Datensätze gelöscht wurden. Einige DBMS geben nicht die Anzalh gelöschter Datensätze zurück, wenn eine einfache DELETE FROM tablename-Abfrage durchgeführt wurde. Dieser Modus ergänzt bei Löschabfragen einfach WHERE 1=1 am Ende der Abfrage, da diese dann die Anzahl zurückliefern.
DB_PORTABILITY_ERRORS
Gleicht die Fehlermeldung bestimmter Treiber denen anderer DBMS an.
Treiber | Beschreibung | Alte Konstante | Neue Konstante |
---|---|---|---|
mysql, mysqli | Unique und PrimaryKey Contraints | DB_ERROR_ALREADY_EXISTS | DB_ERROR_CONSTRAINT |
mysql, mysqli | Not-null Constraints | DB_ERROR_CONSTRAINT | DB_ERROR_CONSTRAINT_NOT_NULL |
odbc(access) | Mircosofts ODBC-Treiber liefert bei der Fehlermeldung no such field fälschlicherweise den Fehlercode 07001, was aber bedeutet too few parameters. | DB_ERROR_MISMATCH | DB_ERROR_NOSUCHFIELD |
DB_PORTABILITY_LOWERCASE
Konvertiert die Tabellennamen und Felder immer zu Kleinbuchstaben, wenn auf sie per get*(), fetch*() oder tableInfo() zugegriffen wird.
DB_PORTABILITY_NONE (default)
Schaltet die Portabilitäts-Funktionen aus.
DB_PORTABILITY_NULL_TO_EMPTY
Konvertiert null-Werte in leere Zeichenkette bei der Rückgabe über get*() und fetch*(). Dies ist für Oracle notwendig, da es leere Zeichenkette als null-Wert interpretiert, während andere dazwischen unterscheiden.
DB_PORTABILITY_NUMROWS
Benötigt, damit numRows() in Oracle funktioniert.
DB_PORTABILITY_RTRIM
Beschneidet Leerzeichen am Ende der Daten, die per get*() und fetch*() geholt werden.
Einige Funktionen wurden bereits über die optimize-Option aktiviert, diese sollte aber nicht mehr verwendet werden. Wenn diese Option mit dem Wert portability aufgerufen wird, werden bei den folgenden Datenbanken diese Modi angestellt:
oci8: DB_PORTABILITY_LOWERCASE und DB_PORTABILITY_DELETE_COUNT
fbsql, mysql, mysqli, sqlite: DB_PORTABILITY_DELETE_COUNT
Wenn die optimize-Option auf performance gestellt wird, wird der Portabilitäts-Modus auf DB_PORTABILITY_NONE gesetzt.
Alle Optionen anschalten beim Verbindungsaufbau
<?php
require_once 'DB.php';
$dsn = 'mysql://user:password@host/database'
$options = array(
'debug' => 2,
'portability' => DB_PORTABILITY_ALL,
);
$db =& DB::connect($dsn, $options);
if (PEAR::isError($db)) {
die($db->getMessage());
}
?>
setOption() benutzen, um die Portabilität für vollständige Kleinschreibung und Beschneidung einzuschalten.
setOption 1
<?php
// Once you have a valid DB object named $db...
$db->setOption('portability',
DB_PORTABILITY_LOWERCASE | DB_PORTABILITY_RTRIM);
?>
setOption() benutzen, um alle Portabilitätsmodi anzuschalten, mit der Ausnahme der Beschneidung.
setOption 2
<?php
// Once you have a valid DB object named $db...
$db->setOption('portability',
DB_PORTABILITY_ALL ^ DB_PORTABILITY_RTRIM);
?>