De plus en plus de systèmes de raccourcissement d'URL existent, et le système est somme toute relativement simple à mettre en place. Il demande un peu de logique et l'utilisation d'un encodage en base 62: les 10 chiffres et les 26 lettres (minuscules et majuscules).
Tag - php
01/ 07/2010
Générer des clefs RSA en php
CrazyCat » 01/ 07/2010 11:28 » PHP
Voici une fonction très simple pour générer des clefs RSA.
Elle ne prend qu'un argument, la longueur en bits de la clé privée (512, 1024 ou 2048). Elle retourne un tableau contenant la clef privée, la clef publique et un message d'erreur.
<?php /** * Generates RSA keys * @param integer $pkbits Private key bits * Specifies how many bits should be used to generate a private key * Must be 512, 1024 or 2048 * @return array Contains private key, public key and error message */ public function generateRsa($pkbits=512) { $rsaKey = array('private' => '', 'public' => '', 'error' => ''); $pkbits = intval($pkbits); if ($pkbits != 512 && $pkbits != 1024 && $pkbits != 2048) { $rsaKey['error'] = 'Private key bits must be 512, 1024 or 2048'; return $rsaKey; } $res = openssl_pkey_new(array('private_key_bits' => $pkbits)); // Get private key openssl_pkey_export($res, $privkey); // Get public key $pubkey = openssl_pkey_get_details($res); $rsaKey['private'] = $privkey; $rsaKey['public'] = $pubkey['key']; return $rsaKey; } ?>
27/ 05/2010
Fonction glob récursive
CrazyCat » 27/ 05/2010 10:45 » PHP
La fonction glob est utilisée dans de nombreux langages, elle sert à lister tous les fichiers (et répertoires) qui vérifient un masque.
La petite fonction qui suit sert à rechercher tous les fichiers qui vérifient un masque dans une arborescence.
<?php /** * Recursive glob * @param string $pattern Masque à vérifier * @param string $path Répertoire initial * @param integer $flags Drapeaux * @return array list of files */ function rglob($pattern='*', $path='', $flags = 0) { $paths=glob($path.'*', GLOB_MARK|GLOB_ONLYDIR|GLOB_NOSORT); $files=glob($path.$pattern, $flags); foreach ($paths as $path) { $files=array_merge($files,rglob($pattern, $path, $flags)); } return $files; } ?>
Les drapeaux sont ceux utilisés par la fonction glob:
- GLOB_MARK : Ajoute un slash final à chaque dossier retourné
- GLOB_NOSORT : Retourne les fichiers tant l'ordre d'apparence (pas de tri)
- GLOB_NOCHECK : Retourne le masque de recherche si aucun fichier n'a été trouvé
- GLOB_NOESCAPE : Ne protège aucun métacaractère d'un antislash
- GLOB_BRACE : Remplace {a,b,c} par 'a', 'b' ou 'c'
- GLOB_ONLYDIR : Ne retourne que les dossiers qui vérifient le masque
- GLOB_ERR : Stop lors d'une erreur (comme des dossiers non lisibles), par défaut, les erreurs sont ignorées.
27/ 04/2010
Tests unitaires et couverture de code
CrazyCat » 27/ 04/2010 10:07 » PHP
Les tests unitaires sont au développeur ce que la prose est à M. Jourdain: ils en font sans le savoir. Malheureusement, ces tests ne sont pas souvent effectués de manière complète et approfondie, et le développeur ne s'intéresse pas au complément de ces tests: la couverture de code.
Heureusement, il existe des outils qui simplifient ce travail et le rendent plus cohérent. Je traiterai ici des procédures lorsqu'on développe en PHP, en m'appuyant sur PHPUnit.
25/ 03/2010
QuoteInto avec Zend_Db_Table_Abstract
CrazyCat » 25/ 03/2010 13:29 » PHP
Plus ça va et plus je suis obligé de modifier le Db_Table_Abstract, dans la lignée de lastInsertId() avec Zend_Db_Table_Abstract.
Il s'agit cette fois de pouvoir ajouter des paramêtres dans les fonctions telles que fetchAll() et fetchRow(), voici donc le code ajouté à applications/models/Db/Abstract.php:
Dans le répertoire applications/models/Db, création de la classe Default_Model_Db_Abstract qui étend la classe d'origine Zend_Db_Table_Abstract :
public function quoteInto($text) { $args = func_get_args(); array_shift($args); if (isset($args[0]) && is_array($args[0])) { $args = $args[0]; } foreach ($args as $arg) { $text = preg_replace('/\?{1}/', $this->_db->quote($arg), $text, 1); } return $text; }
On peut désormais, dans le mapper, utiliser:
$this->getDbTable()->fetchAll( $this->getDbTable()->quoteInto('requestId = ?', $requestId) );
ou
$this->getDbTable()->fetchRow( $this->getDbTable()->quoteInto('requestId = ?', $requestId) );
17/ 02/2010
lastInsertId() avec Zend_Db_Table_Abstract
CrazyCat » 17/ 02/2010 17:47 » PHP
En suivant le tutoriel Zend QuickStart, je me suis retrouvé confronté à un problème: aucun accès au dernier id créé.
C'est une lacune connue mais pas encore corrigée. Voici la méthode que j'ai utilisée pour y remédier:
Nouvel abstract
Dans le répertoire applications/models/Db, création de la classe Default_Model_Db_Abstract qui étend la classe d'origine Zend_Db_Table_Abstract :
<?php abstract class Default_Model_Db_Abstract extends Zend_Db_Table_Abstract { /** * Last insert id. * * @access private * @var int */ private $_iLastInsertId = 0; /** * returns last insert id. * * @access private * @return int */ private function getLastInsertId() { return $this->_iLastInsertId; } /** * Initialisation * * @access public * @return void */ public function init() { } /** * Override the initial insert function * * @access public * @param array $aData * @return mixed */ public function insert(array $aData) { $mReturn = parent::insert($aData); $this->setLastInsertId($this->getAdapter()->lastInsertId()); return $mReturn; } /** * Returns the last insertId * * @access public * @return int */ public function lastInsertId() { if (! $this->getLastInsertId()) { throw new Exception('Retrieving last insert ID is meaningless without inserting before.'); } return $this->getLastInsertId(); } /** * Sets the last insert ID * * @access private * @param int $iLastInsertId * @return Db_Table_Abstract */ private function setLastInsertId($iLastInsertId) { $this->_iLastInsertId = $iLastInsertId; return $this; } }
Modèles de tables
Les modèles contenus dans applications/models/DbTable/ sont ensuite de la forme:
<?php class Default_Model_DbTable_Users extends Default_Model_Db_Abstract { protected $_name = 'users'; }
Mapper
Au niveau du mapper (applications/models/UsersMapper.php), la fonction setDbTable() est modifiée ainsi:
public function setDbTable($dbTable) { if (is_string($dbTable)) { $dbTable = new $dbTable(); } if (!$dbTable instanceof Default_Model_Db_Abstract) { throw new Exception('Invalide table data gateway provided'); } $this->_dbTable = $dbTable; return $this; }
Avec ceci, partout dans le mapper on a accès à $this->getDbTable->lastInsertId(), comme c'était possible en passant par l'ancien adaptateur.
12/ 11/2009
Retrouver le type MIME
CrazyCat » 12/ 11/2009 15:40 » PHP
Lorsqu'on propose un téléchargement via une interface web, ou si on veut mettre des pièces jointes dans un mail, il faut avoir le "mime-type" (Multipurpose Internet Mail Extensions) du fichier. Une fonction PHP existe pour celà , c'est mime_content_type() malheureusement elle n'est pas toujours disponible.
Voici une petite astuce qui permet de la recréer:
<?php if (!function_exists(mime_content_type)) { // Nous sommes dans le cas où elle n'existe pas function mime_content_type($f) { $ext = strtolower(substr($f,strrpos($f, "."))); // On ne se base que sur l'extension du fichier switch($ext){ case ".gz": $mtype = "application/x-gzip"; break; case ".tgz": $mtype = "application/x-gzip"; break; case ".zip": $mtype = "application/zip"; break; case ".pdf": $mtype = "application/pdf"; break; case ".png": $mtype = "image/png"; break; case ".gif": $mtype = "image/gif"; break; case ".jpg": case "jpeg": $mtype = "image/jpeg"; break; // Notez le cas d'un même type avec différentes extensions case ".txt": $mtype = "text/plain"; break; case ".htm": case ".html": $mtype = "text/html"; break; default: $mtype = "application/octet-stream"; break; // Par défaut, c'est application/octet-stream } return $mtype; } } ?>
21/ 10/2009
Classe de recherche Google
CrazyCat » 21/ 10/2009 12:21 » PHP
Ainsi que je le disais dans ce billet, j'ai réalisé une classe pour exploiter l'API de recherche de Google sans utiliser AJAX. Elle permet de faire les recherches dans 7 catégories: web, images, vidéos, blogs, actualités, livres et cartes.
Vous trouverez sa mise en application sur cette page
10/ 10/2009
Géolocalisation par IP
CrazyCat » 10/ 10/2009 15:27 » PHP
Vous avez sûrement déjà remarqué que des sites vous proposaient des contenus à proximité de chez vous. Ceci est fait avec de la géolocalisation d'IP et tout le monde peut le faire simplement, avec plus ou moins d'approximation.
Voici un moyen simple et assez efficace pour celà .
05/ 10/2009
Envoyer un email html avec pièce jointe en PHP
CrazyCat » 05/ 10/2009 16:50 » 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.
« billets précédents - page 1 de 3