Bonjour,

J'ai réalisé un script PHP qui permet de rechercher des N° de téléphones depuis une base de données Postgres. Celui ci est appelé depuis un téléphone SIP.

Je passe en variable GET le nom de la personne à rechercher et celui ci me retourne la réponse sous forme de flux XML.

Quand j'exécute ce script via firefox, aucun problème. via le téléphone, j'ai des erreurs PHP et aucunes réponses.

A noté que ce script possède une pseudo fonction T9 et l'erreur serai situé dans cette fonction.

Voici le script :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
<?php
/**
 * Script permettant de rechercher des utilisateurs et N° de téléphone (en mode T9) dans une base de données Postgres - Pour téléphone VOIP Thomson
 * 
 * @name search
 * @version 2.0
 * @package search.php
 */
 
// Chargement pour toutes plates-formes
if (!extension_loaded('pgsql')) { 
	if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') 
	{
		dl('php_pgsql.dll'); 
	} 
	else 
	{ 
		dl('pgsql.so'); 
	}  
}
 
// Création du dossier de résultats si non présent
if(!is_dir('results'))
{
	mkdir('results');
}
 
//parametres de connection à la nouvelle base PostgresSQL phonebook
$mydb="phonebook";
$myserv="********";
$myuser="********";
$mypwd="********";
$myport=5432;
 
//Connection à la base de données PostgresSQL
$connexion='host='.$myserv.' port='.$myport.' dbname='.$mydb.' user='.$myuser.' password='.$mypwd;
pg_connect($connexion) or die('Connexion impossible : ' . pg_last_error());;
 
//limite de la recherche
$limite_query=32; 
 
// T9
function T9($combinaison)
{
	$touches = array();
	$touches[2] = array('A', 'B', 'C');
	$touches[3] = array('D', 'E', 'F');
	$touches[4] = array('G', 'H', 'I');
	$touches[5] = array('J', 'K', 'L');
	$touches[6] = array('M', 'N', 'O');
	$touches[7] = array('P', 'Q', 'R','S');
	$touches[8] = array('T', 'U', 'V');
	$touches[9] = array('W', 'X', 'Y','Z');
 
	$arr = str_split($combinaison); //Convertit une chaîne de caractères en tableau
 
	$possibilites = array();
	$resultats = array('');
	$array_return = array();
 
	// Correspondance entre les N° de touches et lettres
	foreach($arr as $chiffre)
	{
		$possibilites[] = $touches[$chiffre];
	}
 
	// boucle le nombre de fois qu'il le faut suivant la taille de la chaine de départ
	for($i = 0; $i < strlen($combinaison) ; $i++)
	{
		$t = $resultats;
 
		foreach($possibilites[$i] as $lettre) 
		{
			foreach ($resultats as $chaine)
			{
				$t[] = $chaine . $lettre;
			}
		}
 
		$resultats = $t;	
	}
 
	//filtre (suppression des chaines qui n'ont pas la bonne longueur
	foreach($resultats as $solution)
	{
		if (strlen($solution) == strlen($combinaison)) $array_return[] = $solution;
	}
 
	return($array_return);
}
 
// Convertion des lettre en chiffre téléphonique
function conversion_lettre_chiffre($lettre)
{
	$arr = str_split($lettre); //Convertit une chaîne de caractères en tableau
	$chaine = NULL;
	for($i = 0; $i < strlen($lettre) ; $i++)
	{
		switch ($arr[$i]) 
		{
			case 'a';
			$chaine .= '2';
			break;
 
			case 'b':
			$chaine .= '2';
			break;
 
			case 'c':
			$chaine .= '2';
			break;
 
			case 'd':
			$chaine .= '3';
			break;
 
			case 'e':
			$chaine .= '3';
			break;
 
			case 'f':
			$chaine .= '3';
			break;
 
			case 'g':
			$chaine .= '4';
			break;
 
			case 'h':
			$chaine .= '4';
			break;
 
			case 'i':
			$chaine .= '4';
			break;
 
			case 'j':
			$chaine .= '5';
			break;
 
			case 'k':
			$chaine .= '5';
			break;
 
			case 'l':
			$chaine .= '5';
			break;
 
			case 'm':
			$chaine .= '6';
			break;
 
			case 'n':
			$chaine .= '6';
			break;
 
			case 'o':
			$chaine .= '6';
			break;
 
			case 'p':
			$chaine .= '7';
			break;
 
			case 'q':
			$chaine .= '7';
			break;
 
			case 'r':
			$chaine .= '7';
			break;
 
			case 's':
			$chaine .= '7';
			break;
 
			case 't':
			$chaine .= '8';
			break;
 
			case 'u':
			$chaine .= '8';
			break;
 
			case 'v':
			$chaine .= '8';
			break;
 
			case 'w':
			$chaine .= '9';
			break;
 
			case 'x':
			$chaine .= '9';
			break;
 
			case 'y':
			$chaine .= '9';
			break;
 
			case 'z':
			$chaine .= '9';
			break;
 
			default:
			$chaine .= '1';
		}
	}
	return $chaine;
}
 
// Préparation de la requete SQL
function prepa_requete($name)
{
	$i = 1;
	$requete_sql = NULL;
	$chaine = T9(conversion_lettre_chiffre($name));
	foreach($chaine as $solution)
	{
		if($i < count($chaine))
		{
			$requete_sql .=  'name_userphonebook LIKE \''.$solution.'%\' OR ';
		}
		else
		{
			$requete_sql .=  'name_userphonebook LIKE \''.$solution.'%\'';
		}
		$i++;
	}
 
	return $requete_sql;
}
 
if(isset($_GET['NAME']))
{
	if(!empty($_GET['NAME']))
	{
		// Select et recherche des données présent dans la base
 
		$reponse = pg_query('SELECT * 
							 FROM userphonebook 
							 WHERE '.prepa_requete($_GET['NAME']).'
							 ORDER BY name_userphonebook ASC');
 
		/*
		$reponse = pg_query('SELECT * 
							 FROM userphonebook 
							 WHERE name_userphonebook LIKE \''.$_GET['NAME'].'%\'
							 ORDER BY name_userphonebook ASC');
		*/
 
		// Détermine le nombre de résultat
		$nb_result = pg_num_rows($reponse);
 
		//Supprimer dossier de résultats XML
		function clearDir($dossier)
		{
			$ouverture=@opendir($dossier);
			if (!$ouverture) return;
			while($fichier=readdir($ouverture)) {
			if ($fichier == '.' || $fichier == '..') continue;
				if (is_dir($dossier."/".$fichier)) {
					$r=clearDir($dossier."/".$fichier);
					if (!$r) return false;
				}
				else {
					$r=@unlink($dossier."/".$fichier);
					if (!$r) return false;
				}
			}
			closedir($ouverture);
			$r=@rmdir($dossier);
			if (!$r) return false;
			return true;
		}
		clearDir('results/'.$_GET['MAC_ADDR']);
 
		// Si moins de 32 réponses, affichier le résultat
		if($nb_result <= $limite_query)
		{
			/*$xml = '<?xml version="1.0" encoding="UTF-8"?>'."\n";  */
			$xml = '<ThomsonPhoneBook>'."\n";	
			while ($donnees = pg_fetch_array($reponse))
			{
				$xml .= "\t".'<DirectoryEntry>'."\n";
					$xml .= "\t\t".'<Name>'.$donnees['name_userphonebook'].' '.$donnees['firstname_userphonebook'].'</Name>'."\n";	
					$xml .= "\t\t".'<Telephone>'.$donnees['phonelong_userphonebook'].'</Telephone>'."\n";
					//$xml .= "\t\t".'<Telephone>'.$donnees['phoneshort_userphonebook'].'</ Telephone>'."\n";
				$xml .= "\t".'</DirectoryEntry>'."\n";
			}
			$xml .= '</ThomsonPhoneBook>'."\n";
 
			//Génération XML
			echo $xml;
		}
		else //Si plus de 32 réponses, découper le résultat en bloc de 32 réponses
		{
			// Création du dossier de résultats
			mkdir('results/'.$_GET['MAC_ADDR']);
			/*echo'<?xml version="1.0" encoding="UTF-8"?>'."\n"; */
			echo '<ThomsonPhoneMenu>'."\n";
 
			$nb_page = ceil(pg_num_rows($reponse)/$limite_query); //Nombre de résultat divisé par le nombre de page à affichier, arrondi à l'entier supérieur
			for($page=0;$page<$nb_page*$limite_query;$page++)
			{
 
				$reponse = pg_query('SELECT * 
									 FROM "userphonebook" 
									 WHERE '.prepa_requete($_GET['NAME']).'
									 ORDER BY name_userphonebook ASC
									 LIMIT '.$limite_query.'
									 OFFSET '.$page.'');
				/*				 
				$reponse = pg_query('SELECT * 
									 FROM "userphonebook" 
									 WHERE name_userphonebook LIKE \''.$_GET['NAME'].'%\'
									 ORDER BY name_userphonebook ASC
									 LIMIT '.$limite_query.'
									 OFFSET '.$page.'');					 
				 */				 							 
				// Création de la page PHP avec code XML	
				$xml = '<?php'."\n".'echo\'<ThomsonPhoneBook>'."\n";
				$i = 0; //compteur pour déterminer le premier nom à affichier
				while ($donnees = pg_fetch_array($reponse))
				{
					$i++;
					$xml .= "\t".'<DirectoryEntry>'."\n";
					$xml .= "\t\t".'<Name>'.$donnees['name_userphonebook'].' '.$donnees['firstname_userphonebook'].'</Name>'."\n";	
					$xml .= "\t\t".'<Telephone>'.$donnees['phonelong_userphonebook'].'</Telephone>'."\n";
					//$xml .= "\t\t".'<Telephone>'.$donnees['phoneshort_userphonebook'].'</Telephone>'."\n";
					$xml .= "\t".'</DirectoryEntry>'."\n";
 
					if($i == 1)
					{
						$name1 = $donnees['name_userphonebook'];
					}
					if($i == $limite_query)
					{
						$name2 = $donnees['name_userphonebook'];
					}
				}
				$page = $page+$limite_query-1;
				$xml .= '</ThomsonPhoneBook>\';?>'."\n";
 
				// Enregistrement de la page PHP
				$fp = fopen('results/'.$_GET['MAC_ADDR'].'/get'.$limite_query.'results_'.$page.'.php','a+');
				fwrite($fp,$xml); 
 
				//Génération XML
				echo "\t".'<MenuItem>'."\n";
					echo "\t\t".'<Name>'.$name1.' -> '.$name2.'</Name>'."\n";
					echo "\t\t".'<URL>http://'.$_SERVER['SERVER_NAME'].'/results/'.$_GET['MAC_ADDR'].'/get'.$limite_query.'results_'.$page.'.php</URL>'."\n";
				echo "\t".'</MenuItem>'."\n";
			}
			echo '</ThomsonPhoneMenu>'."\n";
		}
	}
	else
	{
		// Si Requête vide
		echo '<ThomsonPhoneBook>'."\n";
		echo '</ThomsonPhoneBook>';
	}
}
else
{
	echo '<ThomsonPhoneBook>'."\n";
	echo '</ThomsonPhoneBook>';
}
?>
et voici les erreurs :

[Wed Nov 05 14:04:01 2008] [error] [client 10.60.27.253] PHP Notice: Undefined index: 1 in /Data/pub/akfp-pbx02.akf.autoliv.int/web/search.php on line 66
[Wed Nov 05 14:04:01 2008] [error] [client 10.60.27.253] PHP Warning: Invalid argument supplied for foreach() in /Data/pub/akfp-pbx02.akf.autoliv.int/web/search.php on line 74
[Wed Nov 05 14:04:01 2008] [error] [client 10.60.27.253] PHP Warning: pg_query() [<a href='function.pg-query'>function.pg-query</a>]: Query failed: ERREUR: erreur de syntaxe sur ou pr\xc3\xa8s de \xc2\xab ORDER \xc2\xbb\nLINE 4: ORDER BY name_userphonebook ASC\n ^ in /Data/pub/akfp-pbx02.akf.autoliv.int/web/search.php on line 245
[Wed Nov 05 14:04:01 2008] [error] [client 10.60.27.253] PHP Warning: pg_num_rows(): supplied argument is not a valid PostgreSQL result resource in /Data/pub/akfp-pbx02.akf.autoliv.int/web/search.php on line 254
[Wed Nov 05 14:04:01 2008] [error] [client 10.60.27.253] PHP Warning: pg_fetch_array() expects parameter 1 to be resource, boolean given in /Data/pub/akfp-pbx02.akf.autoliv.int/web/search.php on line 284
Je pense que les 3 dernières erreurs sont du à la 2eme.

Auriez vous une idée s'il y a vraiment une erreur, ou que le problème vient de mon téléphone (temps de réponse).

Merci d'avance

Arnaud