PHP

Scripts, astuces,...

Fil des billets - Fil des commentaires

jeudi 10 février 2011

Mettre à jour les traductions d'un module drupal

Lorsqu'on développe un module drupal, les traductions ajoutées au fur et à mesure ne sont pas prises en compte automatiquement. drupal ne prend en compte les traductions d'un module que lors de l'installation de celui-là. En cours de développement cela peut rapidement devenir pénible (pour rester poli !) de devoir installer/déinstaller le module à chaque mise à jour...

Lire la suite...

samedi 26 juin 2010

Pourquoi faut-il bannir l'arobase de tout code PHP ?

Nombreux sont les développeurs (débutants ou non) qui utilisent l'arobase (@) pour masquer les erreurs. C'est un peu cacher la misère et c'est surtout un énorme problème lorsqu'il s'agît de trouver un bug dans un code où fleurissent les arobases.

Lire la suite...

vendredi 17 avril 2009

symfony : hydrater un objet à la main

En utilisant symfony, on ne fait plus réellement de sql du fait de la couche d'abstraction ORM (Propel ou Doctrine). On ne travaille qu'avec des objets. Cela facilite grandement la vie et contribue pour une grande part à la rapidité de développement. Mais cela ne répond pas toujours à tous les besoins...

Lire la suite...

Dimanche 16 septembre 2007

Envoyer des mails avec php

Quoi de plus simple que d'envoyer des mails avec php avec la fonction mail ! Les choses se compliquent légèrement si on n'a pas de serveur de mail ! Et c'est peu de le dire. Evidemment on peut se lancer dans l'installation d'un serveur de mail (sendmail ou postfix par exemple) mais ce n'est pas à la portée de monsieur tout le monde si on ne veut pas servir de relais de spam! Une solution simple: nullmailer

Lire la suite...

Lundi 2 octobre 2006

Mettre fin à une authentification http

Le but du jeu est de mettre fin à une authentificaiton http faite avec le mécanisme des fichiers .htaccess

Lire la suite...

Dimanche 28 mai 2006

Qu'est-ce qu'un singleton ?

Le singleton est un modèle de conception (design pattern pour les grands bretons). En clair c'est une façon éprouvée de résoudre un problème. Avec le sinleton on cherche à n'avoir qu'une seule instance d'un même objet.

Lire la suite...

vendredi 26 mai 2006

Faut-il utiliser $_REQUEST ?

Depuis que je suis tout petit, j'utilise $_GET pour les données provenant de l'url et $_POST pour celles provenant de mes formulaires (utilisant la méthode "post"!).

En lisant divers articles, je me demande si je ne prends pas un peu la tête et si je ne devrais pas utiliser $_REQUEST quelle que soit la provenance des données. Peu importe la provenance, de toute façon il faut filtrer, vérifier, contrôler la cohérence de ces données.

Lire la suite...

samedi 6 mai 2006

Ne pas réinventer la roue.

On répète souvent que lorsqu'on fait un script il ne faut pas réinventer la roue et utiliser au maximum les fonctions natives du langage. Cela a de multiples avantages: c'est optimisé, sans bug,... Mais on n'imagine pas toujours lorsqu'on est débutant à quel point cet adage doit être pris au sérieux!

Lire la suite...

mardi 14 mars 2006

Quel est mon mot de passe ?

Dans une interface d'administration qui se respecte, on doit pouvoir à un moment créer des comptes. Il est souvent agréable de se voir proposer un mot de passe aléatoire. En général, je n'utilise pas un mot de passe complétement alétaoire: je supprime les caractères ambigus tels que 0, 1, i, j, l, m, n, o, u, v,I,O. Le code peut ressembler à ça. La fonction attend en paramètre la longueur du mot de passe à générer. Cette fonction n'a rien d'extraordinaire mais elle ne fait que ce qu'on lui demande mais elle le fait bien!

<?php
function generate_password($size) {
  
$listeChar '23456789abcdefghkpqrstwxyzABCDEFGHKJLMNPQRSTUVWXYZ'
  
$max strlen($listeChar)-1;

  
$key '';
  for (
$i=0;$i<$size;$i++) {
    
$key .= $listeChar[mt_rand(0,$max)];
  }
  return 
$key;
}
?>

Petite mise à jour. J'avais oublié de préciser une chose: pourquoi je supprime certains caractères ? Je supprime les caractères 0, 1, i, j, l, m, n, o, u, v,I,O car ils sont potentiellement ambigus. Le "i" peut être confondu avec le "l", le "0" avec le "O". Même dans la phrase précédente on ne sait pas au premier coup d'oeil si j'ai écris "le zéro et la lettre O" ou "la lettre O et le zéro. L'intérêt est de générer des mots de manière automatique en enlevant les ambiguïtés visuelles.

mardi 21 février 2006

Développement piloté par les tests.

Il ne semble pas évident au premier abord de faire des tests du code que l'on écrit. En général, on se borne à vérifier qu'il n'y a pas d'erreurs de syntaxe. On vérifie que les 3 ou 4 pages que l'on vient de modifier fonctionnent toujours de la même façon. Cette manière de fonctionner atteint rapidement ses limites au fur et à mesure que l'application grossie. Comment se rappeler que le code écrit aujourd'hui n'aura pas d'impact sur le code écrit il y a 6 mois ? Sans tests exhaustifs, c'est tout simplement impossible.

Lire la suite...

Dimanche 15 janvier 2006

A la découverte de php5

La version 5 de PHP est sortie depuis plus d'un an, le 13 juillet 2004 exactement. Je ne parlerais pas des nombreux changements tellement c'est énorme. Mais de quoi je vais parler, alors ? De ma déouverte de php5.

Je me suis mis à php5 voici quelques mois. L'installation sur HP-UX n'a pas été une mince affaire mais ça fonctionne!

J'avais pris comme habitude avec php4 de développer sur le serveur de test avec le niveau d'erreur E_ALL (2047). Avec php5, je suis passé à E_ALL & E_STRICT, soit 4095. La plupart des scripts qui se disent compatibles php5 ne passent pas avec ce niveau d'erreurs. Un exemple flagrant: on ne peut plus déclarer un attribut de classe (une variable) de la manière suivante:


Il faut utiliser un des mots-clés de portée, à savoir public, protected ou private.

mercredi 21 décembre 2005

Précédence des opérateurs

Il existe en PHP deux types de "ET" (and et &&) et de "OU" (or et ||). La raison est qu'ils ont des priorités différentes. Le and et le or ont une priorité plus faible que l'opérateur = alors que le && et le || ont une priorité plus élevée que le =.

Par exemple si on a le code suivant:

<?php
$choix1 = "un";
$choix2 = "deux";
$choix3 = "trois";

$val1 = $choix1 || $choix2 || $choix3; 
$val2 = $choix1 or $choix2 or $choix3; 
?>

$val1 sera égal à true et $val2 sera égal à "un".

Pour régler le problème, soit on met tout le temps des parenthèses, soit on n'utilise les opérateurs && et ||.

vendredi 22 juillet 2005

Afficher une arborescence avec menu et sous-menu.

On est souvent confronté à ce type de problème: afficher sous forme d'arbre (liste ul/li par exemple) un menu ou un forum. On récupère les informations d'une base de données où chaque enregistrement comprend les champs suivants (au minimum): id, label, parent. La requête de sélection est toute simple: select id, nom, parent from table.

Imaginons que l'on est récupéré ces enregistrements là:

<?php
$tab
[1] = array('label'=>'menu1','parent'=>0);
$tab[2] = array('label'=>'menu1.1','parent'=>1);
$tab[3] = array('label'=>'menu1.1.1','parent'=>2);
$tab[4] = array('label'=>'menu1.1.2','parent'=>2);
$tab[5] = array('label'=>'menu1.2','parent'=>1);
$tab[6] = array('label'=>'menu2','parent'=>0);
$tab[7] = array('label'=>'menu3','parent'=>0);
$tab[8] = array('label'=>'menu3.1','parent'=>7);
$tab[9] = array('label'=>'menu3.2','parent'=>7);
$tab[10] = array('label'=>'menu3.3','parent'=>7);
?>

On veut obtenir ça:

  • menu1
    • menu1.1
      • menu1.1.1
      • menu1.1.2
    • menu1.2
  • menu2
  • menu3
    • menu3.1
    • menu3.2
    • menu3.3

Et le code PHP correspondant peut ressembler à çà:

<?php
function addTree(&$Tree,$feuille,$id) {
   global
$tab;

$Tree[$feuille['label']]['__LABEL'] = $feuille['label'];   
   foreach (
$tab as $cle => $element) {
      if (
$element['parent']==$id) {
         
addTree($Tree[$feuille['label']],$element,$cle);
      }
   }
}

$Tree = array();
foreach (
$tab as $cle => $feuille) {
  if (
$feuille['parent']==0) {
    
addTree($Tree,$feuille,$cle);
  }
}
?>

Cette petite fonction récurssive peut sembler anodine mais elle fait tout le boulot et elle le fait bien.