changeset 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 829d6b0d3d0b
children d0b737b2b398
files admin.php includes/class.dataaccess.php includes/class.post.php includes/class.textutils.php
diffstat 4 files changed, 48 insertions(+), 54 deletions(-) [+]
line wrap: on
line diff
--- a/admin.php	Tue Jan 29 11:33:33 2008 +0100
+++ b/admin.php	Tue Jan 29 11:52:32 2008 +0100
@@ -138,7 +138,7 @@
 	$ar_Version[] = $versionAc;
 	$i++;
   }
-  $Titre=$Data->utf8_ensure($val['Titre']);
+  $Titre=TextUtils::EnsureUTF8($val['Titre']);
   echo("
   \t  <li>{$Titre}<span class='Admin'><a href='#id={$val['num_mess']}'>Editer</a>  --  <a href='#id={$val['num_mess']}'>Supprimer</a>  --  <a href='?id={$val['num_mess']}'>Gérer les commentaires</a></span></li>");
  }
--- a/includes/class.dataaccess.php	Tue Jan 29 11:33:33 2008 +0100
+++ b/includes/class.dataaccess.php	Tue Jan 29 11:52:32 2008 +0100
@@ -4,38 +4,40 @@
   var $user;
   var $pass;
   var $db;
-  var $arResult;
-  var $query;
   var $connOpen;
+  var $results;
+  var $queries;
   var $_nbQueries;
   
-  var $infos; // Cache contenant les informations sur le visiteur
-  
-  function DataAccess($host=DB_HOST, $user=DB_USER, $pass=DB_PASSWORD) {
+  function DataAccess($host=DB_HOST, $user=DB_USER, $pass=DB_PASSWORD, $db=DB_NAME) {
    $this->host=$host;
    $this->user=$user;
    $this->pass=$pass;
+   $this->db = $db;
+   $this->connOpen = 0;
    $this->_nbQueries = 0;
+   $this->queries = array();
+   $this->results = array();
    $this->Connect();
  }
  
-  function Connect($db=DB_NAME) {
-   if($this->connOpen == 1) return;
-   $this->db=$db;
-   $this->connOpen=1;
-   mysql_connect($this->host, $this->user, $this->pass);
-   mysql_select_db($this->db);
+  function Connect() {
+   if($this->connOpen == 0) {
+     mysql_connect($this->host, $this->user, $this->pass);
+     mysql_select_db($this->db);
+   }
+   $this->connOpen++;
   }
   
   function Query($query, $id=0) {
-   $this->query=$query;
-   if($this->connOpen != 1) $this->Connect();
-   $this->arResult[$id]=mysql_query($this->query);
-   if($this->connOpen != 1) $this->Close();
-   if(@$num_rows=mysql_num_rows($this->arResult[$id]))
+   $this->_nbQueries++;
+   $this->queries[$id]=$query;
+   $this->Connect();
+   $this->results[$id]=mysql_query($this->queries[$id]);
+   $this->Close();
+   if(@$num_rows=mysql_num_rows($this->results[$id]))
 	return $num_rows;
-   else
-	return 0;
+   return 0;
   }
   
   function debugQuery($query, $id=0) {
@@ -46,24 +48,17 @@
   }
   
   function GetRow($id=0) {
-   if(@$row=mysql_fetch_assoc($this->arResult[$id])) {
-    foreach($row as $key => $value)
-        $row_utf[$key]=$this->utf8_ensure($value);
-    return $row_utf;
-   }
-   return 0; 
-  }
-  
-  function GetRawRow($id=0) {
-   if(@$row=mysql_fetch_array($this->arResult[$id])) {
+   if(@$row=mysql_fetch_array($this->results[$id])) {
     return $row;
    }
    return 0;    
   }
   
   function Close() {
-   $this->connOpen=0;
-   mysql_close();
+   $this->connOpen--;
+   if($this->connOpen == 0) {
+    mysql_close();
+   }
   }
   
   function getNbQueries() {
@@ -73,27 +68,5 @@
   function formatDate($timestamp, $decallage=2, $pattern='d/m/Y H:i:s') {
    return gmdate($pattern, $timestamp + $decallage * 3600);
   }
-  
-  function seems_utf8($Str) {
-     for ($i=0; $i<strlen($Str)/10 || $i < 100; $i++) {
-	if (ord($Str[$i]) < 0x80) continue; # 0bbbbbbb
-	elseif ((ord($Str[$i]) & 0xE0) == 0xC0) $n=1; # 110bbbbb
-	elseif ((ord($Str[$i]) & 0xF0) == 0xE0) $n=2; # 1110bbbb
-	elseif ((ord($Str[$i]) & 0xF8) == 0xF0) $n=3; # 11110bbb
-	elseif ((ord($Str[$i]) & 0xFC) == 0xF8) $n=4; # 111110bb
-	elseif ((ord($Str[$i]) & 0xFE) == 0xFC) $n=5; # 1111110b
-	else return false; # Does not match any model
-	for ($j=0; $j<$n; $j++) { # n bytes matching 10bbbbbb follow ?
-		if ((++$i == strlen($Str)) || ((ord($Str[$i]) & 0xC0) != 0x80))
-		return false;
-	}
-     }
-     return true;
-  }
-  
-  function utf8_ensure($Str) {
-   return $this->seems_utf8($Str)?$Str:utf8_encode($Str);
-  }
-  
 }
 ?>
--- a/includes/class.post.php	Tue Jan 29 11:33:33 2008 +0100
+++ b/includes/class.post.php	Tue Jan 29 11:52:32 2008 +0100
@@ -19,7 +19,7 @@
                     array('<P>', '</P>'), 
                     array('<p>', '</p>'), 
                     $infos['Message']);
-    $Mess = Factory::getDB()->utf8_ensure($Mess);
+    $Mess = TextUtils::EnsureUTF8($Mess);
     $this->mess = $this->tpl->getDocumentFragment();
     $this->mess->appendXML($Mess);
     
--- a/includes/class.textutils.php	Tue Jan 29 11:33:33 2008 +0100
+++ b/includes/class.textutils.php	Tue Jan 29 11:52:32 2008 +0100
@@ -40,5 +40,26 @@
     public static function getMonthName($monthNumber) {
         return ucfirst(strftime('%B', strtotime('2007-' . $monthNumber . '-01')));
     }
+
+    public static function EnsureUTF8($string) {
+        return TextUtils::SeemsUTF8($string) ? $string : utf8_encode($string);
+    }
+
+    public static function SeemsUTF8($Str) {
+        for ($i=0; $i<strlen($Str)/10 || $i < 100; $i++) {
+            if (ord($Str[$i]) < 0x80) continue; # 0bbbbbbb
+            elseif ((ord($Str[$i]) & 0xE0) == 0xC0) $n=1; # 110bbbbb
+            elseif ((ord($Str[$i]) & 0xF0) == 0xE0) $n=2; # 1110bbbb
+            elseif ((ord($Str[$i]) & 0xF8) == 0xF0) $n=3; # 11110bbb
+            elseif ((ord($Str[$i]) & 0xFC) == 0xF8) $n=4; # 111110bb
+            elseif ((ord($Str[$i]) & 0xFE) == 0xFC) $n=5; # 1111110b
+            else return false; # Does not match any model
+            for ($j=0; $j<$n; $j++) { # n bytes matching 10bbbbbb follow ?
+                if ((++$i == strlen($Str)) || ((ord($Str[$i]) & 0xC0) != 0x80))
+                    return false;
+	        }
+        }
+        return true;
+    }
     }
 ?>