Bonjour cher tous !
Cela fait un bout de temps que je me familiarise avec la classe PDO de PHP5. Je l'ai utilisé avec MySQL et tout allait bien; je parvenais bien à générer les exception lorsqu'un problème se posait. Mais alors il m'a été demandé de passer au SGBD Oracle. Ce que j'ai fait en changeant principalement le driver et en modifiant certaine requêtes. la migration c'est bien passée.

PROBLEME : Lorsqu'il y a un problème dans une requête lors de l'exécution, rien ne signale pas d'exception, pas de notification. Et lorsque j'essaie d'activer les exceptions avec l'instruction :

$connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
J'obtiens un problème de connexion, pourtant celà passe très bien avec MySQL. Je ne sais donc pas d'il existe une autre manière de faire cela propre à Oracle. ou alors tout autre moyen pouvant me permettre de lever les alertes lorsqu'une requête est invalide.

Merci de votre aide.

7 réponses


Coucou, Est-ce que tu peux donner le mmessage d'erreur quand t'essaies de faire le setAttributes ?
Est-ce que tu peux parler un peu plus de l'environement ? local ? machine virtuelle ? serveur de production ?

En général entre Oracle et PDO il y a deux 'erreurs' fréquentes, une mauvaise configuration avec PDO_OCI.
Une version de PHP contenu dans variable d'environement PATH (qu'oracle utilise) qui n'est pas la bonne...

Avec le message d'erreur je pense qu'on vas avancer

edgard
Auteur

Merci Garniture-banner pour cette réponse immédiate.
En fait je travaille en local sur ma machine physique, ci dessous les instructions de connexion à la base de données.
$hote = '127.0.0.1';
$port = '1521'; // port par défaut
$service = 'BDGESODOCM';
$utilisateur = 'admingesod';
$motdepasse = 'admin';

$lien_base =
"oci:dbname=(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS =
(PROTOCOL = TCP)
(Host = ".$hote .")
(Port = ".$port."))
)
(CONNECT_DATA =
(SERVICE_NAME = ".$service.")
)
)".';charset=UTF8';

try {
// connexion à la base Oracle et création de l'objet
$connexion = new PDO($lien_base, $utilisateur, $motdepasse);
$connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

//$this->setPdo($connexion) ;
}
catch (PDOException $e){
echo 'Erreur connexion : ' . $e->getMessage() . '<br />';
echo 'N° Error : ' . $e->getCode();
}

Et le message d'erreur est le suivant :

Erreur connexion : SQLSTATE[HY000]: General error: 911 OCIStmtExecute: ORA-00911: caractère non valide (ext\pdo_oci\oci_statement.c:148)
N° Error : HY000

Je pense que ceci pourra être utile.
Merci une fois de plus!

hihi trouvé !
d'après la doc php, le DSN oracle etre sous la forme suivante:

$dbc = new PDO('oci:dbname='.$dbname.':'.$port.'/orcl;charset=UTF-8', $username, $pwd);

tu faire attention aux '.' quand tu concatene, sinon Oracle te trouve un carractere invalide, ou alors ce sont las parentheses qu'il n'aime pas...

edgard
Auteur

Merci, mais je ne comprends pas quelque chose. ça ne marche toujours pas
Que dois mettre dans la variable $dbname ?

J'ai essayé avec ceci :

$dbname = "BDGESODOCM" ;
$dbc = new PDO('oci:dbname='.$dbname.':'.$port.'/orcl;charset=UTF-8', $utilisateur, $motdepasse);

J'ai aussi testé ceci :

$dbname = "BDGESODOCM" ;
$dbc = new PDO('oci:dbname='.$dbname.':'.$port.'/BDGESODOCM;charset=UTF-8', $utilisateur, $motdepasse);

Erreur : Erreur connexion : SQLSTATE[HY000]: OCINlsCharSetNameToId: unknown character set name (ext\pdo_oci\oci_driver.c:608)
N° Error : 0

Tu as mis 'orcl' est ce bien ? car mon service(et ma BD) s'appelle 'BDGESODOCM'.

Merci bien pour tes réponse immédiates.

Depuis PHP manuel pdo_oci il faut mettre:

$db = '//hostname/servicename'; //e.g. '//192.168.1.1/orcl'
$user = 'username';
$pass = 'password';
$conn = new PDO($db,$user,$pass);

Ce qui doit donner

$db = new PDO('oci:dbname='.$hote.'/'.$service.';charset=UTF-8',$utilisateur , $motdepasse);

et avec le port

$db = new PDO('oci:dbname='.$hote.':'.$port.'/'.$service.';charset=UTF-8',$utilisateur , $motdepasse);
edgard
Auteur

Merci j'ai testé avec

$db = new PDO('oci:dbname='.$hote.':'.$port.'/'.$service.';charset=UTF-8',$utilisateur , $motdepasse);

La connexion a bien réussie, mais lorsque j'essaie d'activer les exceptions avec :

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

J'obtient l'erreurs suivante :

Erreur connexion : SQLSTATE[HY000]: General error: 911 OCIStmtExecute: ORA-00911: caractère non valide (ext\pdo_oci\oci_statement.c:148)
N° Error : HY000

Je ne sais donc que faire car je veux pouvoir être au courant des erreurs dans les requêtes. Une aide SVP.

Le message d'erreur indique un carractere interdit, mais que je ne vois pas.
Essaie de remplacer tes simples quotes, par des doubles, vérifie qu'aucun espace ne traine, si tu copie/colle écris à la mano ( le légendaire carractere invisible...)
essaie sans le port.
Si rien de tout sa ne fonctionne se seche