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 :

Requete sql qui ne passe pas [Oracle]


Sujet :

PHP & Base de données

  1. #1
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut Requete sql qui ne passe pas
    Bonjour,

    Voila j'ai un probleme avec une requete

    en fait j'ai un formulaire avec un champ nom, description et position, et une fosi que j'envoie le formulaire j'ai une requete qui doit créer un nouvel enregistrement dans la bdd

    Le problème est lorsque je met une guillemet " dans un des champs texte.

    Je déclate ma requete dans une variable pour commencer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $requete = 'insert into ma_table values (\''.$nom.'\', \''.$desc.'\', '.$pos.')';
    ensuite je parse la requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $stmt = oci_parse($connect, $requete) or die ("erreur à la création");
    puis j'execute la requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oci_execute($stmt, OCI_DEFAULT) or die ("erreur a l'execution");
    Seulement si je met une guillemet dans un champ la requete plante a l'execution et aucune erreur n'est retournée lorsque je remplace le texte "erreur a l'execution" par la fonction oci_error() qui retourne la dernière erreur oracle (qui serait donc l'erreur due a la requete si elle était mauvaise). Or si elle ne retourne rien c'est qu'il n'y a pas d'erreur.

    En effet lorsque j'affiche la requete et que lje la copie dans la console oracle, l'enregistrement est créé. Par contre en le créant vianla console oracle, la ligne n'apparait pas ensuite dans le naviguateur lorsque j'affiche via php la liste des enregistrements de la table ...

    Help please

    Merci d'avance

  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
    Citation Envoyé par Sh4dow49 Voir le message
    En effet lorsque j'affiche la requete et que lje la copie dans la console oracle, l'enregistrement est créé. Par contre en le créant vianla console oracle, la ligne n'apparait pas ensuite dans le naviguateur lorsque j'affiche via php la liste des enregistrements de la table ...
    Effectues-tu bien le commit en PHP ?

  3. #3
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut
    oui je l'effectue juste avant la déconnexion

    Voici le script deconnexion.php qui est include dans chaque page dès qu'il y a eu connexion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?php
    	oci_commit($connect) or die ("Erreur lors de la validation de la requ&ecirc;te ...");
    	oci_close($connect) or die ("Erreur lors de la d&eacute;connexion de la base de donn&eacute;es ...");
    	oci_free_statement($stmt);
    ?>

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 76
    Points : 82
    Points
    82
    Par défaut
    Pour ton problème de côte, ton PHP est paramétré avec les magic quotes ou pas ? Si c'est pas le cas il faut que tu ajoutes des addslashes.

    par contre c'est bizarre que la fonction oci_error ne te renvoie rien...

  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 rapha51 Voir le message
    par contre c'est bizarre que la fonction oci_error ne te renvoie rien...
    C'est pour ça que j'ai posé la question du commit.

    Effectivement peut-être avec addslashes...

    De toute façon, il vaudrait mieux utiliser des requêtes préparées

    http://g-rossolini.developpez.com/tu.../?page=donnees

    http://asktom.oracle.com/pls/asktom/f?p=100:11:0:::11_QUESTION_ID:35816267380038

    http://asktom.oracle.com/pls/asktom/f?p=100:11:0:::11_QUESTION_ID:1993620575194

    http://http://chrisgatesconsulting.com/preparedStatements.ppt#281,26,Soft Parse Isn't Enough

    Pour résumer : le système de cache de requêtes d'Oracle ne fonctionne bien que lorsque 99% des requêtes sont des requêtes préparées !

    HTH

  6. #6
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut
    J'ai testé le addslashes et voila ce qui s'est passé :

    j'ai testé avant et après le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    str_replace("'", "''", $chain);
    mais il ne met un antislash que devant les quotes, et non devant la guillemet, or la quote s'échappe sous oracle en la doublant (d'ou le str_replace) mais la guillemet n'a pas besoin d'être échappée sous oracle. de plus la fonction addslashes n'a pas ajouté d'anti slash devant.

    Je vais me pencher sur les requetes préparées pour voir si ca change quelque chose ou pas ... (si quelqu'un a autre chose à proposer en attendant je suis preneur de toutes les solutions)

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 76
    Points : 82
    Points
    82
    Par défaut
    je viens de faire un petit test sur les guillements (tu as raison sous oracle on est pas obligé de les 'backslasher') :
    echo(addslashes('test"test'));
    résultat : test\"test

    pour les quotes tu as raison : sous oracle c'est ''

    ton problème ne vient peut pas de la gestion des quotes et guillements

    le plus bizarre dans ton problème c'est que oci_error ne te détecte pas d'erreur...

  8. #8
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut
    oui j'ai fait je même test que toi ça marche mais lorsque le l'utilise sur des chaines stockées dans des variables ça ne marche plus ...

    Par contre pour le fait que oci_error() ne retourne pas d'erreur je pense que cela vient du fait que la requete est bonne malgré le fait que php ne l'interprète pas.

    En fait si j'affiche ma requete via la page internet, je la copie et le l'execute a partir d'une console sqlplus, et la ca marche.

    Par contre si j'essaye d'exécuter la requete via php et la fonction oci_execute, la requete ne passe pas et il n'y a donc pas d'erreur oracle, et si j'execute la requete via sqlplus et que j'essaye d'afficher en suite la liste des enregistrements les requetes qui ne sont pas passées via oci_execute et que j'ai créés via sqlplus ne s'affichent pas ...

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 76
    Points : 82
    Points
    82
    Par défaut
    petite question très bête (mais dès fois c'est ces questions qui font avancer) : en PHP, t'es sur d'être bien connecté sur la bonne base ?

  10. #10
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut
    oui puisque si je met du texte sans guillemet l'enregistrement se fait bien. Le problème ne provient que lorsque j'ai une guillemet

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 76
    Points : 82
    Points
    82
    Par défaut
    autre petite question :
    quand tu remplaces "erreur a l'execution" par la fonction oci_error(), tu affiches quel élement du tableau retourné par oci_error() ? code ou message ?

  12. #12
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut
    ben je sais pas ... je met juste oci_error() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... or die(oci_error());

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 76
    Points : 82
    Points
    82
    Par défaut
    oci_error() te renvoi un tableau...je suis pas sur que die(oci_error()) va t'afficher le tableau retourné par oci_error()...peut etre que oui.
    d'ailleurs il y a un paramètre à passer à oci_error() dans certains cas de figure.

    moi dans mes codes j'ai des trucs du style :
    $wrk_res = oci_parse($connexion, $requete);
    $wrk_ret = oci_execute($wrk_res, OCI_DEFAULT);
    if (!$wrk_ret)
    {
    $wrk_err = oci_error($wrk_res);
    $ERR_TXT = "Erreur Oracle ".$wrk_err['code']." - ".$wrk_err['message'];
    echo($ERR_TXT); // par exemple
    }

  14. #14
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut
    j'ai essayé un truc dans le genre de ce que tu as fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?php
    	$stmt = oci_parse($connect, $requeteSQL) or die("Erreur lors de la cr&eacute;ation de la requ&ecirc;te ...");
    	$r = oci_execute($stmt, OCI_DEFAULT);
    	if (!$r)
    	{
    		$e = oci_error($r);
    		$err_txt = 'erreur oracle '.$e['code'].' - '.$e['message'];
    		echo $err_txt;
    	}
    ?>
    sur un enregistrement qui marchait normalement avant rien n'a changé, avec une guillemet l'enchainement des actions est le meme que que lorsque ca marche a 2 choses près : il affiche "erreur oracle - " (donc les erreurs n'apparaissent pas) et l'enregistrement n'est pas créé

    Je viens de remarquer que sur le champ nom (clef primaire de la table) la guillemet deconne, sur le champ description, elle fonctionne sans problème ...

    Est ce que cela viendrait donc du fait que la clef primaire n'accepte pas les guillemets ?

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 76
    Points : 82
    Points
    82
    Par défaut
    Est ce que cela viendrait donc du fait que la clef primaire n'accepte pas les guillemets ?
    Aucune idée, je vais faire un test quand j'aurai 5mn

    Pour etre sur que ta gestion d'erreur fonctionne, dans ta requete mets un mauvais nom de table ou un mauvais nom de colonne, dans ce cas de figure je suis sur que tu devrais avoir quelque chose dans $err_txt

  16. #16
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut
    trouvé : la guillemet est remplacée par &quot; ... ce qui fai que la chaine était trop grande pour entrer dans le champ

    j'ai donc ajouté un petit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    str_replace("& quot;", "\"", $ma_var);
    avant l'enregistrement (sans l'espace ^^)

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 76
    Points : 82
    Points
    82
    Par défaut
    et tu sais ce qui te convertissait tes guillemets en &quot; ?

  18. #18
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut
    Probablement la fonction htmlentities

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] requete sql qui ne fonctionne pas
    Par Ladslman dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 16/01/2009, 14h09
  2. [Access] requete sql qui ne fonctionne pas
    Par pobrouwers dans le forum Langage SQL
    Réponses: 4
    Dernier message: 15/03/2007, 12h33
  3. requete sql qui ne fonctionne pas
    Par pobrouwers dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 15/03/2007, 09h37
  4. [MySQL] requete sql qui ne donne pas le bon array
    Par easyjava dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 02/11/2006, 14h41
  5. [hibernate]requete SQL qui ne passe pas
    Par Gromitou dans le forum Hibernate
    Réponses: 8
    Dernier message: 09/06/2006, 12h18

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