comparison includes/class.dataaccess.php @ 53:ec0c926a78a6

Nettoyage de la classe d'accès aux données. Petit re-arrangement: les fonctions permettant de s'assurer que l'on a bien de l'utf-8 passe désormais dans la classe TextUtils. D'autre part, la classe a été notablement modifié: 1) si on souhaite passer un nom de base de données, il faut le faire dans le constructeur (précédement, c'était dans la méthode connect, mais c'était trompeur car le code ne gére absolument pas la connexion à deux bases de données différentes sur le même objet) 2) le code essayait de faire du ref-counting sur le nombre de fois où on avait appellé la fonction de connexion, pour fermer quand on avait atteint le même nombre de déconnexion, mais ne faisait pas ca particulièrement bien 3) il y avait une auto-connexion lors de l'execution des requetes si l'on était pas déja connecté, mais il n'y avait jamais d'auto-deconnexion (le code était buggé) 4) on essayait systématiquement de s'assurer que les enregistrements obtenus depuis la base de données étaient en utf8. A priori, c'est pour des considérations de migrations hérités de Mega-Poudlard, mais je crois que ce n'est pas necessaire pour ce blog, et ca ne l'est certainement pas dans le cas général...
author Franck Deroche <webmaster@defr.org>
date Tue, 29 Jan 2008 11:52:32 +0100
parents e4e880f786d4
children d0b737b2b398
comparison
equal deleted inserted replaced
52:829d6b0d3d0b 53:ec0c926a78a6
2 class DataAccess { 2 class DataAccess {
3 var $host; 3 var $host;
4 var $user; 4 var $user;
5 var $pass; 5 var $pass;
6 var $db; 6 var $db;
7 var $arResult;
8 var $query;
9 var $connOpen; 7 var $connOpen;
8 var $results;
9 var $queries;
10 var $_nbQueries; 10 var $_nbQueries;
11 11
12 var $infos; // Cache contenant les informations sur le visiteur 12 function DataAccess($host=DB_HOST, $user=DB_USER, $pass=DB_PASSWORD, $db=DB_NAME) {
13
14 function DataAccess($host=DB_HOST, $user=DB_USER, $pass=DB_PASSWORD) {
15 $this->host=$host; 13 $this->host=$host;
16 $this->user=$user; 14 $this->user=$user;
17 $this->pass=$pass; 15 $this->pass=$pass;
16 $this->db = $db;
17 $this->connOpen = 0;
18 $this->_nbQueries = 0; 18 $this->_nbQueries = 0;
19 $this->queries = array();
20 $this->results = array();
19 $this->Connect(); 21 $this->Connect();
20 } 22 }
21 23
22 function Connect($db=DB_NAME) { 24 function Connect() {
23 if($this->connOpen == 1) return; 25 if($this->connOpen == 0) {
24 $this->db=$db; 26 mysql_connect($this->host, $this->user, $this->pass);
25 $this->connOpen=1; 27 mysql_select_db($this->db);
26 mysql_connect($this->host, $this->user, $this->pass); 28 }
27 mysql_select_db($this->db); 29 $this->connOpen++;
28 } 30 }
29 31
30 function Query($query, $id=0) { 32 function Query($query, $id=0) {
31 $this->query=$query; 33 $this->_nbQueries++;
32 if($this->connOpen != 1) $this->Connect(); 34 $this->queries[$id]=$query;
33 $this->arResult[$id]=mysql_query($this->query); 35 $this->Connect();
34 if($this->connOpen != 1) $this->Close(); 36 $this->results[$id]=mysql_query($this->queries[$id]);
35 if(@$num_rows=mysql_num_rows($this->arResult[$id])) 37 $this->Close();
38 if(@$num_rows=mysql_num_rows($this->results[$id]))
36 return $num_rows; 39 return $num_rows;
37 else 40 return 0;
38 return 0;
39 } 41 }
40 42
41 function debugQuery($query, $id=0) { 43 function debugQuery($query, $id=0) {
42 $rv = $this->Query($query, $id); 44 $rv = $this->Query($query, $id);
43 if(mysql_errno() !== 0) 45 if(mysql_errno() !== 0)
44 echo("<span class='menu'>\n Query : {$query}<br />\n MySQL Answer : " . mysql_error() . "</span>"); 46 echo("<span class='menu'>\n Query : {$query}<br />\n MySQL Answer : " . mysql_error() . "</span>");
45 return $rv; 47 return $rv;
46 } 48 }
47 49
48 function GetRow($id=0) { 50 function GetRow($id=0) {
49 if(@$row=mysql_fetch_assoc($this->arResult[$id])) { 51 if(@$row=mysql_fetch_array($this->results[$id])) {
50 foreach($row as $key => $value)
51 $row_utf[$key]=$this->utf8_ensure($value);
52 return $row_utf;
53 }
54 return 0;
55 }
56
57 function GetRawRow($id=0) {
58 if(@$row=mysql_fetch_array($this->arResult[$id])) {
59 return $row; 52 return $row;
60 } 53 }
61 return 0; 54 return 0;
62 } 55 }
63 56
64 function Close() { 57 function Close() {
65 $this->connOpen=0; 58 $this->connOpen--;
66 mysql_close(); 59 if($this->connOpen == 0) {
60 mysql_close();
61 }
67 } 62 }
68 63
69 function getNbQueries() { 64 function getNbQueries() {
70 return $this->_nbQueries; 65 return $this->_nbQueries;
71 } 66 }
72 67
73 function formatDate($timestamp, $decallage=2, $pattern='d/m/Y H:i:s') { 68 function formatDate($timestamp, $decallage=2, $pattern='d/m/Y H:i:s') {
74 return gmdate($pattern, $timestamp + $decallage * 3600); 69 return gmdate($pattern, $timestamp + $decallage * 3600);
75 } 70 }
76
77 function seems_utf8($Str) {
78 for ($i=0; $i<strlen($Str)/10 || $i < 100; $i++) {
79 if (ord($Str[$i]) < 0x80) continue; # 0bbbbbbb
80 elseif ((ord($Str[$i]) & 0xE0) == 0xC0) $n=1; # 110bbbbb
81 elseif ((ord($Str[$i]) & 0xF0) == 0xE0) $n=2; # 1110bbbb
82 elseif ((ord($Str[$i]) & 0xF8) == 0xF0) $n=3; # 11110bbb
83 elseif ((ord($Str[$i]) & 0xFC) == 0xF8) $n=4; # 111110bb
84 elseif ((ord($Str[$i]) & 0xFE) == 0xFC) $n=5; # 1111110b
85 else return false; # Does not match any model
86 for ($j=0; $j<$n; $j++) { # n bytes matching 10bbbbbb follow ?
87 if ((++$i == strlen($Str)) || ((ord($Str[$i]) & 0xC0) != 0x80))
88 return false;
89 }
90 }
91 return true;
92 }
93
94 function utf8_ensure($Str) {
95 return $this->seems_utf8($Str)?$Str:utf8_encode($Str);
96 }
97
98 } 71 }
99 ?> 72 ?>