Mise en forme des chaînes décimales et valeurs monétaires (pilote PDO_SQLSR)
Pour préserver la précision, les types décimaux ou numériques sont toujours récupérés sous forme de chaînes avec des précisions et des échelles exactes. Si une valeur est inférieure à 1, le zéro non significatif est manquant. C’est identique aux champs money et smallmoney, car il s’agit de champs décimaux avec une échelle fixe égale à 4.
Ajouter des zéros non significatifs s’ils sont manquants
À partir de la version 5.6.0, l’attribut de connexion ou d’instruction PDO::SQLSRV_ATTR_FORMAT_DECIMALS
permet à l’utilisateur de mettre en forme des chaînes décimales. Cet attribut attend une valeur booléenne (true ou false) et affecte uniquement la mise en forme des valeurs décimales ou numériques dans les résultats récupérés. En d’autres termes, cet attribut n’a aucun effet sur les autres opérations, telles que l’insertion ou la mise à jour.
Par défaut, PDO::SQLSRV_ATTR_FORMAT_DECIMALS
est défini sur false. Si la valeur est true, les zéros non significatifs pour les chaînes décimales sont ajoutés pour toute valeur décimale inférieure à 1.
Configurer le nombre de décimales
Si PDO::SQLSRV_ATTR_FORMAT_DECIMALS
est activé, un autre attribut de connexion ou d’instruction, PDO::SQLSRV_ATTR_DECIMAL_PLACES
, permet aux utilisateurs de configurer le nombre de décimales lors de l’affichage des données money et smallmoney. Il accepte les valeurs entières dans la plage [0, 4], et un arrondi peut se produire lorsqu’il est affiché. Toutefois, les données monétaires sous-jacentes restent les mêmes.
Les attributs d’instruction remplacent toujours les paramètres de connexion correspondants. Notez que l’option PDO::SQLSRV_ATTR_DECIMAL_PLACES
affecte uniquement les données money, et que PDO::SQLSRV_ATTR_FORMAT_DECIMALS
doit avoir la valeur true. Dans le cas contraire, la mise en forme est désactivée, quel que soit le paramètre PDO::SQLSRV_ATTR_DECIMAL_PLACES
.
Notes
Étant donné que les champs money ou smallmoney ont l’échelle 4, la définition de PDO::SQLSRV_ATTR_DECIMAL_PLACES
sur un nombre négatif quelconque ou sur une valeur supérieure à 4 est ignorée. Il n’est pas recommandé d’utiliser des données monétaires mises en forme comme entrées pour un calcul.
Définir les attributs de connexion
Définissez les attributs au point de connexion :
$attrs = array(PDO::SQLSRV_ATTR_FORMAT_DECIMALS => true, PDO::SQLSRV_ATTR_DECIMAL_PLACES => 2); $conn = new PDO("sqlsrv:Server = myServer; Database = myDB", $username, $password, $attrs);
Définissez les attributs post-connexion :
$conn = new PDO("sqlsrv:Server = myServer; Database = myDB", $username, $password); $conn->setAttribute(PDO::SQLSRV_ATTR_FORMAT_DECIMALS, true); $conn->setAttribute(PDO::SQLSRV_ATTR_DECIMAL_PLACES, 2);
Exemple : mise en forme de données money
L’exemple suivant montre comment extraire des données money à l’aide de PDOStatement::bindColumn :
<?php
$database = "myDB";
$server = "(local)";
$conn = new PDO( "sqlsrv:server=$server; Database = $database", "", "");
$conn->setAttribute(PDO::SQLSRV_ATTR_FORMAT_DECIMALS, true);
$numDigits = 3;
$query = "SELECT smallmoney1 FROM aTable";
$options = array(PDO::SQLSRV_ATTR_DECIMAL_PLACES => $numDigits);
$stmt = $conn->prepare($query, $options);
$stmt->execute();
$stmt->bindColumn('smallmoney1', $field);
$result = $stmt->fetch(PDO::FETCH_BOUND);
echo $field; // expect a number string with 3 decimal places
unset($stmt);
unset($conn);
?>
Exemple : remplacer les attributs de connexion
L’exemple suivant montre comment remplacer les attributs de connexion :
<?php
$database = 'myDatabase';
$server = 'myServer';
$username = 'myuser';
$password = 'mypassword'
$conn = new PDO("sqlsrv:server=$server; Database = $database", $username, $password);
$conn->setAttribute(PDO::SQLSRV_ATTR_FORMAT_DECIMALS, true);
$conn->setAttribute(PDO::SQLSRV_ATTR_DECIMAL_PLACES, 2);
$query = 'SELECT smallmoney1 FROM testTable1';
$options = array(PDO::SQLSRV_ATTR_FORMAT_DECIMALS => false);
$stmt = $conn->prepare($query, $options);
$stmt->execute();
$stmt->bindColumn('smallmoney1', $field);
$result = $stmt->fetch(PDO::FETCH_BOUND);
echo $field; // expect a number string showing the original scale -- 4 decimal places
unset($stmt);
unset($conn);
?>
Voir aussi
Mise en forme des chaînes décimales et valeurs monétaires (pilote SQLSRV)