Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

php-unixodbc, Followup-To: fr.comp.lang.php

5 réponses
Avatar
alessandra_morgane
Followup-To: fr.comp.lang.php

bonjour,

Donc voila mon probleme :

Je suis sous la mandrake 10, j'ai installé apache, php, freetds et
unixodbc pour pouvoir accéder à une base sql server 7 sur windows.
La connexion s'effectue bien. J'utilise odbc car cela est une exigence
de ma boite.
Mon soucis est lorsque j'execute plusieurs odbc_exec(), le premier
passe mais pas le second.
Voici un exemple :
<?
$dbc = odbc_connect("DSN", "user", "pass");

$sql = "select * from table";
$rs = odbc_exec($dbc, $sql);
odbc_fetch_row($rs);
$c1 = odbc_result($rs, "nomcompte");
echo "<p>" . $c1 ."\n";

$sql2 = "select * from table2";
$rs2 = odbc_exec($dbc, $sql2);
odbc_fetch_row($rs2);
$c2 = odbc_result($rs2, "nomcompte");
echo "<p>" . $c1 . "\n";
if ($c1 = $c2)
echo "ca fonctionne \n";
else
echo "erreur \n";
?>

=> le probleme est qu'il y a une erreur sur le 2 eme odbc_exec().
J'ai essayer de mettre odbc_free_result($rs) mais dans ce cas je ne
pourrait plus utiliser le premier resultset ce que je ne souhaite pas.

Si qq'un a une solution elle est la bienvenue.
Merci en esperant que le probleme a ete compris.

5 réponses

Avatar
John Gallet
Bonjour,

Followup-To: fr.comp.lang.php
Déjà je repositionne correctement le champ en question. Je rappelle au

passage que fr.comp.lang.php est modéré, donc vous ne verrez pas
instantanément apparaitre votre réponse, même sur fcas si vous laissez
le xpost. On a fini par publier l'article en l'état.

Je suis sous la mandrake 10, j'ai installé apache, php, freetds et
unixodbc pour pouvoir accéder à une base sql server 7 sur windows.
La connexion s'effectue bien. J'utilise odbc car cela est une exigence
de ma boite.


Donc sauf erreur de ma part, freetds ne sert donc à rien, vu qu'il
permet l'accès natif à sybase et sqlserver. Je ne ferai pas de
commentaires sur la décision de forcer l'usage d'odbc car je ne connais
aps les tenants et les aboutissants ni du projet, ni de ses contraintes.

$rs = odbc_exec($dbc, $sql);
odbc_fetch_row($rs);
$rs2 = odbc_exec($dbc, $sql2);
odbc_fetch_row($rs2);


On a deux requêtes sur un même descripteur. Je ne sais pas si odbc ou
son implémentation unixienne accepte ceci.

Deux tests à faire :

1) commencer par "manger" en boucle while tous les rangs retournés par
le premier select avant de faire le deuxième select. Si ça marche, c'est
donc qu'on ne peut pas avoir deux result sets associés au même
descripteur de connexion.

2) inverser les deux requêtes, il y a peut-être une erreur bête sur la
seconde requête, j'y crois moins vu que tu nous indique que faire un
free_result débloque la situation.

Il n'y aurait pas moyen de faire une seule requête, en jointure ou en
union ?

a++;
JG

Avatar
alessandra_morgane
Je suis sous la mandrake 10, j'ai installé apache, php, freetds et
unixodbc pour pouvoir accéder à une base sql server 7 sur windows.
La connexion s'effectue bien. J'utilise odbc car cela est une exigence
de ma boite.


Donc sauf erreur de ma part, freetds ne sert donc à rien, vu qu'il
permet l'accès natif à sybase et sqlserver. Je ne ferai pas de
commentaires sur la décision de forcer l'usage d'odbc car je ne connais
aps les tenants et les aboutissants ni du projet, ni de ses contraintes.



et oui les joies des cntraintes :)

$rs = odbc_exec($dbc, $sql);
odbc_fetch_row($rs);
$rs2 = odbc_exec($dbc, $sql2);
odbc_fetch_row($rs2);


On a deux requêtes sur un même descripteur. Je ne sais pas si odbc ou
son implémentation unixienne accepte ceci.



et bien ce qui me parait bizzare c que sur une plateforme
windows/apache/php/odbc/sqlserver tout fonctionne correctement.
J'ai chercher au niveau constante php, et odbc mais je n'ai pas trouve
grand chose a part peut etre une histoire de constante :
SQL_CURSOR_TYPE mais je ne trouve rien de tres signifiant sur google
:(

Deux tests à faire :

1) commencer par "manger" en boucle while tous les rangs retournés par
le premier select avant de faire le deuxième select. Si ça marche, c'est
donc qu'on ne peut pas avoir deux result sets associés au même
descripteur de connexion.



deja tester et cela me donne la meme erreur.

2) inverser les deux requêtes, il y a peut-être une erreur bête sur la
seconde requête, j'y crois moins vu que tu nous indique que faire un
free_result débloque la situation.

Il n'y aurait pas moyen de faire une seule requête, en jointure ou en
union ?



Ici ce n'est qu'un exemple tout simple mon code est plus complexe et
donc je n'ai pas la possibilité de faire une seule requete :(

Merci
Amelie


Avatar
John Gallet
Re,

(miardidiou, le fu2 !!)

et bien ce qui me parait bizzare c que sur une plateforme
windows/apache/php/odbc/sqlserver tout fonctionne correctement.


Donc c'est peut-être bien une restriction de la couche odbc unix.

1) commencer par "manger" en boucle while tous les rangs retournés par
le premier select avant de faire le deuxième select.
deja tester et cela me donne la meme erreur.



Bon.

Ici ce n'est qu'un exemple tout simple mon code est plus complexe et
donc je n'ai pas la possibilité de faire une seule requete :(


Mouais.
Là je ne vois plus qu'une seule solution si le nombre de connexions
n'est pas limité bêtement par un problème de licenses : ouvrir deux
connexions. Mais s'il faut ouvrir N connexions sous prétexte qu'on fait
N requêtes à la suite, on n'est pas rendus, c'est complètement idiot ce
truc.

Est-ce qu'odbc supporte la notion de connexion persistante ? Si oui
est-ce que ça apporte une différence ?

Côté projet, est-ce que l'utilisation d'une couche d'abstraction est
envisageable (genre adodb par exemple) ? Cas dans lequel on pourrait
passer d'un accès natif (freetds) à odbc simplement en changeant un
paramètre de config.

a++;
JG


Avatar
alessandra_morgane
Followup-To: fr.comp.lang.php

Re, Re

Est-ce qu'odbc supporte la notion de connexion persistante ? Si oui
est-ce que ça apporte une différence ?



oui mais cela ne change rien helas.

Côté projet, est-ce que l'utilisation d'une couche d'abstraction est
envisageable (genre adodb par exemple) ? Cas dans lequel on pourrait
passer d'un accès natif (freetds) à odbc simplement en changeant un
paramètre de config.



je ne connais pas tres bien ADODB mais il me semble que sous linux
cela ne fonctionne pas ?

Sinon je pense que cela peut venir du driver donc pour le moment
j'essai d'en rechercher un autre. Je vais tester avec iodbc.

merci beaucoup.

Amelie

Avatar
John Gallet
Re,

oui mais cela ne change rien helas.


Là je suis à court d'idées.

je ne connais pas tres bien ADODB mais il me semble que sous linux
cela ne fonctionne pas ?
adodb (ou d'autres comm pear::db par exemple) sont des couches

d'abstraction au sgbdr écrites en PHP (ou même pour adodb également
disponibles en extension pour raisons de perfs). Elles te permettent
juste d'attaquer N types de sgbdr avec le même code php. Dans ton
utilisation, ça te permet de coder le projet en utilisant freetds, et si
vraiment il faut en passer par odbc, quand le problème sera identifié et
résolu, tu n'as pas une seule ligne de code à changer. Le jour où
finalement le client a besoni de ton code sous oracle, pareil.

Enfin ça c'est la théorie, on est bien d'accord que dès qu'il y aura une
jointure externe, par exemple, la couche d'abstraction, on oublie.

Sinon je pense que cela peut venir du driver donc pour le moment
j'essai d'en rechercher un autre. Je vais tester avec iodbc.
En effet, s'il existe d'autres drivers odbc pour ton OS, essaie. Là je

n'ai aucune expérience, j'utilise toujours les drivers fournis par
l'éditeur du sgbdr.

Si tu résouds ton problèùe, ça m'intéresse d'avoir la réponse et de la
coller en FAQ (pas dans son rôle habituelle de "frequently" mais comme
"mémoire" des cas à la con qu'on ne retrouve jamais dans les archives
parce qu'on ne sait plus sur quel mot clef chercher.

a++;
JG