lastInsertId() avec Zend_Db_Table_Abstract

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.

Supprimer un compte Facebook

Très souvent, je vois sur divers forum la question "comment puis-je supprimer un compte Facebook ?".

En effet, si FB permet très facilement de désactiver son compte, il existe toujours et peut facilement être réactivé. Et tout ce que vous aviez mis dessus reste disponible.

Heureusement il est possible de supprimer son compte quand on connait le chemin:

Lire la suite

Find pour supprimer les vieux fichiers

Nous avions évoqué sur ce billet l'utilisation de find pour faire des opérations sur une arborescence.

Une autre utilisation pratique des filtres de find est de pouvoir faire une recherche en se basant sur la date de modification des fichiers, ce qui permet par exemple de supprimer les fichiers périmés.

Par exemple, pour supprimer les fichiers de plus de 60 jours:

find /home/vous/logs -type f -ctime +60 -exec rm -rf {} \;

Comment changer un mot de passe Mysql oublié

Copie du billet Comment changer un mot de passe Mysql oublié de Johann Denoyer

Ca peut arriver d'oublier le mot de passe root de mysql, ou reprendre en main un serveur d'un ancien administrateur ayant quitté l'entreprise un peut rapidement. Donc je vous présente ici comment changer le mot de passe root d'un serveur mysql.

Lire la suite

Référencer son site sur Google (et les autres moteurs)

Bien souvent sur les forums ou les newsgroups, on voit revenir la question "comment mettre mon site sur google ?"

Tout d'abord, il faut savoir que si Google est le moteur le plus utilisé, par les internautes ou d'autres moteurs, il en existe d'autres tel que Yahoo! ou bing. Et on y met pas son site, on le propose, ce qui peut un peu accélerer son indexation.

Nous allons voir comment essayer d'optimiser un peu le référencement du site, et les erreurs à éviter.

Lire la suite

Retrouver le type MIME

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;
   }
}
?>

Le gratuit meilleur que le plus cher

Mon PC étant parti d'une base assez ancienne qui n'a subit que des évolutions au fur et à mesure, il subsiste parfois des héritages dont j'aimerais me passer.

Par exemple, mon disque principal de 20Go qui à l'époque de windows 95 était partitionné en deux fois 10 Go, pour avoir le système d'un côté et les documents de l'autre. Les années ont passé, windows XP est arrivé, j'ai acheté des disques supplémentaires, mais j'ai toujours laissé mon système sur ce brave vieux Maxtor.

Il y a quelques temps de ça, j'ai voulu rendre à mon disque système toute sa taille, et j'ai fait un petit tour des logiciels de repartitionnement. J'ai jeté mon dévolu sur Partition Magic qui semblait être LE bijou dont j'avais besoin, la version d'évaluation (qui simule mais ne fait rien) m'ayant dit que tout était parfait. Et bien non, PM échouait, même lorsque je faisais bien comme il me disait de faire, en suivant ses conseils et ses prérogatives... J'ai pu redonner de l'espace à mon disque principal, mais il avait toujours une partition de 4Go dont je n'avais que faire.

Aujourd'hui, tout à fait par hasard, je suis tombé sur EASEUS Partition Master 4.0.1, qui en plus est gratuit dans sa version "Home Edition". Je lui ai programmé 3 opérations sensibles:

  • supprimer cette partition inutile
  • donner la taille maximale possible à la partition primaire
  • agrandir une partition qui ne prenait pas tout un disque

Le temps de boire un café et le freeware a tout bien fait, sans aucune perte.

Classe de recherche Google

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

Lire la suite

Recherche "à proximité"

Ceci est la suite logique du billet précédent et permet de faire une recherche de points géolocalisés dans un rayon autour d'un point donné.

L'explication fera intervenir quelques légères notions mathématiques et géographiques, mais uniquement pour la compréhension du fonctionnement.

Lire la suite

Géolocalisation par IP

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à.

Lire la suite

- page 1 de 5