dimanche, septembre 13, 2009

Les doubles itérations

Voici un exemple de code que je trouve souvent dans du code de projet open source ou projet que je reprends :

//
$rResult = mysql_query(
  "SELECT id, firstName, lastName ".
  "FROM user"
);
// Itération #1 
$aRecordSet =  array();
while($aRow = mysql_fetch_assoc($rResult)) {
  $aRecordSet[] = $aRow;
}

// Itération #2
foreach($aRecordSet as $aRow) {
  echo $aRow['firstNAme'];
  echo $aRow['lastNAme'];
}

Ce n'est qu'une figure de style, car souvent le concept objet est utilisé et les gens crée une méthode qui ressemble à $aAllRow = $oRecordset->fetch_allrow(); où l'itération #1 est encapsulé dans celle-çi donc c'est dans cette méthode que se retrouve la première itération. Et par la suite cette fonction est utilisée presque partout dans le projet.

Pour en revenir à l'exemple, dans ce code il y a une double itération pour afficher le résultat de la requête. Une pour la construction du tableau qui contient va contenir tous les enregistrements et une autre pour afficher les enregistrements de celui-ci.

Le problème est que la ressource $rResult pointe déjà sur un espace mémoire PHP qui contient soit le recordset en entier ou simplement une interface entre PHP et MySQL pour aller cherche les enregistrements un à la fois sur MySQL. Donc le fait de faire la première boucle pour construite un tableau revient à faire une copie des données du recordset dans une partie de la mémoire de PHP. Dans certains cas, nous avons même une double utilisation de la mémoire.

Résultat : Nous avons une perte de mémoire ainsi qu'une perte de cycle CPU.

Dans tous les cas, l'utilisation du recordset directement est beaucoup plus optimise que celui d'un array. Donc pour faire la même chose il serait préférable de faire l'opération de cette façon :

//
$rResult = mysql_query(
  "SELECT firstName, lastName FROM user"
);
$aRecordSet =  array();
while($aRow = mysql_fetch_assoc($rResult)) {
  echo $aRow['firstNAme'];
  echo $aRow['lastNAme'];
}

Ou en orienté objet (MySQLI) :

//
$oRecordset = $oDb->query(
  "SELECT firstName, lastName FROM user"
);
while($aRow = $oRecordset->fetch_assoc()) {
  echo $aRow['firstNAme'];
  echo $aRow['lastNAme'];
}

samedi, septembre 12, 2009

Google Analytics ne fonctionne pas

Depuis un mois, j'ai ajouté le "New tracking code" de Google Analytics sur un de mes sites web. Après un jour ou deux, je vais voir mes statistiques pour constater qu'aucune statistique n’a été enregistrée. J'ai vérifié la syntaxe de ma page, tout semblait correct, elle passait même les la validation de W3C http://validator.w3.org/.
Quelque jour plus tard, je m'aperçois que le statut de la vérification de la présence du code javascript n'était pas complété. Je complète et laisse encore aller quelques jours.
Plusieurs jours passe et je retourne vois les statistiques, toujours rien. Je retourne vérifier la structure de la page tout semble parfait. Une idée me vient, je modifie le catch(err) { } du code de Google comme suis :
//
try { var pageTracker = _gat._getTracker("UA-XXXXXXXXX-X");
pageTracker._trackPageview();
} catch(err) {alert(err);}
//
A l'ouverture du site je reçois un alert qui me donne une erreur "TypeError: g.substring is not a function" quelle partie de ma page web peut bien cause cette erreur ? Je commence donc à essayer d'isoler le problème en enlevant des parties de ma page web, le contenue, les autres script de la page j'ai toujours l'erreur. Finalement, j'enlève mon formulaire html.
<form name="domain" ...>
</form>
Une fois enlevée, l'erreur ne s'affiche plus.
La raison de ce comportement est probablement que le code javascript de Google Analytics crée un formulaire dynamiquement avec le nom "domain" pour l'envoi de ses statistiques. Donc il y avait un conflit.

Résolution du bogue

Pour corriger, il faut enlever la partie name="domain" du formulaire. Il faut évitez de nommer vos formulaires comme ceux Google. Ils devrait utiliser un nom un peu moins générique comme googledomain ou tout autre nom qui ressemble à un hachage.

samedi, août 29, 2009

Introduction

Bonjour à tous,

Mon nom est Yanik Lupien, je m'intéresse à la programmation depuis déjà de nombreuses années. Sur ce blogue, je vais vous parler de ma passion pour la programmation, je vais aussi vous parler de mes projets, des technologies que j'utilise ainsi que ceux que j'ai essayés et mis de coté, des problèmes que rencontré ainsi que leurs solutions.

Si vous voulez en savoir un peu plus, vous pouvez aller visiter mon site web personnel : http://yanik-lupien.com/ 

Bonne lecture !