IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Connexion OCI


Sujet :

PHP & Base de données

  1. #1
    Invité
    Invité(e)
    Par défaut Connexion OCI
    Bonjour!

    Pour la première fois de ma vie, je dois accéder à une base de données oracle distante avec PHP.

    J'ai attrapé ce bout de code sur un site pour tester que tout fonctionne mais rien ne se passe... Pas de messages d'erreur, aucun affichage...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    <?php
    	$connect = ocilogon("truc","machin","host");
    	//Connexion à la base
     
    	$stmt = ociparse($connect,"select * lalala");
    	//On parse la requête à effectuer sans oublier de lui passer la chaine de connexion en paramêtre
     
    	ociexecute($stmt,OCI_DEFAULT);
    	//On execute la requête en lui passant l'option OCI_DEFAULT
     
     
    	echo "Début----<br>\n\n";
     
    	while (ocifetch($stmt)){ //On parcourt les résultats
    	  echo ociresult($stmt,1); //On récupère le premier champ de la ma_table
    	  echo ociresult($stmt,2); //On récupère le deuxième champ de la ma_table
    	}
     
    	echo "<br>----fin\n\n";
     
    	ocilogoff($connect);
    	//On se déconnecte du serveur
    ?>

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 220
    Points
    220
    Par défaut
    Aves oci8 il faut tester les retours de chaque fonction, si c'est false, ça a échoué.

    Si vous avez le choix, prenez plutôt une interface objet, par exemple le composant Zend_Db du Zend Framework.

    Au moins vous aurez des exceptions

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Points : 1 460
    Points
    1 460
    Stay in Bed .. Save Energy

  4. #4
    Invité
    Invité(e)
    Par défaut
    Merci pour vos réponses.

    J'ai encore cherché et testé plusieurs script mais mon écran reste blanc!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $cnx = oci_connect("truc", "machin", "@11.11.11.11:1521");
     
    if(!$cnx)
    echo "erreur : ".oci_error();
    et sur IE j'ai une erreur 500 !

    Je ne comprends pas ce que j'ai fait de faux

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 220
    Points
    220
    Par défaut
    Citation Envoyé par babastutz Voir le message
    Merci pour vos réponses.

    J'ai encore cherché et testé plusieurs script mais mon écran reste blanc!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $cnx = oci_connect("truc", "machin", "@11.11.11.11:1521");
     
    if(!$cnx)
    echo "erreur : ".oci_error();
    et sur IE j'ai une erreur 500 !

    Je ne comprends pas ce que j'ai fait de faux
    Ah les erreurs PHP doivent être cachées

    Essayez ceci au début de votre page PHP :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
        error_reporting(E_ALL | E_STRICT);    
        ini_set('display_startup_errors', 1);
        ini_set('display_errors', 1);

  6. #6
    Invité
    Invité(e)
    Par défaut
    @rbaraer : Aaaah ! Maintenant j'ai une belle erreur !!!
    Call to undefined function oci_connect()
    ... pourquoi cette fonction n'est-elle pas reconnu ? J'ai pourtant bien configuré mon serveur. Je crois

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Points : 1 460
    Points
    1 460
    Par défaut
    dans ton fichier php.ini tu dois decommenter la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ;extension=php_oci8.dll
    Stay in Bed .. Save Energy

  8. #8
    Invité
    Invité(e)
    Par défaut
    @boo64: C'est déjà fait. J'ai décommenté la ligne et redémarrer mon serveur. La dll est bien présente sur le serveur

  9. #9
    Invité
    Invité(e)
    Par défaut
    Ma ligne "extension=php_oci8.dll" est bien décommentée par contre, dans le php.ini, sour la partie OCI8, rien n'est décommenté. Est-ce normal?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    [OCI8]
    ; enables privileged connections using external credentials (OCI_SYSOPER, OCI_SYSDBA)
    ;oci8.privileged_connect = Off
     
    ; Connection: The maximum number of persistent OCI8 connections per
    ; process. Using -1 means no limit.
    ;oci8.max_persistent = -1
     
    ; Connection: The maximum number of seconds a process is allowed to
    ; maintain an idle persistent connection. Using -1 means idle
    ; persistent connections will be maintained forever.
    ;oci8.persistent_timeout = -1
     
    ; Connection: The number of seconds that must pass before issuing a
    ; ping during oci_pconnect() to check the connection validity. When
    ; set to 0, each oci_pconnect() will cause a ping. Using -1 disables
    ; pings completely.
    ;oci8.ping_interval = 60
     
    ; Tuning: This option enables statement caching, and specifies how
    ; many statements to cache. Using 0 disables statement caching.
    ;oci8.statement_cache_size = 20
     
    ; Tuning: Enables statement prefetching and sets the default number of
    ; rows that will be fetched automatically after statement execution.
    ;oci8.default_prefetch = 10
     
    ; Compatibility. Using On means oci_close() will not close
    ; oci_connect() and oci_new_connect() connections.
    ;oci8.old_oci_close_semantics = Off

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 220
    Points
    220
    Par défaut
    Citation Envoyé par babastutz Voir le message
    Ma ligne "extension=php_oci8.dll" est bien décommentée par contre, dans le php.ini, sour la partie OCI8, rien n'est décommenté. Est-ce normal?
    Non ce n'est pas grave : les valeurs en commentaires sont celles par défaut. Le problème vient d'ailleurs...

    Je pense qu'il manque un client Oracle, non ? Suivez la procédure d'install pour voir s'il ne manque rien.

  11. #11
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Points : 1 460
    Points
    1 460
    Par défaut
    je pense que tu as ton install qui n'est pas complète dans ce cas:

    http://fr.php.net/manual/fr/oci8.requirements.php

    et pour les paramètre de config que tu cites : http://fr.php.net/manual/fr/oci8.configuration.php

    ps: à mince j'avais pas vu que rbaraer avais déjà répondu dsl
    Stay in Bed .. Save Energy

  12. #12
    Invité
    Invité(e)
    Par défaut
    Ah !!! Je comprends maintenant pourquoi ça ne fonctionne pas. Le client oracle n'est pas installé sur le serveur en prod!!

    Je l'ai téléchargé mais je ne comprends pas comment l'installer. Il faut ajouter le chemin de dossier dans PATH ? C'est tout ?

  13. #13
    Invité
    Invité(e)
    Par défaut
    J'ai installé le client oracle (dernière version 11.1). J'ai ajouté le chemin dans le PATH. Maintenant on me parle de variables d'environnement (NLS_LANG, etc.)

    Ces variables doivent être ajouter sur le serveur client ou sur le serveur où il y a la base de données oracle? Quelle valeur donner à ces variables ?

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 220
    Points
    220
    Par défaut
    NLS_LANG est essentiellement à définir sur le "client" du point de vue d'Oracle, c'est à dire la machine à partir de laquelle vous vous connectez à Oracle, donc dans le cas de PHP le serveur web (qui peut aussi être le serveur de base de données).

    Cette variable est très importante car elle définit comment Oracle considère les données qu'on lui envoie depuis la machine où elle est définie : jeu de caractère pour les strings, format par défaut pour les dates et les nombres si on les passe en strings, façon de trier les strings...

    Voici la doc.

  15. #15
    Invité
    Invité(e)
    Par défaut
    Merci! J'ai défini NLS_LANG sur mon poste client mais je n'arrive toujours pas à me connecter...

    Voici l'erreur :

    Citation Envoyé par erreur
    Warning: oci_connect() [function.oci-connect]: ORA-12170: TNS:Connect timeout occurred in C:\chemin\fichier.php on line 6
    Array
    Ai-je oublié de configurer quelque chose?

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2009
    Messages : 26
    Points : 33
    Points
    33
    Par défaut
    bonjour,
    avez-vous configuré les fichiers tnsnames.ora et listener.ora ?
    bonne soirée

  17. #17
    Invité
    Invité(e)
    Par défaut
    Bonjour et merci de votre réponse.

    Non, je n'ai pas configuré ces fichiers. Ou sont-ils ? Que dois-je faire? Je sais qu'il y a déjà une application en java qui utilise cette base de données oracle.

  18. #18
    Membre habitué
    Profil pro
    Administrateur système
    Inscrit en
    Mai 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur système

    Informations forums :
    Inscription : Mai 2002
    Messages : 144
    Points : 159
    Points
    159
    Par défaut
    Salut à tous.

    Je débute aussi un projet PhP-Oracle 10g.
    Pour mémoire, voici 2 liens récents et intéressants sur la question (en anglais):

    http://www.oracle.com/technology/pub...p_instant.html

    http://www.orafaq.com/wiki/PHP_FAQ

    Bonne lecture.
    Si un jour on te reproche que ton travail n'est pas un travail de professionnel, dis-toi bien que l'Arche de Noé a été construite par des amateurs et le Titanic par des professionnels...

  19. #19
    Membre habitué
    Profil pro
    Administrateur système
    Inscrit en
    Mai 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur système

    Informations forums :
    Inscription : Mai 2002
    Messages : 144
    Points : 159
    Points
    159
    Par défaut
    C'est ok pour moi en suivant les indications données dans les liens précédents.

    A noter que la variable NS_LANG doit être créée dans la base de registre (je suis sous Win2003 Server), dans la HKLM\Software\Oracle.
    Il faut lui donner la même valeur que celle définie sur le serveur Oracle. Dans mon cas: FRENCH_FRANCE.WE8MSWIN1252.

    Voilà. Si ça peut aider ...
    Si un jour on te reproche que ton travail n'est pas un travail de professionnel, dis-toi bien que l'Arche de Noé a été construite par des amateurs et le Titanic par des professionnels...

  20. #20
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 220
    Points
    220
    Par défaut
    Citation Envoyé par FranT Voir le message
    A noter que la variable NS_LANG doit être créée dans la base de registre (je suis sous Win2003 Server), dans la HKLM\Software\Oracle.
    Il faut lui donner la même valeur que celle définie sur le serveur Oracle. Dans mon cas: FRENCH_FRANCE.WE8MSWIN1252.
    En tant que variable d'environnement ça devrait marcher aussi (je crois que le registre est privilégié si les 2 sont renseignés).

    La valeur de NLS_LANG est généralement la même sur le serveur et sur le client, mais est potentiellement différente sur chaque poste : elle est là pour que le client Oracle s'adapte à l'affichage du poste client.

    Par exemple, admettons que la base de données utilise l'encodage UTF8 et puisse donc accepter tous les caractères dans le monde.

    Ensuite un américain se connecte, sur son poste NLS_LANG sera AMERICAN_AMERICA.UTF16, ce qui veut dire qu'il veut les dates et les chiffres au format américain, les tris selon les habitudes américaines... et afficher le texte en UTF16 (Oracle va alors transformer tous les champs textes de la base d'UTF8 en UTF16 et inversement quand le client envoie des données).

    Un japonais va ensuite se connecter avec JAPANESE_JAPAN.UTF8 (à vérifier ), lui va avoir les dates et les chiffres au format japonais, les tris selon les habitudes japonaises, et les textes comme dans la base, en UTF8.

    Puis un français avec FRENCH_FRANCE.WE8MSWIN1252, lui va avoir les dates et les chiffres au format français, les tris selon les habitudes françaises, et les textes en latin 1 Windows occidental (Oracle va alors transformer tous les champs textes de la base d'UTF8 en WE8MSWIN1252 et inversement quand le client envoie des données).

    En gros, pour une appli franco-française, tous les postes auront FRENCH_FRANCE et le jeu de caractère attendu par le client.

    Pour résumer :

    - ce qui est sur le serveur est toujours au même format : les dates sont des DATE ou TIMESTAMP dans le format interne d'Oracle, les nombres des NUMBER dans le format interne d'Oracle et les textes sont encodés avec l'encodage spécifié à la création de la BD

    - la façon de présenter (et plus largement d'échanger) ces données diffère sur chaque client et est dépendante de NLS_LANG (et plus généralement des paramètres NLS qui peuvent être définis à plusieurs niveaux)

    En espérant avoir été clair

Discussions similaires

  1. Réponses: 6
    Dernier message: 02/05/2010, 19h09
  2. [OCI] Extraire le nom, le pass et le service d'une chaine de connexion
    Par elekis dans le forum Interfaces de programmation
    Réponses: 1
    Dernier message: 16/04/2008, 16h26
  3. Problème connexion Oralce 10.2 via OCI sur AIX
    Par chenxg dans le forum JDBC
    Réponses: 1
    Dernier message: 16/10/2007, 12h04
  4. [OCI] Problème connexion Oralce 10.2 sur AIX (JDBC)
    Par chenxg dans le forum Interfaces de programmation
    Réponses: 3
    Dernier message: 08/10/2007, 09h56
  5. Connexion a Oracle 9 avec driver oci
    Par bonnefr dans le forum JDBC
    Réponses: 2
    Dernier message: 17/01/2006, 08h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo