Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & ODBC
PHP & ODBC Forum d'entraide sur ODBC avec PHP. Avant de poster -> FAQ ODBC
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/06/2007, 14h05   #1
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 122
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 122
Points : 32
Points : 32
Par défaut [Access] odbc_result fait sauter la première ligne de odbc_result_all

Je voudrais savoir s'il existe un résultat de ma requête pour faire différentes affichages en fonction de ça. J'utilise odbc_result pour tester cela mais le problème c'est que s'il y a bien des résultats, odbc_result_all() ne renvoie pas la premiere ligne.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
$ObliQ="select numDossier from questionnaire";
 
	$Obli=odbc_exec($connexion, $ObliQ) or die (print odbc_error());
	//odbc_result_all($Obli); //affiche à partir du premier dossier
	$dossier=odbc_result($Obli, "numDossier");
 
	if ($dossier == "")
	{
		print ("il n'y a pas de dossier");
	}
	else
	{
		print ("Le numéro de dossier : ".$dossier);
		odbc_result_all($Obli);		
	}
Ici il y a 8 dossier
et il affiche

Le numéro de dossier : 20070001
numDossier
20070002
20070003
20070004
20070005
20070006
20070007
20070008

pourtant le odbc_result_all hors de la boucle affiche bien les dossiers à partir de 20070001.

Ce que je ne comprend pas.
maraly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2007, 14h23   #2
Modératrice
 
Avatar de Celira
 
Femme
Développeuse PHP/Java
Inscription : avril 2007
Messages : 3 686
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeuse PHP/Java

Informations forums :
Inscription : avril 2007
Messages : 3 686
Points : 5 451
Points : 5 451

Je ne maitrise pas du tout odbc, mais le même genre de problème se pose avec mysql

Lorsque tu fais result_all, ça te renvoie tous les résultats qui n'ont pas encore été extraits. Or ton premier résultat est déjà extrait par un result juste avant. Donc il t'affiche tous les résultats à partir du 2e.
__________________
Modératrice PHP
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)

Pour afficher votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur)
Celira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2007, 14h51   #3
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 122
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 122
Points : 32
Points : 32
Merci de cette information.

Quelle alternative alors pour avoir tout le résultat de la requête.

Au fait je fais des extractions de données en fonction de plusieurs critères choisies par l'utilisateur. Et j'affiche les résultats dans un fichier csv. Je fais ce test pour que quand il n'y a pas de résultat, ça ne créer pas de fichier csv mais une autre page affichant qu'il n'y a pas de résultat correspondant aux critères.

odbc_num_rows() ici renvoie -1 donc je ne peut pas l'utiliser.
maraly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2007, 14h59   #4
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Comme Celira, je ne maitrise pas odbc, mais bon en lisant la doc là il semble effectivement que odbc_num_rows() renvoie -1 avec certains drivers dans le cas d'un SELECT.
Donc tu as plusieurs possibilités plus ou moins casse pieds (tout dépend de la complexité d'affichage que tu veux en fait)

1/ tu utilises odbc_next_result() dans une boucle while et pour chaque ligne tu écris en sortie dans ton csv.

2/ tu bricoles : la première ligne, si y en a une tu la sors "a la main" dans ton fichier et tu utilises odb_result_all() pour sortir le reste

3/ Moins bien mais le plus simple bien sur (mais bon vraiment pas top, je la donne au cas où ca ne soit pas un projet important, du bricolage ou autre) :
tu fais deux fois de suite la requete.
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2007, 15h36   #5
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 122
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 122
Points : 32
Points : 32
j'ai plusieurs requêtes et j'affiche leur résultats cote à cote dans un fichier csv . Si je fais avec odbc_next_result() ça va vraiment me compliquer ma vie.

pour l'instant je vais voir comment faire autrement mais si quelqu'un a une idée, c'est le bienvenu.

Merci
maraly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2007, 15h40   #6
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Je n'ai pas bien compris ce que tu appelles "cote a cote dans un fichier csv" ?
Peux tu donner un exemple de la sortie que tu voudrais et que tu n'arrives pas a obtenir avec un odbc_next_result() ?
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2007, 16h19   #7
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 122
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 122
Points : 32
Points : 32
j'explique un peut le projet alors,
L'utilisateur peut selectionner 1 à 11 critères, donc il y a énormément de combinaisons possibles. j'ai une requete pour chaque critère mais les requêtes deviennent très vite complexes si je fais des jointures en fonctions des critères choisies. Donc j'ai decider ne garder que les 11 requetes et de n'afficher que les résultats des ceux selectionnées.

mon code
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
 
//si un dossier correspondant aux critères existent
header("Content-Type: application/csv-tab-delimited-table");   
header("Content-disposition: filename=ResultatExtractionRCOG.csv");  
 
.....
//à partir de 2 critères selectionnés
elseif (count($partie) == 2)
	{
		//tumeur, socioEco
		if ($partie[0] == 'tumeur' && $partie[1] == 'socioEco')
		{
			// titre des colonnes   	
			$fields = odbc_num_fields($Obli);
			$i = 1;   
			while ($i <= $fields)
			{  
				//les noms des champs comme titre		
				print odbc_field_name($Obli, $i).";"; 		  
				$i++;   
			}
			if (isset($Tumeur))
			{
				$fields1 = odbc_num_fields($Tumeur);
				$i = 1;
					while ($i <= $fields1)
					{  		
						//les noms des champs comme titre
						//";" pour le format csv
						print odbc_field_name($Tumeur, $i).";"; 		  
						$i++;   
					} 		
			} 
			if (isset($SocioEco))
			{
				$fields1 = odbc_num_fields($SocioEco);
				$i = 1;
					while ($i <= $fields1)
					{  		
						//les noms des champs comme titre
						//";" pour le format csv
						print odbc_field_name($SocioEco, $i).";"; 		  
						$i++;   
					} 		
			} 
			print "\n";			
 
			// données de la table	
			while($arrSelect = odbc_fetch_array($Obli)) 
			{ 
				foreach($arrSelect as $elem)
				{  	
					$tablo[]=$elem; 
				}
			} 
			while ($arrSelect1 = odbc_fetch_array($Tumeur))
			{  
				foreach($arrSelect1 as $elem)
				{  	
					$tablo1[]=$elem; 
				}
			} 
			while ($arrSelect2 = odbc_fetch_array($SocioEco))
			{  
				foreach($arrSelect2 as $elem)
				{  	
					$tablo2[]=$elem; 
				}
			} 
			$j=0;
			$k=0;
			for ($i=0; $i<count($tablo); $i=$i+13)
			{   				
				for ($case=0; $case<13; $case++)
				{
					$aff=$case+$i;
					print "$tablo[$aff];";
				}					
 
				for ($case=0; $case<15; $case++)
				{
					$aff=$case+$j;
					print "$tablo1[$aff];";
				}	
				$j=$j+15;
				for ($case=0; $case<3; $case++)
				{
					$aff=$case+$k;
					print "$tablo2[$aff];";
				}
				$k=$k+3;
 
				print "\n";
			}  			 		
		}
le fichier csv est ouvert dans un tableur et les résultats de chaque requete est afficher à la suite

C'est un peut difficile à expliquer mais par exemple

pour la requete1, les noms de champs s'affichent de la colonne A à H et les tuples s'affichent de ligne en ligne. Puis à partir de la colonne I se trouve les résultats de la requete2.

(oups, je ne vois est ce qu'on met les pieces jointes, j'allais mettre le fichier résultat)
maraly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2007, 16h23   #8
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
J'ai a peu pres compris ce que tu attends en sortie. Maintenant je propose une idée et j'ai une question !

1/ question : Je ne vois pas en quoi le fait de faire odbc_result_all() te permet d'avoir cote a cote les résultats de chaque requete en fait. Maintenant je n'ai peut etre pas tout compris !

2/ Rien ne t'empeche avec odbc_next_result() de te constuire un tableau a deux dimensions dans ton script php, que tu remplis exactement comme tu le ferais avec un csv. Pour la premiere requete tu crees et remplis le tableau avec les colonnes 0 à N-1 (N = nombre de colonnes de la requete), Pour la deuxieme requete tu fais de meme avec les colonnes N à N+M-1 (M = nombre de colonnes de la requete 2), etc.

A la fin tu as un tableau qui correspond a ton fichier excel en mémoire et tu n'as plus qu'à le sortir dans un csv, en écrivant pour chaque ligne, chaque colonnes séparée par un ;
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2007, 16h46   #9
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 122
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 122
Points : 32
Points : 32
Pour la question, odbc_result_all() ne me sert à rien là
c'etait juste pour faire un test car je n'avais pas, pour chaque requete, la premiere ligne dans mon fichier csv.

Pour la proposition, je vais voir ça de près. cela me semble une bonne solution mais je ne vois pas encore très bien comment faire. En tout cas je vais essayer avec ça. Mais ça risque d'être long car j'ai 11 critères et dans chaque cas (si 1choix, 2choix....11choix) il y a encore des combinaison.

En tout cas merci
maraly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2007, 10h58   #10
Nouveau Membre du Club
 
Inscription : avril 2006
Messages : 122
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 122
Points : 32
Points : 32
Pour résoudre le problème, j'ai executé les requêtes après le test sur l'existence de dossier. (donc dans la boucle if (odbc_result())). Et ça marche comme il le faut.

j'ai abondonné le tableau à 2 dimensions même si c'est une bonne solution, car j'ai déjà fait toute les combinaisons possibles de mes affichages avant de m'appercevoir qu'il manquait la premiere ligne. Je devais alors tout changer.

En tout cas, merci
maraly est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h13.


 
 
 
 
Partenaires

Hébergement Web