Transformer un tableau associatif en attributs HTML en une ligne

Transformer un tableau associatif en attributs HTML en une ligne

Personnellement, j’ai pas de meilleure façon! et vous ?

$attributes = array(
    'href' => 'http://www.gezere.com/',
    'title' => 'Gezere Solutions Web',
    'class' => 'the-super-strategy-development-and-marketing-company'
);
 
echo '<a ' . str_replace( array( '{"', '"}', '":"', '","', '\/' ), array( '', '"', '="', '" ', '/' ), json_encode( $attributes ) ) . '>The best compagny !</a>';

Merci pour vos trucs !

Rotation matricielle en PHP

Voici une classe qui permet la rotation matricielle simple en PHP.

class Matrix {
    function rotateClockwise90( $matrix ) {
        $newMatrix = array();
 
        foreach( $matrix as $line ) {
            foreach( $line as $k => $v ) {
                if( !isset( $newMatrix[ $k ] ) ) {
                    $newMatrix[ $k ] = array();
                }
                array_unshift( $newMatrix[ $k ], $v );
            }
 
        }
        return $newMatrix;
    }
 
    function rotateClockwise180( $matrix ) {
        return $this->rotateClockwise90( $this->rotateClockwise90( $matrix ) );
    }
 
    function rotateClockwise270( $matrix ) {
        return $this->rotateClockwise180( $this->rotateClockwise90( $matrix ) );
    }
}

Un exemple d’utilisation:

function displayMatrix( $matrix ) {
    foreach( $matrix as $line ) {
        echo implode( ',', $line ) . PHP_EOL;
    }
}
 
$matrice = array(
    array( 'A','B','C' ),
    array( 'D','E','F' ),
    array( 'G','H','I' ),
    array( 'J','K','L' )
);
 
displayMatrix( $matrice );
echo PHP_EOL;
 
$matrix = new Matrix();
$matrice = $matrix->rotateClockwise90( $matrice );
 
displayMatrix( $matrice );

Résultat avant la rotation:

A,B,C
D,E,F
G,H,I
J,K,L

Résultat après la rotation:

J,G,D,A
K,H,E,B
L,I,F,C

Maintenant, vous me direz: « Qu’est-ce que je peux bien faire avec ça ? »… à suivre.

PDO ou ADOdb5 en 2012 ?

Cette article s’inspire de l’article de Tony Landis. Dans un nouveau projet PHP est-ce que vous privilégiez l’utilisation de PDO ou d’ADOdb5 ? Personnellement, je croyais qu’ADOdb était mort et enterré. Mais en me rendant sur le site du projet, j’ai pu constater que ce n’était pas du tout le cas et qu’il y avait une version récente du projet. Il est intéressant de constater que la plus récente version à été réécrite en PHP 5 et supporte un plus grand nombre de pilote que PDO. Évidemment, si on utilise une seule source de données, il n’y a aucun bénéfice à en tirer.

Mon expérience

Bon, personnellement, j’avais développé une mini couche d’abstraction par dessus les fonctions natives de MySQL en prévision de pouvoir l’étendre facilement à d’autres pilotes un jour, mais après 8 ans de développement, je peux dire que c’était inutile. L’ajout de PDO à mon cadre de développement (framework) m’apporterait plusieurs avantages. Premièrement, cela me permettrait de me débarrasser de la maintenance de cette partie de code et des lacunes associées. Deuxièmement, les performances de PDO semblent surpasser celles des fonctions natives de MySQL. Enfin, cela me permettrait de pouvoir utiliser enfin les transactions ainsi que les requêtes SQL préparées, fonctionnalités qui n’étaient pas présentes dans mon cadre de développement. C’est le cas classique quoi ! Qui n’a pas réinventé la roue ? Il me resterait donc par la suite à me débarrasser de mon cadre de développement personnel. 🙂

Application existante

Je dois continuer à faire évoluer une application de 8 ans d’âge dont l’auteur originel avait fait le choix d’utiliser ADOdb. À l’époque PDO n’existait pas. Serait-il plus intéressant de remplacer le vieux ADOdb par PDO ou bien par ADOdb5 ? En terme de performance, je pense que PDO doit être supérieur puisque natif au langage alors qu’ADOdb5 est une surcouche écrite en PHP. Par contre, il ne faut pas négliger le temps requis pour adapter le code à PDO. Pour cette raison, je crois qu’il serait plus rapide et aisé de migrer vers ADOdb5 dans une première étape.

Données utilisées

Afin de s’amuser un peu, j’ai profilé PDO versus ADOdb5 juste pour avoir une idée de la différence de performance. J’ai utilisé les données de la base de données d’adresses IP relatives aux pays. Notre version en place n’était pas la plus récente à ce jour et elle contenait 151532 enregistrements.

Code utilisé

Code utilisé pour profiler PDO.

$db = new PDO( 'mysql:dbname=iptocountry;host=127.0.0.1', 'root', '****' );
$start = microtime( true );
$rs = $db->query( 'select * from iptocountry' )->fetchAll(PDO::FETCH_ASSOC);
foreach($rs as $r) {}
$end = microtime( true );
echo 'RESULTS PDO: ' . ( $end - $start ) . PHP_EOL;

Code utilisé pour profiler ADOdb5.

require_once( 'adodb5/adodb.inc.php' );
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
$db = NewADOConnection( 'mysql://root:****@127.0.0.1/iptocountry' );
$start = microtime( true );
$rs = $db->Execute( 'select * from iptocountry' );
foreach($rs as $r) {}
$end = microtime( true );
echo 'RESULTS ADO: ' . ( $end - $start ) . PHP_EOL;

Résultats du profilage

  PDO ADOdb5
1 0.55663919448853 1.273540019989
2 0.56437802314758 1.2905249595642
3 0.56191086769104 1.2566349506378
4 0.56436491012573 1.2649390697479
5 0.55612802505493 1.2778210639954
6 0.54797792434692 1.2488679885864
7 0.55668902397156 1.2327320575714
8 0.5615439414978 1.2574291229248
9 0.55743288993835 1.2485709190369
10 0.56768417358398 1.2800159454346
MOYENNE 0.5594748974 1.2631076097

On peu donc affirmer que PDO est environ 2.2 fois plus rapide que ADOdb5. Par contre, pour les besoins actuels, je dois considérer le temps requis pour faire les changements nécessaires à l’application pour supporter PDO versus ADOdb5. J’irai donc tout de même avec ADOdb5.

Qu’elle est votre expérience avec ces deux outils ? Avez-vous trouvé mieux ?

Nouveautés de PHP 5.4

Voici une liste non exaustive et bien simple des nouveautés de PHP 5.4. Pour plus de détails, je vous invite à visiter les sites en référence et à googler.

NOUVEAUTÉS

Les traits

Les Traits constituent une mise en oeuvre de l’héritage multiple tel que présent dans le langage Java. Concrètement, ce sont des bouts de code, regroupés en fonctions et dans une nouvelle structure qu’on appelle « trait ». Ces traits peuvent être utilisés par plusieurs classes et ce horizontalement par opposition à l’héritage simple qui est plutôt vertical. L’auteur original des traits, Stefan Marr, mentionne que les traits ne sont rien d’autre que des copier-coller automatiquement gérés par le compilateur. Les fonctionnalités communes peuvent ainsi être regroupées dans une définition de traits (mot réservé trait) et incluses dans une classe avec le mot réservé use. La particularité réside donc dans le fait qu’une classe peut utiliser plusieurs traits et ce en plus de l’héritage simple.

Amélioration des tableaux

La notation des tableaux a été améliorée par l’ajout de la syntaxe à crochet du style json, mais l’adoption complète de la notation json, bien que discutée, n’a pas été retenue.

Serveur HTTP intégré

Un tout nouveau serveur HTTP a été intégré afin de faciliter les tests et le développement sur un environnement local, évitant ainsi les AMPs de ce monde. Cette option est absolument à éviter pour les serveurs en production. Ceci est probablement la fonctionnalité que j’ai le plus hâte de tester. Si ça peut aider à rendre plus rapide la mise en place d’un environnement de développement local sur plusieurs plateformes différentes et que c’est performant à souhait et fidèle à l’environnement de production, alors je suis prenneur.

Dépréciations

  • L’option Magic Quotes est désormais disparue.
  • Certains espaces de nom ont été réservés afin d’éviter que les classes natives soit redéfinies.
  • Finalement l’affichage des erreurs E_STRICT sont incluses dans E_ALL. E_ALL affiche donc toutes les erreurs pour de vrai.

Fonctions anonymes

Les « Closures » ou fonctions anonymes sont désormais présentes mais avec une nouvelle façon de les définir via un tableau et de les appeler.

Gestionnaire de session extensible

Le gestionnaire de session peut être étendu afin de répondre aux moindres caprices de nos applications de plus en plus pointilleuses.

Progression du téléversement

Le mécanisme d’obtention du statut du téléversement qui avait été commencé en 5.3 est désormais intégré en natif. Nous pouvons donc obtenir l’information sur la progression tout au long du transfert.

Divers

  • Il est maintenant possible de désactiver le traitement des $_POST pour sauver un peu de traitement mais l’accès aux données peut toujours être fait via le stream input.
  • La notation binaire est disponible (Example: 0b10 pour 2).

Non inclu dans PHP 5.4

  • Le support d’UTF8 (unicode), nativement
  • foreach list()

Références:
https://wiki.php.net/rfc/builtinwebserver
http://www.phpclasses.org/blog/post/150-Top-10-PHP-54-features-to-vote.html
http://simas.posterous.com/new-to-php-54-traits
http://css.dzone.com/polls/what-new-feature-php-54

OWASP: 10 risques de sécurité des applications web les plus critiques

Voici un lien que tout développeur web devrait mettre dans ses favoris et relire régulièrement. Moi le premier.

L’OWASP, Open Web Application Security Project, dresse depuis quelques années la liste des 10 risques de sécurités les plus critiques des applications web (et services web). Il publie aussi un document qui explique de long en large la cause de chacun des trous de sécurité ainsi que la façon de l’éradiquer.

Plus de raison de laisser passer ces trous de sécurités. À nous de faire changer les éléments de cette liste.

Dites-nous ce que vous faites pour contrer ces trous de sécurités ?

VIM, LE « Halak » des éditeurs de code

Bonjour à tous. Plusieurs d’entre vous savez que je ne prêche que par VIM en tant qu’éditeur de code. VIM n’a rien, mais vraiment rien à envier aux autres éditeurs de code et même IDE. Je vous lance donc une panoplie de liens en vrac sur divers aspects de VIM.

Bonne lecture.

P.S. Si vous en avez d’autres, je suis prenneur.

Liens

Graphical vi-vim Cheat Sheet and Tutorial
http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html

Auteur de VIM Bram Moolenaar
http://www.moolenaar.net/

How to debug with VIM and XDebug on Linux
http://tech.blog.box.net/2007/06/20/how-to-debug-php-with-vim-and-xdebug-on-linux/

VIM tips wiki
http://vim.wikia.com/wiki/Vim_Tips_Wiki

VIM for PHP programmers (Andrei Zmievski)
http://zmievski.org/c/dl.php?file=talks/codeworks-2009/vim-for-php-programmers.pdf

Beginner’s guide VI Improved
http://newbiedoc.berlios.de/wiki/Beginner%27s_guide_to_Vi_Improved_%28Vim%29

VIM plugins you should know about (Parts 1-5)
http://www.catonmat.net/blog/vim-plugins-surround-vim/

VIM Scripts
http://www.vim.org/scripts/index.php

Plugins

phpDocumentor for VIM
http://www.vim.org/scripts/script.php?script_id=1355

DokuVimki
http://www.ohloh.net/p/dokuvimki

Tetris
http://www.vim.org/scripts/script.php?script_id=172

CVS/SVN/SVK/git/hg/bzr integration plugin
http://www.vim.org/scripts/script.php?script_id=90

Check for syntax errors when saving a file (php, ruby, tex …)
http://www.vim.org/scripts/script.php?script_id=1431

Automatic folding of PHP functions, classes,.. (also folds related PhpDoc)
http://www.vim.org/scripts/script.php?script_id=1623

PHP Syntax
http://www.vim.org/scripts/script.php?script_id=1571

Smarty syntax file
http://www.vim.org/scripts/script.php?script_id=1798

snippetsEmu : An attempt to emulate TextMate’s snippet expansion
http://www.vim.org/scripts/script.php?script_id=1318

extended % matching for HTML, LaTeX, and many other languages
http://www.vim.org/scripts/script.php?script_id=39

Surroud: Delete/change/add parentheses/quotes/XML-tags/much more with ease
http://www.vim.org/scripts/script.php?script_id=1697

VIM tag list
http://vim-taglist.sourceforge.net/feature.html

SuperTab continued. : Do all your insert-mode completion with Tab.
http://www.vim.org/scripts/script.php?script_id=1643

Ouf !
Est-ce que j’utilise tout ça ? Certainement pas ! Mes besoins sont plutôt modeste. Mais ça vous démontre quand même l’étendu de VIM. Et il y a bien plus.

Gestionnaires de bogues PHP

Je recherche depuis quelques jours des gestionnaires de bogues en PHP. J’aimerais que son interface soit à la fois simple et intéressante visuellement. Fonctionnalités de base et sans fioritures. KISS quoi !

Voici la liste que j’ai relevé et que je compte installer et tester.

Avez-vous d’autres suggestions ? Des commentaires à formuler sur votre utilisation de ceux ci ?

Générer un mot de passe aléatoire sécuritaire

Voici une solution simple et élégante pour générer des mots de passe aléatoires et sécuritaires en PHP. La fonction génère un mot de passe avec les caractéristiques suivantes:

  • Caractères en majuscules et en minuscules
  • Un caractère spécial
  • Supression des caractères semblables I (i majuscule), 1 (Un) et l (L en minuscule) (Suggéré par Antoine !)

/**
 * Generate a random secure password.
 *
 * @param integer $nbChar Password length. Default 8.
 *
 * @access public
 * @author Sylvain Lévesque
 * @return string
 */
function generatePass( integer $nbChar = 8 ) {
    if ( empty($nbChar) ) {
        $nbChar = 8;
    }   
 
    $characters = '023456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ#!$';
    $specials = '#!?$%&*';
 
    $firstPart = substr(str_shuffle($characters), 0, $nbChar - 1);
    $lastPart = substr(str_shuffle($specials), 0, 1);
 
    return str_shuffle($firstPart . $lastPart);
}

Donnez moi votre avis ?

N.B. Vous êtes libre d’utiliser ce bout de code comme bon vous semble.