requete access dans php

requete access dans php - PHP - Programmation

Marsh Posté le 19-04-2010 à 12:11:56    

Salut à tous,
 
J'ai un problème qui me dépasse et je vois vraiment pas du tout ce qui fait planter mon programme. Voila, j'ai une base ACCESS sur laquelle je lance des requêtes via une appli en php.
Ma requete access doit copier plusieurs champ d'une table vers une autre table. Cette requête je l'ai exécuté dans ACCESS et elle marche.  
 

Code :
  1. INSERT INTO catalogue
  2. SELECT Banque.NUMTRA AS NUMTRA,
  3. Banque.NOMMAL AS NomPatient,
  4. Banque.NJFMAL AS NJFPatient,
  5. Banque.PREMAL AS PrenomPatient,
  6. Banque.DOSNPI AS IdPatient,
  7. Banque.DATNAI AS DateNai,
  8. Banque.SEXMAL AS Sexe
  9. FROM Banque
  10. WHERE Banque.DCD='oui'
  11. And
  12. ((Banque.NbTotal>1));


 
Ensuite, je l'ai transposé en php et là j'ai une erreur :  
 

Code :
  1. $nomtable = $_POST["nomtable"] ;
  2. $Insert = "INSERT INTO catalogue
  3. SELECT ".$nomtable.".NUMTRA AS NUMTRA,
  4. ".$nomtable.".NOMMAL AS NomPatient,
  5. ".$nomtable.".NJFMAL AS NJFPatient,
  6. ".$nomtable.".PREMAL AS PrenomPatient,
  7. ".$nomtable.".DOSNPI AS IdPatient,
  8. ".$nomtable.".DATNAI AS DateNai,
  9. ".$nomtable.".SEXMAL AS Sexe
  10. FROM ".$nomtable."
  11. WHERE ".$nomtable.".DCD='oui'
  12. And
  13. ((".$nomtable.".NbTotal>1))";
  14. $requete2 = odbc_exec($cnx, $Insert);


Warning: odbc_exec() [function.odbc-exec]: SQL error: [Microsoft][Pilote ODBC Microsoft Access] Le nombre de valeurs de la requête doit coïncider avec le nombre de champs destination.
 
Est ce que quelqu'un aurait une idée s'il vous plait ??  
Merci.

Reply

Marsh Posté le 19-04-2010 à 12:11:56   

Reply

Marsh Posté le 19-04-2010 à 13:21:29    

1. Il faudrait afficher le contenu de $Insert pour voir si la requête contient vraiment ce qu'il faut.
 
2. Il ne faut pas s'attendre à avoir exactement le même comportement en exécutant la requête dans l'onglet des requêtes d'Access, et en l'exécutant par un driver ODBC. Par exemple, je ne suis pas certain que tous les drivers ODBC supportent la syntaxe Insert.. Select. Dans ce cas, il faudrait séparer le traitement, pour récupérer les données avec Select, puis faire des Insert pour chaque ligne retournée par le Select. Ou bien, peut-être que le driver ODBC voudrait avoir la liste des champs derrrière le nom de la table, par exemple INSERT INTO catalogue(NUMTRA, NomPatient...

Reply

Marsh Posté le 19-04-2010 à 13:41:39    

Salut Olivthill,
 
Merci pour ta réponse. Je ne savais que le driver odbc était aussi capricieux. J'ai rajouté comme tu me l'as conseillé de rajouter la liste des champs derrrière le nom de la table : INSERT INTO catalogue(NUMTRA, NomPatient... )
et maintenant ça marche. Merci beaucoup pour ton aide.
 
Par contre, tu as marqué dans ton point 2 : "Par exemple, je ne suis pas certain que tous les drivers ODBC supportent la syntaxe Insert.. Select. Dans ce cas, il faudrait séparer le traitement, pour récupérer les données avec Select, puis faire des Insert pour chaque ligne retournée par le Select"
C'est à dire qu'il faut que je fasse, un truc du genre:
 

Code :
  1. $action1 = "SELECT ...."
  2. odbc_exec($cnx, $action1);
  3. $action2 = "INSERT INTO ".$action1." ";
  4. odbc_exec($cnx, $action2);


 
???
 
Merci encore pour l'aide.

Reply

Marsh Posté le 19-04-2010 à 14:51:54    

J'ai utilisé des vieux drivers ODBC, mais apparamment, les drivers actuels acceptent la syntaxe du insert..select, donc, ma première remarque est à oublier.

Reply

Marsh Posté le 19-04-2010 à 16:46:38    

Ok. Merci beaucoup pour ton aide.
 
A+  
 :)

Reply

Marsh Posté le 25-04-2010 à 01:33:10    

Juste pour l'info, j'ai une base qui frole les 400 000 fichiers sur un serveur et ce ne sont que des fichiers texte, ça booste bien mieux que ACCESS qui reste vraiment un petit rigolo à coté. PHP m'attaque les index à une vitesse assez affolante, en tout cas il fait des opérations bien plus rapidement sur des fichiers TXT qu'il ne le ferait sur des .MDB...
A voir.


---------------
http://www.ypikay.com
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed