#1 Le 30/03/2007, à 16:37
- Jike
Lire une base Microsoft Access (.mdb) en PHP avec ODBC
Bonjour,
Je voudrai migrer un site en PHP sur un serveur Linux mais je dois lire une base MS Access
dans ce site.
J'ai installé Apache 2 + PHP 5 + MySQL 5. Le tout fonctionne bien.
Pour l'acces ODBC, j'ai installé php5-odbc, le driver libmdbodbc et les utilitaires de unixodbc-bin pour
configurer mes DSN au niveau du serveur, ce qui me donne :
Pour /etc/odbcinst.ini :
[MicrosoftAccessDriverODBC]
Description = Microsoft Access Driver ODBC
Driver = /usr/lib/libmdbodbc.so.0.0.0
Driver64 =
Setup = /usr/lib/libmdbodbc.so.0.0.0
Setup64 =
UsageCount = 1
CPTimeout =
CPReuse =
Pour /etc/odbc.ini :
[mfct.dsn.catalogue]
Description = Base Catalogue
Driver = MicrosoftAccessDriverODBC
Database = /var/_data/cat_data.mdb
Lorsque j'ouvre mon site, j'ai l'erreur suivante quand je tente d'afficher le resultat d'une requete sur ma base MS Access :
Warning : odbc_fetch_array() : No tuples available at this result index in /var/www/oc/includes/menus/menu_catalogue.php on line 68
Quelqu'un a-t-il une idée du probleme ?
Quelqu'un a-t-il déjà reussi à acceder à une base MS Access en PHP avec ODBC ? Et surtout... comment ?
Merci pour votre aide.
Dernière modification par Jike (Le 30/03/2007, à 16:42)
Hors ligne
#2 Le 03/04/2007, à 08:47
- Jike
Re : Lire une base Microsoft Access (.mdb) en PHP avec ODBC
Bon, en fait ca marche, j'avais tout bien fait mais... le driver a du mal avec les caractères speciaux.
En fait, il ne reconnait pas le fameux champ 'N°' qui est utilisé par défaut dans les tables pour l'index. C'est le '°' qui semble poser probleme.
L'underscore '_' ne semble pas poser de problemes pour le driver dans la version disponible dans le dépot (La 0.5 je crois).
J'ai donc fait des modifications dans une base MS Access de test en remplacant les en-tetes de champs 'N°' par 'no'.
Ca fonctionne mais, à moins d'un autre probleme que je n'ai pas encore remarqué, le driver a des problemes pour les requetes trop complexes, avec des liaisons sur plusieurs tables.
Donc, premier conseil si vous devez faire une base MS Access qui doit fonctionner sur un systeme Linux, eviter le '°' dans les noms des champs. Mettez plutôt des champs d'index comme 'no' ou 'nom_de_la_table_id'.
Je vous tiens au courant pour la suite des essais...
Hors ligne
#3 Le 16/04/2007, à 15:37
- Jike
Re : Lire une base Microsoft Access (.mdb) en PHP avec ODBC
Y'a vraiment personne que ça intéresse ?
Allez, un petit effort... Il y a bien quelqu'un qui, à défaut de faire fonctionner le bazar correctement, sait au moins POURQUOI ça ne marche pas...
J'ai aussi remarqué que le driver n'aime pas les noms de champs écrits sous la forme 'table.nom_du_champ', il est préférable de mettre 'nom_du_champ' tout-court.
J'aimerai bien que ces problèmes soient résolus un jour (Peut être la version 0.6 en préparation...), ça fait partie des petites choses qui coincent quand on veut passer un serveur sous Linux...
Et ne me dites pas de passer la base en autre chose que MS Access pour résoudre le problème !
Le problème à résoudre est bien la lecture d'une bases MS Access sous Linux en PHP avec ODBC.
...
J'ai vraiment l'impression d'être tout seul ici... et en plus il fait froid... j'aurai dû fermer la window(s)...
Hors ligne
#4 Le 24/04/2007, à 15:20
- Elise
Re : Lire une base Microsoft Access (.mdb) en PHP avec ODBC
Non, tu n'es pas seul !!!
J'ai un autre problème que toi, et d'après ton post tu sais le résoudre.
J'ai développé une grosse bdd sous Access. Des informations doivent être saisies par internet, j'ai donc créé une page PHP qui se connecte à ma bdd par ODBC.
En virtuel, sous EasyPHP, cela fonctionne, mais chez mon hébergeur, en linux, j'ai un problème de connexion.
Je vais donc essayer de le résoudre en installant la liste que tu as fais sur ton premier post.
Je te souhaite bon courage (à moi aussi d'ailleurs),
A bientôt,
Elise.
#5 Le 24/04/2007, à 16:31
- Alx.be
Re : Lire une base Microsoft Access (.mdb) en PHP avec ODBC
En effet tu n'es pas tout seul.
Comme pour Elise, je tiens à accéder à une DB MSAccess97 via un serveur Ubuntu avec Apache2 php5-odbc.
J'ai suivi ta procédure et modifié les fichiers d'ini.
Le connect s'établit, la lecture s'effectue, mais le résultat n'est pas accessible :
Warning: odbc_result_all() [function.odbc-result-all]: No tuples available at this result index
Malgré la saison des tulipes, j'ignorais qu'elles poussaient dans de pareilles conditions.
Le fichier odbc.ini
[IMMODATA_OL]
Driver = MicrosoftAccessDriverODBC
Database = /home/www/majfiksbe.a.be/immodata_ol.mdb
Description = copie de Immodata_rm
Le fichier odbcinst.ini
[MicrosoftAccessDriverODBC]
Description = Microsoft Access Driver ODBC
Driver = /usr/lib/libmdbodbc.so.0.0.0
Driver64 =
Setup = /usr/lib/libmdbodbc.so.0.0.0
Setup64 =
UsageCount = 1
CPTimeout =
CPReuse =
Le fichier .odbc.ini (pour les USER_DSN) n'existe pas
J'ai créé une table (test) avec 3 champs (test1, test2 et test3) de type texte, date et numérique.
Un seclect de type :"select test1 from test;" me donne la même erreur, de fetch_row, la connexion et l'exécution semble elles en état de marche.
Les droits d'accès en lecture sont garantis pour le groupe d'apache (www-data) sur cette mdb.
Par contre, quels sont les paramètres à indiquer pour le connect : user et password ? Dois-y placer les login et mot-de-passe root, ou apache, ou ...?
Merci pour vos conseils, trouvailles, ou autres
Alx
#6 Le 24/04/2007, à 16:51
- Alx.be
Re : Lire une base Microsoft Access (.mdb) en PHP avec ODBC
Du progrès...
Comme indiqué plus avant, j'avais suivi le conseil d'éviter les '°' et autres caractères accentués dans mes nom de table et de champ (testx) toujour sans succès.
Mon query 'select' se terminait par un ';', je l'ai retiré, et j'ai reçu un résultat.
Peut-être utile pour d'autres.
a+
Alx
#7 Le 25/04/2007, à 00:13
- Jike
Re : Lire une base Microsoft Access (.mdb) en PHP avec ODBC
Salut tout le monde,
Merci pour la participation !
En ce qui me concerne, j'ai pas avancé...
J'ai toujours les fameuses 'Tulipes' qui poussent comme du chiendent...
Pour la derniere remarque d'Alx.be, je n'ai pas de ';' à la fin de mes requetes et j'ai quand même l'erreur (Le ';' à la fin des requettes semble specifique à µ-soft, en C/php/C#... il ne le faut pas).
A ce propos, quel type de requete t'a donné un resultat ? Avec ou sans jointures ? Avec ou sans la notation complète des champs ('table.nom_champ') ?
Je n'arrive qu'a faire des requettes simples (Sur une seule table, sans jointures) ce qui n'est pas très interressant...
De plus, ne pouvant pas mettre des noms de champs sous la forme 'table.champ', bonjour l'angoisse quand il y a deux champs du meme nom dans deux tables liées differentes...
Concernant les login/password pour les bases Access, y'en a pas. Tu laisses vide (Sauf si tu en a mis mais je te le deconseille. Pas besoin rajouter d'autres problemes !).
Pour les droits de la base, j'y suis allé un peu à la louche : J'ai mis tout les droits pour tout le monde car j'avai des problemes pour me connecter. Une fois que ca marchera, je reglerai la question des droits. Pas la peine de s'encombrer de sources de problemes à cette étape.
Pour repondre à Elise (Bonjour maam'zelle si j'en crois ton pseudo), le site de OdbcTools indique bien que le driver ne fonctionne pas pour l'ecriture mais seulement en lecture (Enfin... presque visiblement...) pour la version 0.5
L'écriture est pour la future version 0.6
J'ai pas refait d'essais depuis, j'ai repassé mon serveur en Win 2000 Server (Et là, tout va bien, comme on peut s'en douter).
Comme de pas de chance, j'arrive pas à repartitionner pour installer un double-boot avec Ubuntu Server (Pour faire mumuse) car le disque a un/des secteur(s) defecteux et gParted LiveCD refuse de me faire de la place pour une partition ext3 et une swap... Faut que je bidoulle un 'chkdsk' pour tenter de rattraper le bazar.
Sinon, VirtualBox + Ubuntu me permettra de faire mes essais sur mon portable, au pire.
On continue à creuser...
A propos, j'ai pas trouvé de liens sur le site de OdbcTools pour tenter de communiquer avec un responsable histoire de lui soumettre 'notre' probleme. Si quelqu'un trouve un lien, qu'il le fasse savoir.
N'hesitez pas à continuer à poster !
Dernière modification par Jike (Le 25/04/2007, à 00:23)
Hors ligne
#8 Le 25/04/2007, à 13:48
- Elise
Re : Lire une base Microsoft Access (.mdb) en PHP avec ODBC
Coucou,
J'ai beau lire vos posts qui sont en français, je n'en saisie pas la moitié
J'ai contacté mon hébergeur (qui est long à répondre) pour résoudre mon problème.
Je le rappelle, j'ai développé une page PHP qui communique avec ma BDD sous Access. Tout va bien en local sous EasyPHP mais lorsque j'envoie ma page chez mon hébergeur j'ai un problème de communication.
Mon hébergeur m'a répondu que le serveur est sous Linux et donc qu'il ne peut pas communiquer avec la liaison ODBC propre à Microsoft et que pour "contourner" le problème je pouvais utiliser les BBD mysql.
Je lui ai gentiment répondu que je devais ABSOLUMENT utiliser Access et pas autre chose et de me donner les procédures et logiciels à installer.
J'attends sa réponse.
Voili voilo,
A bientôt,
Elise.
#9 Le 25/04/2007, à 17:21
- Jike
Re : Lire une base Microsoft Access (.mdb) en PHP avec ODBC
Bonjour Elise,
On a eu presque la même idée !
J'ai appelé un hébergeur qui proposait des accès à des bases MS Access pour savoir un peu comment il faisait...
Pas de bol, les bases sont sur des serveurs Windows.
Je pense que la réponse de ton hébergeur sera du même genre sinon purement négative si il ne propose que des hébergements sur des serveurs Linux.
Sous EasyPhp, c'est normal que ça fonctionne puisque tu l'utilise sur une machine Windows. C'est la machine Windows qui gère la liaison ODBC avec la base par l'intermédiaire du DSN que tu as créé dans le panneau de configuration.
La liaison ODBC avec ta base Access n'a rien à voir avec ton Php (Ou ton Apache).
Php fait une demande à ta base par l'intermédiaire de la liaison ODBC. Ensuite, c'est la machine, donc ton Windows, qui fait la liaison entre la demande ODBC et la base elle-même et retourne les données demandées à ODBC. Php les récupères ensuite par ODBC.
PHP <======> [ODBC] <=== (Ici, c'est la 'machine' qui gère la liaison, donc Windows) ===> Base Access
En fait, Php ne 'voit' pas la base. Il ne voit que l'intermédiaire ODBC. C'est tout l'intérêt car, grâce à ça, on peut mettre n'importe quel systeme de BDD derrière la liaison ODBC, ça ne change rien au code qui fait les appels. Ca fait un truc universel en quelque sorte.
C'est là le problème sous Linux car il ne sait pas jouer ce rôle d'intermédiaire entre la base MS Access et la demande passée par ODBC.
En gros... pour faire simple...
Dernière modification par Jike (Le 25/04/2007, à 17:46)
Hors ligne
#10 Le 26/04/2007, à 08:41
- Elise
Re : Lire une base Microsoft Access (.mdb) en PHP avec ODBC
Merci pour ce complément d'information.
Mais mon hébergeur ne m'a toujours pas répondu, alors je patiente (((
A bientôt,
Elise.
#11 Le 26/04/2007, à 15:07
- Elise
Re : Lire une base Microsoft Access (.mdb) en PHP avec ODBC
Coucou,
Mon hébergeur à enfin répondu, donc en gros, il ne peut pas communiquer avec ma base access.
Du coup, là je vais chercher comment faire pour hébérger ma page PHP communiquant à Access sur mon serveur local.
Piouff,
Elise.
#12 Le 30/04/2007, à 15:41
- Lucette
Re : Lire une base Microsoft Access (.mdb) en PHP avec ODBC
Bonjour,
J'ai eu le même message d'erreur que vous tous.
J'ai trouvé mon problème.
J'ai supprimé la clause WHERE dans ma requête et tout a fonctionné.
Cordialement,
Lu.
#13 Le 06/05/2007, à 00:58
- Jike
Re : Lire une base Microsoft Access (.mdb) en PHP avec ODBC
Des requetes sans clause WHERE... Ca limite quand meme un peu l'utilité du machin !!
A part ca, pas de news... Oui, j'ai rien fait de plus depuis, faute de temps.
Mais le probleme reste entier.
Hors ligne
#14 Le 10/05/2007, à 09:19
- bulldozer
Re : Lire une base Microsoft Access (.mdb) en PHP avec ODBC
Salut les gens,
Alors, je suis un peu dans le même cas que vous, seullement, vous semblez plus loin que moi
Je n'arrive pas à configurer un dsn correct...
Je tourne sous windows (malheureusement), avec un serveur IIS, une base de données Access et un site en php ... (je sais, le mélange de tout ça est un peu étrange mais bon ...)
Je vous donne pour l'instant le bout de code qui ne fonctionne pas, peut être saurez vous ce qui ne colle pas ...
$dsn = "DRIVER=Microsoft Access Driver (*.mdb); ";
$dsn = $dsn."UID=admin; ";
$dsn = $dsn."UserCommitSync=Yes; ";
$dsn = $dsn."Threads=3; ";
$dsn = $dsn."SafeTransactions=0; ";
$dsn = $dsn."PageTimeout=5; ";
$dsn = $dsn."MaxScanRows=8; ";
$dsn = $dsn."MaxBufferSize=2048; ";
$dsn = $dsn."FIL=MS Access; ";
$dsn = $dsn."DriverId=25; ";
$dsn = $dsn."DefaultDir=C:\Site\www; ";
$dsn = $dsn."DBQ=C:\Site\www\web.mdb";
//$con = odbc_connect($dsn, "", "");
$con = odbc_connect($dsn, 'admin', '');
j'ai laissé comme vous pouvez le voir, le login et le mot de passe par défaut lors de la création de ODBC dans les paramètres de Windows.
Je vous donne égallement l'erreur qu'il renvoie.
Warning: odbc_connect() [function.odbc-connect]: SQL error: [Microsoft][Pilote ODBC Microsoft Access]Erreur générale Impossible d'ouvrir la clé de registre 'Temporary (volatile) Jet DSN for process 0xa20 Thread 0xad0 DBC 0xe01ae4 Jet'., SQL state S1000 in SQLConnect in C:\Site\www\veriflog.php on line 41
Lorsque je ne mes pas de ; à la fin de chaque ligne, j'ai un autre message :
Warning: odbc_connect() [function.odbc-connect]: SQL error: [Microsoft][Gestionnaire de pilotes ODBC] Longueur de chaîne ou de mémoire tampon non valide, SQL state S1090 in SQLConnect in C:\Site\www\veriflog.php on line 41
Je sais bien que c'est un forum ubuntu, mais on sait jamais, si quelqu'un avait la réponse à mes problèmes... merci d'avance et bon courage à tous !
Bulldozer
#15 Le 12/05/2007, à 11:20
- Jike
Re : Lire une base Microsoft Access (.mdb) en PHP avec ODBC
Tu fais bien trop compliqué il me semble !
Pour travailler en odbc avec php :
//Création de la connection :
$connexion = odbc_connect('mon-dsn-base-access','','');
//Pas de login/password sauf si tu veux te casser un peu la tête et que tu as protégé ta base
//de cette façon !
//La requête à executer :
$query = "SELECT * FROM ma_table";
//Attention : Pas de ';' à la fin de la chaine de la requête.
//Execution :
$result = odbc_exec($connexion , $query) or die(odbc_error());
//Récuperation des résultats dans un tableau $item['nom_du_champ'] :
while ($items = odbc_fetch_array($result))
{
//Ici, faire ce qu'il y a à faire avec les données...
}
//Libération des résultats :
odbc_free_result($result);
Avant tout, le DSN 'mon-dsn-base-access' doit être créé sur ta machine :
Panneau de configuration>Outils d'administration>Sources de données (ODBC)
Onglet 'Sources de Données Système' (Ou utilisateur) > Ajouter.
Tu te laisse guider après avoir choisi le pilote adéquate bien sur.
C'est très simple.
Dernière modification par Jike (Le 12/05/2007, à 11:25)
Hors ligne
#16 Le 07/11/2007, à 17:12
- kader
Re : Lire une base Microsoft Access (.mdb) en PHP avec ODBC
Bonjour!
Je suis sous linux Suse 10.2.
J'ai apache2.0,php5 et mysql 5,unixodbc 2.2 installe sur mon poste.
J'essaie de me connecter a une base access (ou une base mysql) a partir d'odbc mais lorsque j'essaie,ca ne fait rien...
Je n'ai aucun message d'erreur pourtant lorsque je fais un "isql mysql (ou Access)" j'arrive bien a me connecter.
Faut il faire une modif sur le fichier php.ini???si oui ,Qu'est ce qu 'il faut modifier?
php5-odbc est aussi installé et lorsque je fais un phpinfo() le module est bien present.
Je pense que je dois avoir un probleme sur mon fichier php.ini mais j'en suis pas sur???
J'aurai besoin d'aide parce qu'il faut que je puisse arriver a me connecter a une base access pour recuperer des donnees...
Merci d'avance!!!
Hors ligne
#17 Le 08/11/2007, à 10:57
- Jike
Re : Lire une base Microsoft Access (.mdb) en PHP avec ODBC
php5-odbc c'est bien pour les liaisons ODBC mais... la liaison ODBC vers une base MS Access ne fonctionne pas (C'est le sujet du post).
Si je ne dit pas de bêtises, tu dois ajouter le paquet php5-mysql pour accèder aux bases de données MySQL.
Ca, par contre, ça devrait rouler tout seul.
Pour l'utilisation en php, regarde dans la doc les fonctions qui commence par 'mysql_' et il y a des tas d'exemple sur le Net.
Hors ligne
#18 Le 09/11/2007, à 18:22
- kader
Re : Lire une base Microsoft Access (.mdb) en PHP avec ODBC
Donc il y a aucun moyen de pouvoir recuperer des valeurs sur une base Access a partir de linux???
Hors ligne
#19 Le 10/11/2007, à 11:05
- Jike
Re : Lire une base Microsoft Access (.mdb) en PHP avec ODBC
Oui, il y a possibilité avec mdbtools pour lire une base MS Access, faire quelques requêtes, exporter etc... etc
Mais rien pour un vrai accès ODBC sur ces bases sous Linux.
Site mdbtools : http://mdbtools.sourceforge.net
Installation : sudo apt-get install mdbtools libmdbodbc
Hors ligne
#20 Le 10/11/2007, à 17:00
- kader
Re : Lire une base Microsoft Access (.mdb) en PHP avec ODBC
Oui mais je ne peux pas utiliser mdbtools avec php...
C'est ca le probleme!!!!!!!!!!!!
Hors ligne
#21 Le 10/11/2007, à 17:21
- compte supprimé
Re : Lire une base Microsoft Access (.mdb) en PHP avec ODBC
Bonjour,
Je vais peut-être sortir une à¢nerie.
Il me semble qu'il y des variantes SQL et qu'en particulier access a la sienne.
Le base.table.champ, par exemple, devient, avec access, base!table!champ. Je n'ai pas essayé, mais un certain nombre de "dysfonctionnements" sont peut-être à chercher par là (le driver odbc attend peut-être une syntaxe access)...
A+
#22 Le 10/11/2007, à 18:08
- kader
Re : Lire une base Microsoft Access (.mdb) en PHP avec ODBC
Le base.table.champ, par exemple, devient, avec access, base!table!champ. Je n'ai pas essayé, mais un certain nombre de "dysfonctionnements" sont peut-être à chercher par là (le driver odbc attend peut-être une syntaxe access)...
Tu veux dire quoi la...
Hors ligne
#23 Le 10/11/2007, à 20:09
- compte supprimé
Re : Lire une base Microsoft Access (.mdb) en PHP avec ODBC
Si tu regardes une requête dans access (affichage en mode SQL), tu verras que sur bien des points elle aura une syntaxe un peu différente que la même requête par exemple avec MySQL.
Peut-être faut-il utiliser la syntaxe propre d'access dans la définition de la requête en php
Par exemple :
$query = "select * from table!champ" (syntaxe SQL access)
au lieu de
$query = "select * from table.champ" (syntaxe ANSI SQL standard).
Si je dis ça, c'est que j'ai recopié des requêtes d'access vers php/mysql et que j'ai souvent dû opérer de telles modifications pour qu'elles fonctionnent.
Par ailleurs, il serait assez logique qu'un driver qui permet d'accéder à un format particulier de base de données, utilise les règles syntaxiques de ce format. Ce qui autoriserait l'utilisation des commandes spécifiques de ce SGBD (les fonctions en particulier, genre like o๠un joker, c'est tantà´t %, tantà´t _ ou d'autres encore, selon le SGDB).
Et il me semble que le driver ne fait rien d'autre qu'interfacer au niveau système. Je doute qu'il traduise les commandes qu'on lui fournit dans le langage qui convient à la base de données adressée.
Mais encore une fois, je n'ai pas essayé dans le cas précis de ce fil. C'est juste une piste, et c'est vite vu si elle est bonne ou non... Il suffit de tester les 2 $query ci-dessus.
A+
Edit : J'ai un peu modifié les $query (en enlevant la base), pour être sûr qu'elles aient l'une ou l'autre une chance de fonctionner (je ne suis pas sûr qu'odbc permette la sélection de la base de données, surtout que dans access il n'y en a qu'une d'ouverte à la fois).
Dernière modification par faustus (Le 10/11/2007, à 20:27)
#24 Le 13/11/2007, à 02:18
- Jike
Re : Lire une base Microsoft Access (.mdb) en PHP avec ODBC
@Kader :
Oui, mdbtools c'est pour travailler sur les bases. Pour l'acces ODBC, c'est libmdbodbc qui est utilisé (Ligne Driver = /usr/lib/libmdbodbc.so.0.0.0 dans /etc/odbcinst.ini par exemple).
@faustus :
Bonne idée que celle d'essayer d'utiliser la syntaxe de MS Access. A voir...
Hors ligne
#25 Le 13/11/2007, à 13:33
- compte supprimé
Re : Lire une base Microsoft Access (.mdb) en PHP avec ODBC
@Jike
Tiens-nous au courant. C'est toujours bon à savoir, si ça marche (et d'ailleurs aussi si ça ne marche pas). Parce qu'en plus, ça vaut probablement pour odbc en général (et peut-être aussi pour jdbc, spécialité ooo), quelle que soit le type de base connectée.
A+
Dernière modification par faustus (Le 13/11/2007, à 13:34)