Page 1 sur 1

Erreur 500 ORA-01722 lors d'un update

Posté : 20 mars 2012, 17:49
par jeepyfr
Bonjour à tous,
100% novice en PHP, je debugue une appli developpée par un stagiaire.
Mon soucis est le suivant :
Je recupère une erreur 500 lors de l’update sur une valeur numérique avec décimales.
L’update vers Oracle fonctionne très bien tant que je ne mets pas de symbole décimal.

Le message récupéré dans le php-errors.log est le suivant :

[20-Mar-2012 15:15:03 UTC] PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 1722 OCIStmtExecute: ORA-01722: invalid number
(ext\pdo_oci\oci_driver.c:356)' in C:\inetpub\wwwroot\Infirm\attest_salairedetail.php:1144
Stack trace:
#0 C:\inetpub\wwwroot\Infirm\attest_salairedetail.php(1144): PDO->exec('UPDATE an_infir...')
#1 {main}
thrown in C:\inetpub\wwwroot\Infirm\attest_salairedetail.php on line 1144

Mon serveur est en W2k8, php 5.3.9 et IIS 7.5

Lorsque je teste la page sur la machine de developpement (Seven, easyphp 5.3.8.1) en localhost tout fonctionne.

Merci par avance pour tout aiguillage. :priere: :priere:

Re: Erreur 500 ORA-01722 lors d'un update

Posté : 20 mars 2012, 19:11
par moogli
Salut,

Il faudrait voir le code html et php. Avoir une idée de la table en question.

Si tu donne à manger le message d'erreur d'oracle (oui c'est erreur oracle et non php ;) ) a Google tu devrais tomber sur la dix du message d'erreur.

Je pense que :
- soit le champs n'est pas prévue pour avoir une virgule (number....)
- soit on peux utiliser un separateur decimal mais tu n'utilise pas le bon, typiquement une virgule au lieux d'utiliser un point. Dans ce cas c'est simple il faut remplacer la virgule par un point (str_replace).

@+

Re: Erreur 500 ORA-01722 lors d'un update

Posté : 21 mars 2012, 09:45
par jeepyfr
Bonjour,

Voici le code qui transforme la saisie utilisateur en nombre au format 999,99 pour être mis à jour dans la table Oracle

if(isset($_POST['montantbrut1']) && !empty($_POST['montantbrut1']))
{
if($oldmontantbrut1!=formatennombre($_POST['montantbrut1']))
{
if(strlen($data) > 0)
{
$data .= ', ';
}
$data .= 'MONTANTBRUT1 = \''.doubleapostrophe(formatennombre($_POST['montantbrut1'])).'\'';
}
}
echo $data; <---- Ca c'est moi !

Détail ds fonctions :
function formatennombre($nb)
{
$tmp = trim($nb);
$tmp= str_replace("€","",$tmp);
$tmp= str_replace(" ","",$tmp);
$tmp= str_replace(".",",",$tmp);
return $tmp;
}
function doubleapostrophe($str)
{
$result= str_replace("'","''",$str);
return $result;
};

Voici les différents Echo récupérer sur le poste lancant l'application via http:127.0.0.1\app
MONTANTBRUT1 = '222,11'
UPDATE an_infirm.ATTEST_ACCIDENT_TRAV SET MONTANTBRUT1 = '222,11' WHERE NUM_ATTEST = 1743
La mise à jour s'effectue correctement dans la base Oracle

Sur le serveur http:\\ipserveur\app l'éxécution de la même transaction me renvoi le code erreur 500....

Autre point relevé, sur le même poste de travail, le symbole décimal en utilisant l'application en local est la virgule alors que sur le serveur c'est le point qui s'affiche. Cela a t'il son importance ?

Merci

Re: Erreur 500 ORA-01722 lors d'un update

Posté : 21 mars 2012, 09:54
par Mazarini
Autre point relevé, sur le même poste de travail, le symbole décimal en utilisant l'application en local est la virgule alors que sur le serveur c'est le point qui s'affiche. Cela a t'il son importance ?
Il faut que l'écriture du décimal soit conforme avec le paramétrage de la base de données. Donc tu dois changer le paramétrage d'une des 2 bases. Tu peux aussi définir de symbole décimal dans une constante et utiliser cette constante.

Par gout personnel je stockerai les données avec un point et je gèrerai la virgule à l'affichage et en reception de saisie (à moins que tes utilisateurs accepte le point comme décimal).