Blog geekesque... ou pas

Aller au contenu | Aller au menu | Aller à la recherche

05/10/2009

Envoyer un email html avec pièce jointe en PHP

C'est toujours un casse-tête pour envoyer un email avec des pièces jointes.

Cette classe est très simple d'utilisation et possède seulement les options basiques. Elle prépare le contenu du mail et utilise simplement la fonction mail() de php pour l'expédier. Le code ne sera quasiment pas détaillé, ci-dessous vous trouverez essentiellement l'explication de l'utilisation et l'accès aux sources.

Lire la suite...

06/09/2009

Les assertions et vérification de formulaire

Cette classe abstraite permet de vérifier certaines assertions, ou en d'autres termes de vérifier qu'une valeur répond à une condition.

Les vérifications présentées ici sont très simples mais permettent de traiter la plupart des conditions requises pour un formulaire. Voici le détail des fonctionnalités actuelles.

Lire la suite...

29/08/2009

Utilisation des singletons en PHP5

Un singleton est utilisé lorsque l'on a besoin d'une instance unique d'une classe, par exemple une connexion à une base de données.

Avec une petite astuce sur la création de votre classe, en utilisant un masque (aussi appelé pattern) de création, vous pouvez faire en sorte que l'appel d'une classe soit unique dans tout votre site.

Lire la suite...

07/08/2009

Fonction fputcsv en PHP4

Alors que la fonction fgetcsv existe en PHP4 et en PHP5, la fonction fputcsv n'existe qu'en PHP5, ce qui est fort dommage lorsqu'on veut travailler avec des fichiers d'exports ou bien lorsqu'on veut avoir un script utilisable sur la plupart des serveurs sans connaitre leur version de PHP.

Lire la suite...

05/06/2009

json_encode et json_decode en PHP4

Malgré ce que j'ai pu dire précédemment, il arrive parfois que je doive adapter mes scripts pour des versions anciennes de PHP. Je suis donc obligé d'avoir une petite série de fonctions de compatibilité, que je vais vous proposer au fil de mes développements.

Les fonction json (decode et encode) ne sont natives en PHP que depuis la version 5.2, mais heureusement il y a un moyen de les rendre accessibles depuis les versions antérieures. Pour cela, il faut télécharger le package JSON-PEAR et en extraire le fichier JSON.php.

Ensuite, ce petit script vous permet de créer (si nécessaire) les fonctions:

<?php
if ( !function_exists('json_decode') ){
	require_once (dirname(__FILE__).'/JSON.php');
    function json_decode($content, $assoc=false){
		if ( $assoc ){
			$json = new Services_JSON(SERVICES_JSON_LOOSE_TYPE);
		} else {
			$json = new Services_JSON;
		}
		return $json->decode($content);
	}
}
 
if ( !function_exists('json_encode') ){
	require_once (dirname(__FILE__).'/JSON.php');
	function json_encode($content){
		$json = new Services_JSON;
		return $json->encode($content);
    }
}
?>

Bien entendu, je pars du principe que JSON.php est dans le même répertoire que le fichier de fonctions, à vous d'adapter les chemins utilisés dans require_once

02/06/2009

Utilisation des APIs Google sans javascript

Google permet aux webmasters d'intégrer des résultats de recherche sur leur site en utilisant des fonctions Ajax, mais il peut être utile de récupérer les résultats autrement, par exemple pour les stocker en base.

Heureusement, Google fournit un moyen d'interroger son moteur de recherche directement (par une requète GET) qui renvoie un résultat en JSON[1]

Notes

[1] JSON (JavaScript Object Notation) est un format de données textuel qui permet de représenter de l'information structurée.

Lire la suite...

13/05/2009

Fonction str_split

Bien que je développe essentiellement en PHP 5, il m'arrive parfois d'avoir à travailler sur des hébergements qui sont encore en PHP 4, ce qui est parfois handicapant car des fonctions manquent.

Récemment, je me suis servi dans un script de la fonction str_split() qui permet de transformer une chaîne de caractères en un tableau. Bien entendu, je ne suis pas le seul à avoir fait cela, il y a d'autres versions sur la page officielle.

array str_split ( string string [, int split_length] ) : Convertit une chaîne de caractères en tableau. Si le paramètre optionnel split_length est spécifié, le tableau retourné sera découpé en sous-parties, chacune de taille split_length, sinon, chaque sous-partie aura la taille d'un caractère.

Cette fonction retourne FALSE si split_length est inférieur à 1. Si la longueur de split_length est supérieure à celle de string, la chaîne entière est retournée dans le premier (et seul) élément du tableau.

Fonction

<?php
if (!function_exists('str_split')) {
   /**
    * Convertit une chaine en tableau
    * Retourne false si $length est inférieur à 1, sinon un tableau
    * @param string $string Chaine à convertir
    * @param integer $length Longueur des sous-ensembles
    * @return mixed
    */
   function str_split($string, $length=1) {
      if (intval($length)<1) return false;
      if (strlen($string)<=$length) return array($string);
      $parts = array();
      while(strlen($string)>0) {
         $parts[] = substr($string, 0, $length);
         $string = substr($string, $length);
      }
      return $parts;
   }
}
?>

Utilisation

$string = 'Salut Dave';
$test = str_split($string);
print_r($test);
$test2 = str_split($string, 3);
print_r($test2);

Cet exemple va afficher:

Array (
    [0] => S
    [1] => a
    [2] => l
    [3] => u
    [4] => t
    [5] =>
    [6] => D
    [7] => a
    [8] => v
    [9] => e
)
Array(
   [0] => Sal
   [1] => ut 
   [2] => Dav
   [3] => e
)

15/04/2009

Bug avec xml_parse_into_struct()

J'ai eu la surprise de constater qu'un système qui utilisait xml_parse_into_struct() et fonctionnait très bien sur la plupart des serveurs me faisait perdre l'entité &amp; sur un autre serveur.

Après de longues recherches, il s'avère que c'est un bug qui existait dans libxlm en 2004 et qui a décidé de revenir dans la version 2.6.32. La solution est donc de prendre une autre version de libxml, soit inférieure (toute version 2.6 hormis la 2.6.32) ou bien de passer en 2.7.3 ou supérieure.

Les serveurs sous debian ne sont pas impactés, un correctif faisant parti des mises à jour.

25/03/2009

Cryptage réversible de données

En PHP, il existe des méthodes de cryptage des données (MD5, SHA1, ...) mais elles ne sont pas réversibles. Le seul moyen est d'utiliser mcrypt, mais c'est un module complémentaire qui n'est pas souvent installé sur les serveurs standard.

Si vous voulez enregistrer des données cryptées et pouvoir les retrouver à l'aide d'une clé, il vous faut créer un système de sécurité, ce que fait la classe RevCrypt.

Lire la suite...

11/03/2009

Comparaison de date avec mktime

Ceci est un problème rencontré très souvent: vouloir comparer deux dates avec la fonction mktime(). On ne pense jamais au souci des heures d'été et d"hiver et on a tendance à faire:

<?php
$fdate = '27/08/2009';
list($d,$m,$y) = explode('/', $fdate);
$first = mktime(0,0,0,$m,$d,$y);
 
$ldate = date('d/m/Y')
list($ld,$lm,$ly) = explode('/', $ldate);
$last = mktime(0,0,0,$lm,$ld,$ly);
 
if ($first ==$last) {
   echo "C'est le même jour";
}
?>

Ceci marche très bien tant que l'on compare des dates comprises dans le même DST (Daylight Saving Time), c'est à dire si elles sont toutes les deux en heure d'hiver ou d'été. Sinon, on peut avoir un décalage de 600s entre les deux et les dates ne seront pas égales.

Il y a donc trois solutions, de la plus mauvaise à la meilleure (mais ce n'est que mon opinion):

Comparer les chaînes "date"

Si l'on vérifie que les deux dates formatées de la même manière sont égales, il y a de fortes chances pour que le résultat soit juste. Le seul risque est que la comparaison intervienne dans la période de changement. La vérification serait alors:

if (date('Ymd', $first) == date('Ymd', $last) {

Un autre risque est que vous ne savez pas à quel heure le DST est activé, par exemple les systèmes Solaris l'active à 0h30 alors que les autres systèmes *nix l'activent "à la bonne heure".

Forcer le DST

On oublie trop souvent que mktime peut prendre un septième paramêtre qui est le forçage de l'activation ou la désactivation du DST.

$first = mktime(0,0,0,$m,$d,$y,0);

Il faut donc que les deux mktime() aient le même forçage,

Choisir la bonne heure

Plutôt que de prendre des risques, comparez les dates à midi et non pas minuit.C'est le moyen le plus simple de vous assurer que vous n'êtes pas en plein changement d'horaire.

$first = mktime(12,0,0,$m,$d,$y);

- page 2 de 3 -