Chaque système de gestion de base de données (DBMS) possède son propre comportement. Par exemple, quelques base de données mettent les noms des champs en majuscules lors de l'affichage, d'autres les mettent en minuscule, d'autres encore ne font rien. Ces différences rendent difficile le portage de scripts d'un type de serveur à un autre. PEAR DB essaye de s'adapter au mieux pour diminuer ces différences, pour que vos migrations ne soient plus un calvaire.
Vous contrôlez le mode de portabilité en utilisant l'option de configuration portability. Vous définissez ces options en utilisant connect() et setOption().
Les modes de portabilités sont des bits, ils peuvent donc être combinés en utilisant | et supprimés en utilisant ^. Regardez les exemples suivants pour comprendre.
DB_PORTABILITY_ALL
active les fonctionnalités de portabilité
DB_PORTABILITY_DELETE_COUNT
force à renvoyer le nombre de lignes supprimées. Quelques DBMS ne compte pas les lignes effacées lors de l'exécution de requêtes simples comme DELETE FROM nomtable. Ce mode force ces DBMS à renvoyer le nombre en question en ajoutant WHERE 1=1 à la fin de la requête DELETE.
DB_PORTABILITY_ERRORS
rend les messages d'erreurs de certains pilotes compatibles avec les messages des autres serveurs
Pilote | Description | Ancienne constante | Nouvelle constante |
---|---|---|---|
mysql, mysqli | contraintes de clefs uniques/primaires | DB_ERROR_ALREADY_EXISTS | DB_ERROR_CONSTRAINT |
mysql, mysqli | contraintes non-nul | DB_ERROR_CONSTRAINT | DB_ERROR_CONSTRAINT_NOT_NULL |
odbc(access) | le pilote MS ODBC fait une erreur en rapportant 'no such field' (aucun champ portant ce nom) avec le code 07001, qui signifie 'pas assez de paramètres.' Lorsque cette option est activée, le code est rectifié. | DB_ERROR_MISMATCH | DB_ERROR_NOSUCHFIELD |
DB_PORTABILITY_LOWERCASE
convertit le nom des tables et des champs en minuscules lors de l'utilisation de get*(), fetch*() et tableInfo()
DB_PORTABILITY_NONE (défaut)
Désactive les fonctionnalités de portabilité
DB_PORTABILITY_NULL_TO_EMPTY
convertit les valeurs nulles en chaînes vides pour les fonctions get*() et fetch*(). Cela est requis car Oracle considère les chaînes vides comme étant null, alors que la plupart des autres pilotes font la différence entre vide et null.
DB_PORTABILITY_NUMROWS
active un script qui fait fonctionner numRows() avec Oracle
DB_PORTABILITY_RTRIM
Supprime les espaces blancs de la droite des données renvoyées par get*() et fetch*()
Quelques fonctionnalités étaient supportées par l'option optimize qui est maintenant déconseillée. Pour une compatibilité ascendante, lorsque cette option est configurée à portability, les bases de données suivantes ont ces modes de portabilité activés :
oci8: DB_PORTABILITY_LOWERCASE et DB_PORTABILITY_DELETE_COUNT
fbsql, mysql, mysqli, sqlite : DB_PORTABILITY_DELETE_COUNT
Lorsque l'option optimize est configurée à la valeur performance, le mode de portabilité est changé en DB_PORTABILITY_NONE.
Activer toutes les options de portabilité lors de la connexion
<?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());
}
?>
Utilisation de setOption() pour activer la portabilité pour le passage en minuscules et le nettoyage des espaces blancs à droite
<?php
// On suppose que vous avez un objet $db valide...
$db->setOption('portability',
DB_PORTABILITY_LOWERCASE | DB_PORTABILITY_RTRIM);
?>
Utilisation de setOption() pour activer toutes les options de portabilité à part le nettoyage des espaces blancs à droite
<?php
// On suppose que vous avez un objet $db valide...
$db->setOption('portability',
DB_PORTABILITY_ALL ^ DB_PORTABILITY_RTRIM);
?>