Ne pas prendre en compte et conserver les caractères '?' avec odbc_exec

Baptiste
Invité n'ayant pas de compte PHPfrance

07 juil. 2008, 09:02

Bonjour,

Je viens de me rendre compte que lorsqu'il y a un ? dans ma requete, odbc me renvoi l'erreur suivante :

odbc_exec() [function.odbc-exec]: SQL error: Parameter ':Param1' not found

Voici une requete type :

Code : Tout sélectionner

$var = "voici un exemple avec un ? et puis voilà !"; $req = "update table set champ='".$var."' where champ2=".$var; odbc_exec($lien_odbc,$req);
Je cherche le moyen de dire à la fonction de ne pas prendre en compte le ?.
J'ai essayé :
  • \
  • " ou '
  • {} : cela fonctionne mais supprime les ?
Peut être est il possible de corriger le souci avec odbc_setoption ?

D'avance merci

ViPHP
ViPHP | 5924 Messages

07 juil. 2008, 09:12

Utiliser les requètes préparées que je pense te fournit odbc…

Baptiste
Invité n'ayant pas de compte PHPfrance

07 juil. 2008, 09:32

Tu veux dire :

odbc_prepare puis un odbc_excecute

Code : Tout sélectionner

$query = odbc_prepare($lien_odbc_itelcom, $req); $result = odbc_execute($query,$param);
Dans cet exemple param est un tableau composé de "?"

Mais cela ne fonctionne pas aussi, j'ai une autre erreur :

SQL error: The query returned an error (ODBC State: HY000) Error: NexusDB: <unnamed TnxODBCQuery instance>: Unexpected exception object raised: [Exception] Error: Attempt to set parameter on non-parameterized query

et la requete apparait avec à la place des ? des :param

ViPHP
ViPHP | 5924 Messages

07 juil. 2008, 09:47

Je voulais simplement dire que odbc va vouloir remplacer tous les points d'interrogation de la requète par des paramètres. Si les requètes préparées existe, ce n'est pas pour faire joli, c'est que tu n'es pas sensé passer des données directement dans ta requète mais les passer en paramètre. Ta manière d'utiliser odbc est un détournement, il est donc parfaitement logique que tu aies des problèmes de ce genre.
Je te suggère donc de vraiment utiliser les requètes préparées comme il se doit, pas d'utiliser des subterfuges pour essayer de le bluffer, la sécurité en sera par ailleurs d'autant plus améliorée...

Baptiste
Invité n'ayant pas de compte PHPfrance

07 juil. 2008, 10:38

Si je comprend bien pour être propre je dois fonctionner ainsi :

Code : Tout sélectionner

$var = "voici un exemple avec un ? et puis voilà !"; $req = "update table set champ=? where cledossier=?"; $query = odbc_prepare($lien_odbc_itelcom, $req); $result = odbc_execute($query,array($var,1));

Mammouth du PHP | 1511 Messages

07 juil. 2008, 12:02

Ne faut il pas quoter les valeurs des champs ? Simple question...

ViPHP
ViPHP | 5924 Messages

07 juil. 2008, 12:48

@Baptiste : Tu as tout compris :)
@momox : Non, justement la préparation de la requète est chargée de s'en occuper

Baptiste
Invité n'ayant pas de compte PHPfrance

07 juil. 2008, 14:07

Merci à toi Sékiltoyai tout fonctionne parfaitement.

Je vais corriger mes scripts.

Eléphant du PHP | 139 Messages

07 juil. 2008, 14:18

Merci de marquer le sujet comme résolu si tout est bon :)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

07 juil. 2008, 15:44

Modération :
Puisque ta question est résolue, j'ajoute le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.

Tu peux réaliser cette opération toi-même
en cliquant sur le bouton Image qui s'affiche en haut à gauche de ce sujet
si tu as posté le 1er message en tant que membre (inscrit et identifié).

Alors... inscris-toi !!! ;)


Vurtu, Baptiste n'étant pas inscrit, il ne peut le faire lui même. Il vaut donc mieux laisser les modérateurs s'occuper de ce genre de remarques ;)
Mais merci de ton implication :pouce:
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer